summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-compiler/core')
-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;
+ }
}
}
}