Simplify GCtrace * reference embedding for trace stitching.

This is now possible due to the immovable IR.
Contributed by Peter Cawley.
This commit is contained in:
Mike Pall 2016-05-22 23:40:37 +02:00
parent a657fa0186
commit 3152ed98ea
6 changed files with 22 additions and 8 deletions

View File

@ -1933,6 +1933,11 @@ static void asm_tail_link(ASMState *as)
} }
emit_addptr(as, RID_BASE, 8*(int32_t)baseslot); emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);
if (as->J->ktrace) { /* Patch ktrace slot with the final GCtrace pointer. */
setgcref(IR(as->J->ktrace)->gcr, obj2gco(as->J->curfinal));
IR(as->J->ktrace)->o = IR_KGC;
}
/* Sync the interpreter state with the on-trace state. */ /* Sync the interpreter state with the on-trace state. */
asm_stack_restore(as, snap); asm_stack_restore(as, snap);

View File

@ -118,9 +118,8 @@ static void recff_stitch(jit_State *J)
/* Ditto for the IR. */ /* Ditto for the IR. */
memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1)); memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));
J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT; J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
J->ktracep = lj_ir_k64_reserve(J); J->base[-1] = lj_ir_ktrace(J);
lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE); J->ktrace = tref_ref(J->base[-1]);
J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);
J->base += 2; J->base += 2;
J->baseslot += 2; J->baseslot += 2;
J->framedepth++; J->framedepth++;

View File

@ -348,6 +348,18 @@ found:
return TREF(ref, t); return TREF(ref, t);
} }
/* Allocate GCtrace constant placeholder (no interning). */
TRef lj_ir_ktrace(jit_State *J)
{
IRRef ref = ir_nextk(J);
IRIns *ir = IR(ref);
lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);
ir->t.irt = IRT_P64;
ir->o = IR_KNULL; /* Not IR_KGC yet, but same size. */
ir->prev = 0;
return TREF(ref, IRT_P64);
}
/* Intern 32 bit pointer constant. */ /* Intern 32 bit pointer constant. */
TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr) TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr)
{ {

View File

@ -51,6 +51,7 @@ LJ_FUNC TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t);
LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr); LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr);
LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t); LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t);
LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot); LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot);
LJ_FUNC TRef lj_ir_ktrace(jit_State *J);
#if LJ_64 #if LJ_64
#define lj_ir_kintp(J, k) lj_ir_kint64(J, (uint64_t)(k)) #define lj_ir_kintp(J, k) lj_ir_kint64(J, (uint64_t)(k))

View File

@ -416,7 +416,7 @@ typedef struct jit_State {
GCRef *trace; /* Array of traces. */ GCRef *trace; /* Array of traces. */
TraceNo freetrace; /* Start of scan for next free trace. */ TraceNo freetrace; /* Start of scan for next free trace. */
MSize sizetrace; /* Size of trace array. */ MSize sizetrace; /* Size of trace array. */
TValue *ktracep; /* Pointer to K64Array slot with GCtrace pointer. */ IRRef1 ktrace; /* Reference to KGC with GCtrace. */
IRRef1 chain[IR__MAX]; /* IR instruction skip-list chain anchors. */ IRRef1 chain[IR__MAX]; /* IR instruction skip-list chain anchors. */
TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA]; /* Stack slot map. */ TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA]; /* Stack slot map. */

View File

@ -436,7 +436,7 @@ static void trace_start(jit_State *J)
J->postproc = LJ_POST_NONE; J->postproc = LJ_POST_NONE;
lj_resetsplit(J); lj_resetsplit(J);
J->retryrec = 0; J->retryrec = 0;
J->ktracep = NULL; J->ktrace = 0;
setgcref(J->cur.startpt, obj2gco(J->pt)); setgcref(J->cur.startpt, obj2gco(J->pt));
L = J->L; L = J->L;
@ -512,9 +512,6 @@ static void trace_stop(jit_State *J)
lj_mcode_commit(J, J->cur.mcode); lj_mcode_commit(J, J->cur.mcode);
J->postproc = LJ_POST_NONE; J->postproc = LJ_POST_NONE;
trace_save(J, T); trace_save(J, T);
if (J->ktracep) { /* Patch K64Array slot with the final GCtrace pointer. */
setgcV(J->L, J->ktracep, obj2gco(T), LJ_TTRACE);
}
L = J->L; L = J->L;
lj_vmevent_send(L, TRACE, lj_vmevent_send(L, TRACE,