From ae1987d5357c45a5dac0c8edc29609ca64ce76be Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 6 Nov 2012 16:57:50 +0100 Subject: [PATCH] Fix CONV.num.int sinking. --- src/lj_asm.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 4a1af480..5f6becad 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -826,10 +826,19 @@ static void asm_snap_alloc1(ASMState *as, IRRef ref) asm_snap_alloc1(as, (irs+1)->op2); } } - } else if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) { - asm_snap_alloc1(as, ir->op1); } else { - RegSet allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR; + RegSet allow; + if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) { + IRIns *irc; + for (irc = IR(as->curins); irc > ir; irc--) + if ((irc->op1 == ref || irc->op2 == ref) && + !(irc->r == RID_SINK || irc->r == RID_SUNK)) + goto nosink; /* Don't sink conversion if result is used. */ + asm_snap_alloc1(as, ir->op1); + return; + } + nosink: + allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR; if ((as->freeset & allow) || (allow == RSET_FPR && asm_snap_canremat(as))) { /* Get a weak register if we have a free one or can rematerialize. */ -- 2.11.4.GIT