switch ((IROp)ir->o) {
/* Miscellaneous ops. */
case IR_LOOP: asm_loop(as); break;
- case IR_NOP: lua_assert(!ra_used(ir)); break;
+ case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break;
case IR_PHI: asm_phi(as, ir); break;
case IR_HIOP: asm_hiop(as, ir); break;
_(CNEW, AW, ref, ref) \
_(CNEWI, NW, ref, ref) /* CSE is ok, not marked as A. */ \
\
- /* Write barriers. */ \
+ /* Barriers. */ \
_(TBAR, S , ref, ___) \
_(OBAR, S , ref, ref) \
+ _(XBAR, S , ___, ___) \
\
/* Type conversions. */ \
_(CONV, N , ref, lit) \
LJFOLD(CALLS any any)
LJFOLD(CALLL any any) /* Safeguard fallback. */
LJFOLD(CALLXS any any)
+LJFOLD(XBAR)
LJFOLD(RETF any any) /* Modifies BASE. */
LJFOLD(TNEW any any)
LJFOLD(TDUP any)
ref = J->chain[IR_XSTORE];
retry:
if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];
+ if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];
while (ref > lim) {
IRIns *store = IR(ref);
switch (aa_xref(J, xr, fins, store)) {
IRRef1 *refp = &J->chain[IR_XSTORE];
IRRef ref = *refp;
if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS];
+ if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR];
while (ref > lim) { /* Search for redundant or conflicting stores. */
IRIns *store = IR(ref);
switch (aa_xref(J, xr, fins, store)) {