Actions
Bug #18801
closedDead YARV instructions produced when `branchif` is used
Description
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?
Actions
Like0
Like0Like0Like0Like0Like0