From 52ca2cc8ba9dbab67cdf70a991a5b2b3ec933773 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 25 Aug 2012 18:38:30 +0200 Subject: [PATCH] ARM: Fix base register coalescing. --- src/lj_asm.c | 1 + src/lj_asm_arm.h | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 426730be..8deddd65 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -644,6 +644,7 @@ static void ra_destreg(ASMState *as, IRIns *ir, Reg r) { Reg dest = ra_dest(as, ir, RID2RSET(r)); if (dest != r) { + lua_assert(rset_test(as->freeset, r)); ra_modified(as, r); emit_movrr(as, ir, dest, r); } diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index e865850d..f307d6b8 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h @@ -2102,9 +2102,12 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) if (ra_hasspill(irp->s)) { rset_clear(allow, ra_dest(as, ir, allow)); } else { - lua_assert(ra_hasreg(irp->r)); - rset_clear(allow, irp->r); - ra_destreg(as, ir, irp->r); + Reg r = irp->r; + lua_assert(ra_hasreg(r)); + rset_clear(allow, r); + if (r != ir->r && !rset_test(as->freeset, r)) + ra_restore(as, regcost_ref(as->cost[r])); + ra_destreg(as, ir, r); } return allow; }