diff options
Diffstat (limited to 'src/lj_opt_loop.c')
-rw-r--r-- | src/lj_opt_loop.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/lj_opt_loop.c b/src/lj_opt_loop.c index d1512468..8d2935f6 100644 --- a/src/lj_opt_loop.c +++ b/src/lj_opt_loop.c | |||
@@ -182,7 +182,8 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, | |||
182 | SnapEntry *loopmap, IRRef1 *subst) | 182 | SnapEntry *loopmap, IRRef1 *subst) |
183 | { | 183 | { |
184 | SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs]; | 184 | SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs]; |
185 | MSize nmapofs, depth; | 185 | SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)]; |
186 | MSize nmapofs; | ||
186 | MSize on, ln, nn, onent = osnap->nent; | 187 | MSize on, ln, nn, onent = osnap->nent; |
187 | BCReg nslots = osnap->nslots; | 188 | BCReg nslots = osnap->nslots; |
188 | SnapShot *snap = &J->cur.snap[J->cur.nsnap]; | 189 | SnapShot *snap = &J->cur.snap[J->cur.nsnap]; |
@@ -194,11 +195,9 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, | |||
194 | nmapofs = snap->mapofs; | 195 | nmapofs = snap->mapofs; |
195 | } | 196 | } |
196 | J->guardemit.irt = 0; | 197 | J->guardemit.irt = 0; |
197 | depth = osnap->depth; | ||
198 | /* Setup new snapshot. */ | 198 | /* Setup new snapshot. */ |
199 | snap->mapofs = (uint16_t)nmapofs; | 199 | snap->mapofs = (uint16_t)nmapofs; |
200 | snap->ref = (IRRef1)J->cur.nins; | 200 | snap->ref = (IRRef1)J->cur.nins; |
201 | snap->depth = (uint8_t)depth; | ||
202 | snap->nslots = nslots; | 201 | snap->nslots = nslots; |
203 | snap->count = 0; | 202 | snap->count = 0; |
204 | nmap = &J->cur.snapmap[nmapofs]; | 203 | nmap = &J->cur.snapmap[nmapofs]; |
@@ -220,11 +219,11 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, | |||
220 | while (snap_slot(loopmap[ln]) < nslots) /* Copy remaining loop slots. */ | 219 | while (snap_slot(loopmap[ln]) < nslots) /* Copy remaining loop slots. */ |
221 | nmap[nn++] = loopmap[ln++]; | 220 | nmap[nn++] = loopmap[ln++]; |
222 | snap->nent = (uint8_t)nn; | 221 | snap->nent = (uint8_t)nn; |
223 | J->cur.nsnapmap = (uint16_t)(nmapofs + nn + 1 + depth); | ||
224 | omap += onent; | 222 | omap += onent; |
225 | nmap += nn; | 223 | nmap += nn; |
226 | for (nn = 0; nn <= depth; nn++) /* Copy PC + frame links. */ | 224 | while (omap < nextmap) /* Copy PC + frame links. */ |
227 | nmap[nn] = omap[nn]; | 225 | *nmap++ = *omap++; |
226 | J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap); | ||
228 | } | 227 | } |
229 | 228 | ||
230 | /* Unroll loop. */ | 229 | /* Unroll loop. */ |
@@ -335,13 +334,13 @@ static void loop_unroll(jit_State *J) | |||
335 | } | 334 | } |
336 | 335 | ||
337 | /* Undo any partial changes made by the loop optimization. */ | 336 | /* Undo any partial changes made by the loop optimization. */ |
338 | static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap) | 337 | static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap) |
339 | { | 338 | { |
340 | ptrdiff_t i; | 339 | ptrdiff_t i; |
341 | SnapShot *snap = &J->cur.snap[nsnap-1]; | 340 | SnapShot *snap = &J->cur.snap[nsnap-1]; |
342 | SnapEntry *map = J->cur.snapmap; | 341 | SnapEntry *map = J->cur.snapmap; |
343 | map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */ | 342 | map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */ |
344 | J->cur.nsnapmap = (uint16_t)(snap->mapofs + snap->nent + 1 + snap->depth); | 343 | J->cur.nsnapmap = (uint16_t)nsnapmap; |
345 | J->cur.nsnap = nsnap; | 344 | J->cur.nsnap = nsnap; |
346 | J->guardemit.irt = 0; | 345 | J->guardemit.irt = 0; |
347 | lj_ir_rollback(J, ins); | 346 | lj_ir_rollback(J, ins); |
@@ -370,6 +369,7 @@ int lj_opt_loop(jit_State *J) | |||
370 | { | 369 | { |
371 | IRRef nins = J->cur.nins; | 370 | IRRef nins = J->cur.nins; |
372 | SnapNo nsnap = J->cur.nsnap; | 371 | SnapNo nsnap = J->cur.nsnap; |
372 | MSize nsnapmap = J->cur.nsnapmap; | ||
373 | int errcode = lj_vm_cpcall(J->L, NULL, J, cploop_opt); | 373 | int errcode = lj_vm_cpcall(J->L, NULL, J, cploop_opt); |
374 | if (LJ_UNLIKELY(errcode)) { | 374 | if (LJ_UNLIKELY(errcode)) { |
375 | lua_State *L = J->L; | 375 | lua_State *L = J->L; |
@@ -382,7 +382,7 @@ int lj_opt_loop(jit_State *J) | |||
382 | if (--J->instunroll < 0) /* But do not unroll forever. */ | 382 | if (--J->instunroll < 0) /* But do not unroll forever. */ |
383 | break; | 383 | break; |
384 | L->top--; /* Remove error object. */ | 384 | L->top--; /* Remove error object. */ |
385 | loop_undo(J, nins, nsnap); | 385 | loop_undo(J, nins, nsnap, nsnapmap); |
386 | return 1; /* Loop optimization failed, continue recording. */ | 386 | return 1; /* Loop optimization failed, continue recording. */ |
387 | default: | 387 | default: |
388 | break; | 388 | break; |