aboutsummaryrefslogtreecommitdiff
path: root/src/lj_opt_loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_loop.c')
-rw-r--r--src/lj_opt_loop.c18
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. */
338static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap) 337static 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;