Fix stack check in narrowing optimization.

Thanks to Robert Nix.
This commit is contained in:
Mike Pall 2015-04-28 20:28:16 +02:00
parent a9fd686744
commit 11106aa833

View File

@ -247,10 +247,16 @@ static void narrow_stripov_backprop(NarrowConv *nc, IRRef ref, int depth)
if (bp) { if (bp) {
ref = bp->val; ref = bp->val;
} else if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) { } 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->op1, depth);
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); narrow_stripov_backprop(nc, ir->op2, depth);
return; 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); *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); IRIns *ir = IR(ref);
IRRef cref; IRRef cref;
if (nc->sp >= nc->maxsp) return 10; /* Path too deep. */
/* Check the easy cases first. */ /* Check the easy cases first. */
if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) { if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) {
if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY) if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY)