diff options
-rw-r--r-- | src/lj_asm.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 3f472d28..264649ae 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -1246,16 +1246,18 @@ static void asm_phi_fixup(ASMState *as) | |||
1246 | Reg r = rset_picktop(work); | 1246 | Reg r = rset_picktop(work); |
1247 | IRRef lref = as->phireg[r]; | 1247 | IRRef lref = as->phireg[r]; |
1248 | IRIns *ir = IR(lref); | 1248 | IRIns *ir = IR(lref); |
1249 | /* Left PHI gained a spill slot before the loop? */ | 1249 | if (irt_ismarked(ir->t)) { |
1250 | if (irt_ismarked(ir->t) && ra_hasspill(ir->s)) { | 1250 | irt_clearmark(ir->t); |
1251 | IRRef ren; | 1251 | /* Left PHI gained a spill slot before the loop? */ |
1252 | lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); | 1252 | if (ra_hasspill(ir->s)) { |
1253 | ren = tref_ref(lj_ir_emit(as->J)); | 1253 | IRRef ren; |
1254 | as->ir = as->T->ir; /* The IR may have been reallocated. */ | 1254 | lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); |
1255 | IR(ren)->r = (uint8_t)r; | 1255 | ren = tref_ref(lj_ir_emit(as->J)); |
1256 | IR(ren)->s = SPS_NONE; | 1256 | as->ir = as->T->ir; /* The IR may have been reallocated. */ |
1257 | IR(ren)->r = (uint8_t)r; | ||
1258 | IR(ren)->s = SPS_NONE; | ||
1259 | } | ||
1257 | } | 1260 | } |
1258 | irt_clearmark(ir->t); /* Always clear marker. */ | ||
1259 | rset_clear(work, r); | 1261 | rset_clear(work, r); |
1260 | } | 1262 | } |
1261 | } | 1263 | } |