diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-20 17:30:14 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-20 17:30:14 +0900 |
| commit | 0455313a9bdbe93556a8fd31b7c011dd004a6f2b (patch) | |
| tree | e158a30c32ecec07d0b583ef2e64ff673e85670c | |
| parent | ca7228ad425706b81311e51eb7718f12bf7f4885 (diff) | |
| download | mruby-0455313a9bdbe93556a8fd31b7c011dd004a6f2b.tar.gz mruby-0455313a9bdbe93556a8fd31b7c011dd004a6f2b.zip | |
codegen.c: avoid constant folding `OP_LOADI16` across branch target.
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index aba7f66d0..ac611f422 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -627,15 +627,17 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep) 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); - /* constant folding */ - data0 = mrb_decode_insn(mrb_prev_pc(s, data0.addr)); - mrb_int n; - if (data0.a == dst && get_int_operand(s, &data0, &n)) { - if ((data.insn == OP_ADDI && !mrb_int_add_overflow(n, data.b, &n)) || - (data.insn == OP_SUBI && !mrb_int_sub_overflow(n, data.b, &n))) { - s->pc = addr_pc(s, data0.addr); - gen_int(s, dst, n); - return; + if (addr_pc(s, data0.addr) != s->lastlabel) { + /* constant folding */ + data0 = mrb_decode_insn(mrb_prev_pc(s, data0.addr)); + mrb_int n; + if (data0.a == dst && get_int_operand(s, &data0, &n)) { + if ((data.insn == OP_ADDI && !mrb_int_add_overflow(n, data.b, &n)) || + (data.insn == OP_SUBI && !mrb_int_sub_overflow(n, data.b, &n))) { + s->pc = addr_pc(s, data0.addr); + gen_int(s, dst, n); + return; + } } } } |
