Don't access dangling reference to reallocated IR.

This commit is contained in:
Mike Pall 2014-03-06 00:39:37 +01:00
parent e94150877d
commit 416abff90d

View File

@ -1246,16 +1246,18 @@ static void asm_phi_fixup(ASMState *as)
Reg r = rset_picktop(work); Reg r = rset_picktop(work);
IRRef lref = as->phireg[r]; IRRef lref = as->phireg[r];
IRIns *ir = IR(lref); IRIns *ir = IR(lref);
/* Left PHI gained a spill slot before the loop? */ if (irt_ismarked(ir->t)) {
if (irt_ismarked(ir->t) && ra_hasspill(ir->s)) { irt_clearmark(ir->t);
IRRef ren; /* Left PHI gained a spill slot before the loop? */
lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); if (ra_hasspill(ir->s)) {
ren = tref_ref(lj_ir_emit(as->J)); IRRef ren;
as->ir = as->T->ir; /* The IR may have been reallocated. */ lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno);
IR(ren)->r = (uint8_t)r; ren = tref_ref(lj_ir_emit(as->J));
IR(ren)->s = SPS_NONE; as->ir = as->T->ir; /* The IR may have been reallocated. */
IR(ren)->r = (uint8_t)r;
IR(ren)->s = SPS_NONE;
}
} }
irt_clearmark(ir->t); /* Always clear marker. */
rset_clear(work, r); rset_clear(work, r);
} }
} }