diff options
-rw-r--r-- | src/lj_opt_mem.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 0fd17306..7177ce2c 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c | |||
@@ -618,16 +618,17 @@ static AliasRet aa_xref(jit_State *J, IRIns *refa, IRIns *xa, IRIns *xb) | |||
618 | basea = IR(refa->op1); | 618 | basea = IR(refa->op1); |
619 | ofsa = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : | 619 | ofsa = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : |
620 | (ptrdiff_t)irk->i; | 620 | (ptrdiff_t)irk->i; |
621 | if (basea == refb && ofsa != 0) | ||
622 | return ALIAS_NO; /* base+-ofs vs. base. */ | ||
623 | } | 621 | } |
624 | if (refb->o == IR_ADD && irref_isk(refb->op2)) { | 622 | if (refb->o == IR_ADD && irref_isk(refb->op2)) { |
625 | IRIns *irk = IR(refb->op2); | 623 | IRIns *irk = IR(refb->op2); |
626 | baseb = IR(refb->op1); | 624 | baseb = IR(refb->op1); |
627 | ofsb = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : | 625 | ofsb = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : |
628 | (ptrdiff_t)irk->i; | 626 | (ptrdiff_t)irk->i; |
629 | if (refa == baseb && ofsb != 0) | 627 | } |
630 | return ALIAS_NO; /* base vs. base+-ofs. */ | 628 | /* Treat constified pointers like base vs. base+offset. */ |
629 | if (basea->o == IR_KPTR && baseb->o == IR_KPTR) { | ||
630 | ofsb += (char *)ir_kptr(baseb) - (char *)ir_kptr(basea); | ||
631 | baseb = basea; | ||
631 | } | 632 | } |
632 | /* This implements (very) strict aliasing rules. | 633 | /* This implements (very) strict aliasing rules. |
633 | ** Different types do NOT alias, except for differences in signedness. | 634 | ** Different types do NOT alias, except for differences in signedness. |