summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2020-10-12 15:40:28 +0200
committerMike Pall <mike>2020-10-12 15:40:28 +0200
commitde6b1a11dd1a3349179084578c5d533be1c30234 (patch)
treef82129c93cef707f410be068c782dcedee98419d
parente8ec6fe996cf48ef23755581dafe372eb71ad75c (diff)
downloadluajit2-de6b1a11dd1a3349179084578c5d533be1c30234.tar.gz
Ensure full init of IR_NOP instructions.
-rw-r--r--src/lj_asm.c2
-rw-r--r--src/lj_ir.h8
-rw-r--r--src/lj_opt_dce.c5
-rw-r--r--src/lj_opt_mem.c25
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;