summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-09-20 17:30:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-20 17:30:14 +0900
commit0455313a9bdbe93556a8fd31b7c011dd004a6f2b (patch)
treee158a30c32ecec07d0b583ef2e64ff673e85670c
parentca7228ad425706b81311e51eb7718f12bf7f4885 (diff)
downloadmruby-0455313a9bdbe93556a8fd31b7c011dd004a6f2b.tar.gz
mruby-0455313a9bdbe93556a8fd31b7c011dd004a6f2b.zip
codegen.c: avoid constant folding `OP_LOADI16` across branch target.
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c20
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;
+ }
}
}
}