|
@@ -394,6 +394,7 @@ static void asm_retf(ASMState *as, IRIns *ir)
|
|
|
int32_t delta = 1+bc_a(*((const BCIns *)pc - 1));
|
|
|
as->topslot -= (BCReg)delta;
|
|
|
if ((int32_t)as->topslot < 0) as->topslot = 0;
|
|
|
+ irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */
|
|
|
emit_setgl(as, base, jit_base);
|
|
|
emit_addptr(as, base, -8*delta);
|
|
|
asm_guard(as, MIPSI_BNE, RID_TMP,
|
|
@@ -1723,7 +1724,7 @@ static void asm_head_root_base(ASMState *as)
|
|
|
if (as->loopinv) as->mctop--;
|
|
|
if (ra_hasreg(r)) {
|
|
|
ra_free(as, r);
|
|
|
- if (rset_test(as->modset, r))
|
|
|
+ if (rset_test(as->modset, r) || irt_ismarked(ir->t))
|
|
|
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
|
|
|
if (r != RID_BASE)
|
|
|
emit_move(as, r, RID_BASE);
|
|
@@ -1738,7 +1739,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow)
|
|
|
if (as->loopinv) as->mctop--;
|
|
|
if (ra_hasreg(r)) {
|
|
|
ra_free(as, r);
|
|
|
- if (rset_test(as->modset, r))
|
|
|
+ if (rset_test(as->modset, r) || irt_ismarked(ir->t))
|
|
|
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
|
|
|
if (irp->r == r) {
|
|
|
rset_clear(allow, r); /* Mark same BASE register as coalesced. */
|