[PATCH] D29216: Fix BasicAA incorrect assumption on GEP

Mehdi AMINI via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 27 00:12:41 PST 2017


mehdi_amini created this revision.

This is fixing pr31761: BasicAA was incorrectly assuming that
it could deduce NoAlias on the result of the GEP if the base
pointer is itself NoAlias.

This is a quick fix, seems too conservative to me. I'd appreciate
some guidance on how to solve it more cleanly!


https://reviews.llvm.org/D29216

Files:
  llvm/lib/Analysis/BasicAliasAnalysis.cpp
  llvm/test/Analysis/BasicAA/pr31761.ll
  llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll


Index: llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
===================================================================
--- llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
+++ llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
@@ -2,6 +2,8 @@
 target triple = "x86_64-apple-macosx10.8.0"
 ; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7 | FileCheck %s
 
+; Sad sad sad alias analyais!
+; XFAIL: *
 
 ; CHECK: tiny_tree_fully_vectorizable
 ; CHECK: load <2 x double>
Index: llvm/test/Analysis/BasicAA/pr31761.ll
===================================================================
--- /dev/null
+++ llvm/test/Analysis/BasicAA/pr31761.ll
@@ -0,0 +1,19 @@
+; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.12.0"
+
+%struct.blam = type { i32, i32 }
+
+
+; CHECK-DAG: MayAlias: i32* %tmp, i32* %tmp3
+
+define i1 @ham(%struct.blam* %arg)  {
+  %isNull = icmp eq %struct.blam* %arg, null
+  %tmp = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 0
+  %tmp2 = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 1
+  %select = select i1 %isNull, i32* null, i32* %tmp2
+  %tmp3 = getelementptr  i32, i32* %select, i32 -1
+  ret i1 true
+}
Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp
===================================================================
--- llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -1193,13 +1193,15 @@
     AliasResult R = aliasCheck(UnderlyingV1, MemoryLocation::UnknownSize,
                                AAMDNodes(), V2, V2Size, V2AAInfo,
                                nullptr, UnderlyingV2);
-    if (R != MustAlias)
+    if (R != MustAlias) {
+      if (GEP1BaseOffset != 0 && R == NoAlias)
+        // If V2 is known not to alias GEP base pointer, then the two values
+        // cannot alias only if the GEP is trivial. Otherwise conservatively
+        // return MayAlias.
+        return MayAlias;
       // If V2 may alias GEP base pointer, conservatively returns MayAlias.
-      // If V2 is known not to alias GEP base pointer, then the two values
-      // cannot alias per GEP semantics: "A pointer value formed from a
-      // getelementptr instruction is associated with the addresses associated
-      // with the first operand of the getelementptr".
       return R;
+    }
 
     // If the max search depth is reached the result is undefined
     if (GEP1MaxLookupReached)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29216.86025.patch
Type: text/x-patch
Size: 2586 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170127/a313cc01/attachment.bin>


More information about the llvm-commits mailing list