diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index c8265b4f..b00c347d 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c @@ -827,7 +827,7 @@ TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J) IRIns *ir; /* Check for any intervening guards or any XLOADs (no AA performed). */ for (ir = IR(J->cur.nins-1); ir > store; ir--) - if (irt_isguard(ir->t) || ir->o == IR_XLOAD) + if (irt_isguard(ir->t) || ir->o == IR_XLOAD || ir->o == IR_INTRN) goto doemit; /* No elimination possible. */ /* Remove redundant store from chain and replace with NOP. */ *refp = store->prev; diff --git a/tests/intrinsic_spec.lua b/tests/intrinsic_spec.lua index e95257ff..58db64a1 100644 --- a/tests/intrinsic_spec.lua +++ b/tests/intrinsic_spec.lua @@ -712,6 +712,27 @@ end assert_jit(brand, testcpuid_brand) end) + + it("no dse between intrinsic", function() + assert_cdef([[int32_t volatileload(int32_t* iptr) __mcode("8brMI");]], "volatileload") + + local numptr = ffi.new("int32_t[1]", 0) + + local volatileload = ffi.C.volatileload + + local function testdse() + assert(volatileload) + local sum = 0 + numptr[0] = 0 + numptr[0] = 1 + sum = volatileload(numptr) + numptr[0] = 2 + sum = sum + volatileload(numptr) + return sum + end + + assert_jit(3, testdse) + end) end) context("__reglist", function()