From 19af48316655fac73f6a75a03d65fc6c9a4c7c1a Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 22 Feb 2010 14:35:47 +0100 Subject: Add region selection for up-recursion and tail-recursion. --- src/lj_jit.h | 2 +- src/lj_record.c | 6 ++++-- src/lj_traceerr.h | 1 - 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lj_jit.h b/src/lj_jit.h index 41a3fe9a..69a066ce 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h @@ -76,7 +76,7 @@ _(\012, instunroll, 4) /* Max. unroll for instable loops. */ \ _(\012, loopunroll, 7) /* Max. unroll for loop ops in side traces. */ \ _(\012, callunroll, 3) /* Max. unroll for recursive calls. */ \ - _(\011, recunroll, 0) /* Max. unroll for true recursion. */ \ + _(\011, recunroll, 2) /* Max. unroll for true recursion. */ \ \ /* Size of each machine code area (in KBytes). */ \ _(\011, sizemcode, JIT_P_sizemcode_DEFAULT) \ diff --git a/src/lj_record.c b/src/lj_record.c index 42f9a8ae..45a8ef5f 100644 --- a/src/lj_record.c +++ b/src/lj_record.c @@ -1726,8 +1726,10 @@ static void check_call_unroll(jit_State *J) if ((J->slot[s] & TREF_FRAME) && tref_ref(J->slot[s]) == fref) count++; if (J->pc == J->startpc) { - if (count + (int32_t)(J->tailcalled & 0xff) > J->param[JIT_P_recunroll]) - lj_trace_err(J, LJ_TRERR_NYIRECU); + if (count + (int32_t)(J->tailcalled & 0xff) > J->param[JIT_P_recunroll]) { + J->pc++; + rec_stop(J, J->curtrace); /* Up-recursion or tail-recursion. */ + } } else { if (count > J->param[JIT_P_callunroll]) lj_trace_err(J, LJ_TRERR_CUNROLL); diff --git a/src/lj_traceerr.h b/src/lj_traceerr.h index 89ab04d1..abc53024 100644 --- a/src/lj_traceerr.h +++ b/src/lj_traceerr.h @@ -22,7 +22,6 @@ TREDEF(LBLACKL, "blacklisted loop") TREDEF(BADTYPE, "bad argument type") TREDEF(CJITOFF, "call to JIT-disabled function") TREDEF(CUNROLL, "call unroll limit reached") -TREDEF(NYIRECU, "NYI: recursive calls") TREDEF(NYIVF, "NYI: vararg function") TREDEF(NYICF, "NYI: C function %p") TREDEF(NYIFF, "NYI: FastFunc %s") -- cgit v1.2.3-55-g6feb