ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: "jeremyevans0 (Jeremy Evans)" <noreply@ruby-lang.org>
To: ruby-core@ruby-lang.org
Subject: [ruby-core:105811] [Ruby master Bug#18269] trace_opt_not and trace_opt_regexpmatch2 insns are indistinguishable
Date: Tue, 26 Oct 2021 17:01:12 +0000 (UTC)	[thread overview]
Message-ID: <redmine.journal-94330.20211026170112.18@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-18269.20211026040811.18@ruby-lang.org

Issue #18269 has been updated by jeremyevans0 (Jeremy Evans).


I guess one option would be to have each of the optimized trace instructions use code specific to each instruction, so that the compiler would never merge the instructions.  @k0kubun, do you think that would make sense?  I'm not sure what code should be used in that case, though.

----------------------------------------
Bug #18269: trace_opt_not and trace_opt_regexpmatch2 insns are indistinguishable
https://bugs.ruby-lang.org/issues/18269#change-94330

* Author: mame (Yusuke Endoh)
* Status: Open
* Priority: Normal
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
On some platforms and compiler tool chain, `RubyVM::ISeq#to_a` shows a wrong instruction.

```
set_trace_func(Proc.new { })
set_trace_func(nil)

iseq = RubyVM::InstructionSequence.compile("/true/ =~ 'true'")
pp iseq.to_a.last
# expected:
#=> [1,
#    :RUBY_EVENT_LINE,
#    [:putobject, /true/],
#    [:putstring, "true"],
#    [:opt_regexpmatch2, {:mid=>:=~, :flag=>16, :orig_argc=>1}],
#    [:leave]]

# actual:
#=> [1,
#    :RUBY_EVENT_LINE,
#    [:putobject, /true/],
#    [:putstring, "true"],
#    [:opt_not, {:mid=>:=~, :flag=>16, :orig_argc=>1}],
#    [:leave]]
```

In this case, `opt_regexpmatch2` is a correct insn, but actually `opt_not` is printed.

This is caused by the fix of #14870. commit:48c8df9e0eb295af06d593ce37ce1933c0ee1d90 made almost all traced and optimized instructions (`trace_opt_*` insns) delegate to `opt_send_without_block`. Under some conditions, GCC seems to merge them to one code block because the bodies of `trace_opt_*` instructions are all identical. I'm unsure why, but in this case, only the pair of `trace_opt_not` and `trace_opt_regexpmatch2` is merged, and their addresses in direct-threaded code are now indistinguishable.

Fortunately, there seems to be no path to revert `trace_*` insn to its original (non-trace) version, except `RubyVM::ISeq#to_a`. (YJIT might be also affected because it uses `rb_vm_insn_addr2opcode`, but I'm unsure.)
So, AFAIK, this is not a significant problem, at the present time. However, this will bring trouble if we attempt to revert `trace_*` insn in future.

Some tests of MJIT use `RubyVM::ISeq#to_a` to check if the insn that the test targets is correctly tested. This leads to false positive warnings:

http://rubyci.s3.amazonaws.com/graviton2/ruby-master/log/20211026T020530Z.log.html.gz

```
[20397/21172] TestJIT#test_compile_insn_opt_regexpmatch2
/home/chkbuild/chkbuild/tmp/build/20211026T020530Z/ruby/test/ruby/test_jit.rb:599: warning: 'opt_regexpmatch2' insn is not included in the script. Actual insns are: putobject putstring opt_not leave

/home/chkbuild/chkbuild/tmp/build/20211026T020530Z/ruby/test/ruby/test_jit.rb:600: warning: 'opt_regexpmatch2' insn is not included in the script. Actual insns are: putstring putobject opt_not leave
 = 0.58 s
```

@jeremyevans0 @k0kubun Do you have any idea to fix this issue?



-- 
https://bugs.ruby-lang.org/

  reply	other threads:[~2021-10-26 17:01 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-26  4:08 [ruby-core:105800] [Ruby master Bug#18269] trace_opt_not and trace_opt_regexpmatch2 insns are indistinguishable mame (Yusuke Endoh)
2021-10-26 17:01 ` jeremyevans0 (Jeremy Evans) [this message]
2021-10-26 18:01 ` [ruby-core:105812] " k0kubun (Takashi Kokubun)
2021-11-12  7:44 ` [ruby-core:106034] " mame (Yusuke Endoh)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-94330.20211026170112.18@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).