mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 15:14:08 +00:00
Back out history buffer for tailcall counts.
Use an aggregate counter independent of frame depth.
This commit is contained in:
parent
19af483166
commit
86494c783d
@ -231,9 +231,9 @@ typedef struct jit_State {
|
||||
|
||||
TraceState state; /* Trace compiler state. */
|
||||
|
||||
uint64_t tailcalled; /* History of the number of successive tailcalls. */
|
||||
int32_t instunroll; /* Unroll counter for instable loops. */
|
||||
int32_t loopunroll; /* Unroll counter for loop ops in side traces. */
|
||||
int32_t tailcalled; /* Number of successive tailcalls. */
|
||||
int32_t framedepth; /* Current frame depth. */
|
||||
int32_t retdepth; /* Return frame depth (count of RETF). */
|
||||
|
||||
|
@ -505,7 +505,6 @@ static void rec_call(jit_State *J, BCReg func, ptrdiff_t nargs)
|
||||
rec_call_setup(J, func, nargs);
|
||||
/* Bump frame. */
|
||||
J->framedepth++;
|
||||
J->tailcalled <<= 8; /* NYI: tail call history overflow is ignored. */
|
||||
J->base += func+1;
|
||||
J->baseslot += func+1;
|
||||
}
|
||||
@ -518,7 +517,7 @@ static void rec_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs)
|
||||
memmove(&J->base[-1], &J->base[func], sizeof(TRef)*(J->maxslot+1));
|
||||
/* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */
|
||||
/* Tailcalls can form a loop, so count towards the loop unroll limit. */
|
||||
if ((int32_t)(++J->tailcalled & 0xff) > J->loopunroll)
|
||||
if (++J->tailcalled > J->loopunroll)
|
||||
lj_trace_err(J, LJ_TRERR_LUNROLL);
|
||||
}
|
||||
|
||||
@ -527,7 +526,6 @@ static void rec_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
|
||||
{
|
||||
TValue *frame = J->L->base - 1;
|
||||
ptrdiff_t i;
|
||||
J->tailcalled >>= 8;
|
||||
for (i = 0; i < gotresults; i++)
|
||||
getslot(J, rbase+i); /* Ensure all results have a reference. */
|
||||
while (frame_ispcall(frame)) { /* Immediately resolve pcall() returns. */
|
||||
@ -1726,7 +1724,7 @@ 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]) {
|
||||
if (count + J->tailcalled > J->param[JIT_P_recunroll]) {
|
||||
J->pc++;
|
||||
rec_stop(J, J->curtrace); /* Up-recursion or tail-recursion. */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user