[#108552] [Ruby master Bug#18782] Race conditions in autoload when loading the same feature with multiple threads. — "ioquatix (Samuel Williams)" <noreply@...>
Issue #18782 has been reported by ioquatix (Samuel Williams).
11 messages
2022/05/14
[ruby-core:108696] [Ruby master Bug#18801] Dead YARV instructions produced when `branchif` is used
From:
"eightbitraptor (Matthew Valentine-House)" <noreply@...>
Date:
2022-05-25 12:20:17 UTC
List:
ruby-core #108696
Issue #18801 has been updated by eightbitraptor (Matthew Valentine-House).
My questions aside. I'm not sure this is a bug, and could probably be closed?
----------------------------------------
Bug #18801: Dead YARV instructions produced when `branchif` is used
https://bugs.ruby-lang.org/issues/18801#change-97741
* Author: wildmaples (Maple Ong)
* Status: Open
* Priority: Normal
* ruby -v: 3.1.0
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
# Description
It seems there are unused YARV instructions produced when the snippet contains a `branchif` instruction.
In the following example, the instructions numbers 0002 to 0004 won't ever be executed:
```
irb(main):003:0> puts RubyVM::InstructionSequence.compile("while 2+3; puts 'hi'; end").disasm
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,25)> (catch: FALSE)
0000 jump 12 ( 1)[Li]
0002 putnil
0003 pop
0004 jump 12
0006 putself
0007 putstring "hi"
0009 opt_send_without_block <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
0011 pop
0012 putobject 2
0014 putobject 3
0016 opt_plus <calldata!mid:+, argc:1, ARGS_SIMPLE>[CcCr]
0018 branchif 6
0020 putnil
0021 leave
```
Similarly in this example, 0006-0008 won't be executed.
```
irb(main):003:0> puts RubyVM::InstructionSequence.compile("x = 9; while x; puts 'hi'; end").disasm
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,30)> (catch: FALSE)
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] x@0
0000 putobject 9 ( 1)[Li]
0002 setlocal_WC_0 x@0
0004 jump 16
0006 putnil
0007 pop
0008 jump 16
0010 putself
0011 putstring "hi"
0013 opt_send_without_block <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
0015 pop
0016 getlocal_WC_0 x@0
0018 branchif 10
0020 putnil
0021 leave
```
Initially we thought those instructions (i.e. putnil, pop, jump) were used when the return value of the while-loop is needed.
```
irb(main):012:0> puts RubyVM::InstructionSequence.compile("x = while foo; 9; end").disasm
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,21)> (catch: FALSE)
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] x@0
0000 jump 4 ( 1)[Li]
0002 putnil
0003 pop
0004 putself
0005 opt_send_without_block <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0007 branchif 4
0009 putnil
0010 dup
0011 setlocal_WC_0 x@0
0013 leave
```
But it seems like some dead instructions (0002, 0003) in the example above still remains.
Are those instructions meant to be used for something else or is it a "bug" that it sticks around?
Perhaps it can be optimized away?
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>