aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-11-07 13:29:20 +0100
committerMike Pall <mike>2013-11-07 13:29:20 +0100
commit5a25a735f589d6fafbaa3c234c59fbfe8920a102 (patch)
tree580fbc030fbee4d163827676e907ed73531024a3
parent8941b1994e1bb2a82cb8221eb5063bfb6e0ef81b (diff)
downloadluajit-5a25a735f589d6fafbaa3c234c59fbfe8920a102.tar.gz
luajit-5a25a735f589d6fafbaa3c234c59fbfe8920a102.tar.bz2
luajit-5a25a735f589d6fafbaa3c234c59fbfe8920a102.zip
Fix type punning alias analysis for constified pointers.
-rw-r--r--src/lj_opt_mem.c9
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.