<div dir="ltr">The one thing i don't think we do right now, and i don't know how much it it helps, it to use the pointer alignment to discount it being able to alias certain variables/gep results.<div><br></div><div>Past that, doing better here pretty much devolves into SCEV math.</div><div><br></div><div>(or TBAA related metadata. The metadata about which fields are being accessed where is really independent of strict aliasing, and is legal/not legal independently of what type those fields are.  Strict aliasing just layers on top of that to say that, additionally, the types of those fields matter too)</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 27, 2017 at 12:12 AM, Mehdi AMINI via Phabricator <span dir="ltr"><<a href="mailto:reviews@reviews.llvm.org" target="_blank">reviews@reviews.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">mehdi_amini created this revision.<br>
<br>
This is fixing pr31761: BasicAA was incorrectly assuming that<br>
it could deduce NoAlias on the result of the GEP if the base<br>
pointer is itself NoAlias.<br>
<br>
This is a quick fix, seems too conservative to me. I'd appreciate<br>
some guidance on how to solve it more cleanly!<br>
<br>
<br>
<a href="https://reviews.llvm.org/D29216" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D29216</a><br>
<br>
Files:<br>
  llvm/lib/Analysis/<wbr>BasicAliasAnalysis.cpp<br>
  llvm/test/Analysis/BasicAA/<wbr>pr31761.ll<br>
  llvm/test/Transforms/<wbr>SLPVectorizer/X86/tiny-tree.ll<br>
<br>
<br>
Index: llvm/test/Transforms/<wbr>SLPVectorizer/X86/tiny-tree.ll<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/test/Transforms/<wbr>SLPVectorizer/X86/tiny-tree.ll<br>
+++ llvm/test/Transforms/<wbr>SLPVectorizer/X86/tiny-tree.ll<br>
@@ -2,6 +2,8 @@<br>
 target triple = "x86_64-apple-macosx10.8.0"<br>
 ; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-apple-<wbr>macosx10.8.0 -mcpu=corei7 | FileCheck %s<br>
<br>
+; Sad sad sad alias analyais!<br>
+; XFAIL: *<br>
<br>
 ; CHECK: tiny_tree_fully_vectorizable<br>
 ; CHECK: load <2 x double><br>
Index: llvm/test/Analysis/BasicAA/<wbr>pr31761.ll<br>
==============================<wbr>==============================<wbr>=======<br>
--- /dev/null<br>
+++ llvm/test/Analysis/BasicAA/<wbr>pr31761.ll<br>
@@ -0,0 +1,19 @@<br>
+; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s<br>
+<br>
+<br>
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:<wbr>32:64-S128"<br>
+target triple = "x86_64-apple-macosx10.12.0"<br>
+<br>
+%struct.blam = type { i32, i32 }<br>
+<br>
+<br>
+; CHECK-DAG: MayAlias: i32* %tmp, i32* %tmp3<br>
+<br>
+define i1 @ham(%struct.blam* %arg)  {<br>
+  %isNull = icmp eq %struct.blam* %arg, null<br>
+  %tmp = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 0<br>
+  %tmp2 = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 1<br>
+  %select = select i1 %isNull, i32* null, i32* %tmp2<br>
+  %tmp3 = getelementptr  i32, i32* %select, i32 -1<br>
+  ret i1 true<br>
+}<br>
Index: llvm/lib/Analysis/<wbr>BasicAliasAnalysis.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/lib/Analysis/<wbr>BasicAliasAnalysis.cpp<br>
+++ llvm/lib/Analysis/<wbr>BasicAliasAnalysis.cpp<br>
@@ -1193,13 +1193,15 @@<br>
     AliasResult R = aliasCheck(UnderlyingV1, MemoryLocation::UnknownSize,<br>
                                AAMDNodes(), V2, V2Size, V2AAInfo,<br>
                                nullptr, UnderlyingV2);<br>
-    if (R != MustAlias)<br>
+    if (R != MustAlias) {<br>
+      if (GEP1BaseOffset != 0 && R == NoAlias)<br>
+        // If V2 is known not to alias GEP base pointer, then the two values<br>
+        // cannot alias only if the GEP is trivial. Otherwise conservatively<br>
+        // return MayAlias.<br>
+        return MayAlias;<br>
       // If V2 may alias GEP base pointer, conservatively returns MayAlias.<br>
-      // If V2 is known not to alias GEP base pointer, then the two values<br>
-      // cannot alias per GEP semantics: "A pointer value formed from a<br>
-      // getelementptr instruction is associated with the addresses associated<br>
-      // with the first operand of the getelementptr".<br>
       return R;<br>
+    }<br>
<br>
     // If the max search depth is reached the result is undefined<br>
     if (GEP1MaxLookupReached)<br>
<br>
<br>
</blockquote></div><br></div>