aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_asm.c20
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}