From 2bc63bb6affdb378c1698bd0f97bacb286a61a6f Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 19 Feb 2014 17:09:22 +0100 Subject: [PATCH] Prevent BASE register coalescing if parent uses IR_RETF. --- src/lj_asm_arm.h | 7 +++++-- src/lj_asm_mips.h | 5 +++-- src/lj_asm_ppc.h | 5 +++-- src/lj_asm_x86.h | 5 +++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 0ab3a567..72f205d9 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h @@ -493,6 +493,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. */ /* Need to force a spill on REF_BASE now to update the stack slot. */ emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); emit_setgl(as, base, jit_base); @@ -2102,7 +2103,8 @@ static void asm_head_root_base(ASMState *as) IRIns *ir; asm_head_lreg(as); ir = IR(REF_BASE); - if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); + if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) + ra_spill(as, ir); ra_destreg(as, ir, RID_BASE); } @@ -2112,7 +2114,8 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) IRIns *ir; asm_head_lreg(as); ir = IR(REF_BASE); - if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); + if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) + ra_spill(as, ir); if (ra_hasspill(irp->s)) { rset_clear(allow, ra_dest(as, ir, allow)); } else { diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index f5b0bab6..e5c67b53 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h @@ -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. */ diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index 57fd2513..e1a496a7 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h @@ -381,6 +381,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_guardcc(as, CC_NE); @@ -1901,7 +1902,7 @@ static void asm_head_root_base(ASMState *as) Reg r = ir->r; 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_mr(as, r, RID_BASE); @@ -1915,7 +1916,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) Reg r = ir->r; 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. */ diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 98a08d97..fda911e5 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@ -647,6 +647,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_guardcc(as, CC_NE); @@ -2481,7 +2482,7 @@ static void asm_head_root_base(ASMState *as) Reg r = ir->r; 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_rr(as, XO_MOV, r, RID_BASE); @@ -2495,7 +2496,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) Reg r = ir->r; 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. */