|
@@ -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)
|