]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix CONV.num.int sinking.
authorMike Pall <mike>
Tue, 6 Nov 2012 15:57:50 +0000 (16:57 +0100)
committerMike Pall <mike>
Tue, 6 Nov 2012 15:57:50 +0000 (16:57 +0100)
src/lj_asm.c

index 4a1af480d569669e14b03e0601032ef50df69bc8..5f6becada2c0e980a5bb9022bb20d57f94de446b 100644 (file)
@@ -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. */