]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix stack check in narrowing optimization.
authorMike Pall <mike>
Tue, 28 Apr 2015 18:28:16 +0000 (20:28 +0200)
committerMike Pall <mike>
Tue, 28 Apr 2015 18:28:16 +0000 (20:28 +0200)
Thanks to Robert Nix.

src/lj_opt_narrow.c

index b7bd32327ec422f571f6811555620ffe0765ba38..58b3763dba5af3d7657e046b0cd73a6a44ae3514 100644 (file)
@@ -247,10 +247,16 @@ static void narrow_stripov_backprop(NarrowConv *nc, IRRef ref, int depth)
     if (bp) {
       ref = bp->val;
     } else if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) {
+      NarrowIns *savesp = nc->sp;
       narrow_stripov_backprop(nc, ir->op1, depth);
-      narrow_stripov_backprop(nc, ir->op2, depth);
-      *nc->sp++ = NARROWINS(IRT(ir->o - IR_ADDOV + IR_ADD, IRT_INT), ref);
-      return;
+      if (nc->sp < nc->maxsp) {
+       narrow_stripov_backprop(nc, ir->op2, depth);
+       if (nc->sp < nc->maxsp) {
+         *nc->sp++ = NARROWINS(IRT(ir->o - IR_ADDOV + IR_ADD, IRT_INT), ref);
+         return;
+       }
+      }
+      nc->sp = savesp;  /* Path too deep, need to backtrack. */
     }
   }
   *nc->sp++ = NARROWINS(NARROW_REF, ref);
@@ -263,6 +269,8 @@ static int narrow_conv_backprop(NarrowConv *nc, IRRef ref, int depth)
   IRIns *ir = IR(ref);
   IRRef cref;
 
+  if (nc->sp >= nc->maxsp) return 10;  /* Path too deep. */
+
   /* Check the easy cases first. */
   if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) {
     if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY)