From d329d9af79f9fc21f3659d2dd775a78f4aea396e Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 20 May 2025 18:26:30 +0900 Subject: [PATCH] mruby-compiler (gen_move): avoid optimization of ADDI/SUBI ADDI/SUBI may fall back to method call that may clear block argument place holder, which may be a live register. So we cannot directly call ADDI/SUBI over local variables. --- mrbgems/mruby-compiler/core/codegen.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 0b68200a6..842214a50 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -663,8 +663,7 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep) if (addr_pc(s, data.addr) == s->lastlabel || data.a != src || data.a < s->nlocals) goto normal; else { struct mrb_insn_data data0 = mrb_decode_insn(mrb_prev_pc(s, data.addr)); - if (data0.insn != OP_MOVE || data0.a != data.a || data0.b != dst) goto normal; - s->pc = addr_pc(s, data0.addr); + if (data0.insn != OP_MOVE || data0.a != data.a || data0.b != dst) break; if (addr_pc(s, data0.addr) != s->lastlabel) { /* constant folding */ data0 = mrb_decode_insn(mrb_prev_pc(s, data0.addr)); @@ -679,13 +678,12 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep) } } } - genop_2(s, data.insn, dst, data.b); - return; + break; default: break; } } - normal: + genop_2(s, OP_MOVE, dst, src); return; }