From de6b1a11dd1a3349179084578c5d533be1c30234 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 12 Oct 2020 15:40:28 +0200 Subject: [PATCH] Ensure full init of IR_NOP instructions. --- src/lj_asm.c | 2 +- src/lj_ir.h | 8 ++++++++ src/lj_opt_dce.c | 5 +---- src/lj_opt_mem.c | 25 +++++-------------------- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 9b17421e..60be4337 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -1833,7 +1833,7 @@ void lj_asm_trace(jit_State *J, GCtrace *T) /* Ensure an initialized instruction beyond the last one for HIOP checks. */ J->cur.nins = lj_ir_nextins(J); - J->cur.ir[J->cur.nins].o = IR_NOP; + lj_ir_nop(&J->cur.ir[J->cur.nins]); /* Setup initial state. Copy some fields to reduce indirections. */ as->J = J; diff --git a/src/lj_ir.h b/src/lj_ir.h index 3a154a05..ac51dc79 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h @@ -548,4 +548,12 @@ static LJ_AINLINE int ir_sideeff(IRIns *ir) LJ_STATIC_ASSERT((int)IRT_GUARD == (int)IRM_W); +/* Replace IR instruction with NOP. */ +static LJ_AINLINE void lj_ir_nop(IRIns *ir) +{ + ir->ot = IRT(IR_NOP, IRT_NIL); + ir->op1 = ir->op2 = 0; + ir->prev = 0; +} + #endif diff --git a/src/lj_opt_dce.c b/src/lj_opt_dce.c index a1df91dd..31e5badd 100644 --- a/src/lj_opt_dce.c +++ b/src/lj_opt_dce.c @@ -47,10 +47,7 @@ static void dce_propagate(jit_State *J) pchain[ir->o] = &ir->prev; } else if (!ir_sideeff(ir)) { *pchain[ir->o] = ir->prev; /* Reroute original instruction chain. */ - ir->t.irt = IRT_NIL; - ir->o = IR_NOP; /* Replace instruction with NOP. */ - ir->op1 = ir->op2 = 0; - ir->prev = 0; + lj_ir_nop(ir); continue; } if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t); diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 281f29ad..5659a056 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c @@ -352,10 +352,7 @@ TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J) goto doemit; /* No elimination possible. */ /* Remove redundant store from chain and replace with NOP. */ *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; + lj_ir_nop(store); /* Now emit the new store instead. */ } goto doemit; @@ -456,10 +453,7 @@ TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J) goto doemit; /* No elimination possible. */ /* Remove redundant store from chain and replace with NOP. */ *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; + lj_ir_nop(store); if (ref+1 < J->cur.nins && store[1].o == IR_OBAR && store[1].op1 == xref) { IRRef1 *bp = &J->chain[IR_OBAR]; @@ -468,10 +462,7 @@ TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J) bp = &obar->prev; /* Remove OBAR, too. */ *bp = obar->prev; - obar->o = IR_NOP; - obar->t.irt = IRT_NIL; - obar->op1 = obar->op2 = 0; - obar->prev = 0; + lj_ir_nop(obar); } /* Now emit the new store instead. */ } @@ -562,10 +553,7 @@ TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J) goto doemit; /* No elimination possible. */ /* Remove redundant store from chain and replace with NOP. */ *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; + lj_ir_nop(store); /* Now emit the new store instead. */ } goto doemit; @@ -816,10 +804,7 @@ TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J) goto doemit; /* No elimination possible. */ /* Remove redundant store from chain and replace with NOP. */ *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; + lj_ir_nop(store); /* Now emit the new store instead. */ } goto doemit;