From: "wildmaples (Maple Ong)" Date: 2022-05-24T17:39:40+00:00 Subject: [ruby-core:108669] [Ruby master Bug#18801] Dead YARV instructions produced when `branchif` is used Issue #18801 has been reported by wildmaples (Maple Ong). ---------------------------------------- Bug #18801: Dead YARV instructions produced when `branchif` is used https://bugs.ruby-lang.org/issues/18801 * 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: #@: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 0011 pop 0012 putobject 2 0014 putobject 3 0016 opt_plus [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: #@: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 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: #@: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 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: