[llvm] r293293 - Fix BasicAA incorrect assumption on GEP

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 27 08:12:22 PST 2017


Author: mehdi_amini
Date: Fri Jan 27 10:12:22 2017
New Revision: 293293

URL: http://llvm.org/viewvc/llvm-project?rev=293293&view=rev
Log:
Fix BasicAA incorrect assumption on GEP

This is fixing pr31761: BasicAA is deducing NoAlias
on the result of the GEP if the base pointer is itself NoAlias.

This is possible only if the NoAlias on the base pointer is
deduced with a non-sized query: this should guarantee that
the pointers are belonging to different memory allocation
and that the GEP can't legally jump from one to another.

Differential Revision: https://reviews.llvm.org/D29216

Added:
    llvm/trunk/test/Analysis/BasicAA/pr31761.ll
Modified:
    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=293293&r1=293292&r2=293293&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Jan 27 10:12:22 2017
@@ -1191,14 +1191,14 @@ AliasResult BasicAAResult::aliasGEP(cons
       return MayAlias;
 
     AliasResult R = aliasCheck(UnderlyingV1, MemoryLocation::UnknownSize,
-                               AAMDNodes(), V2, V2Size, V2AAInfo,
-                               nullptr, UnderlyingV2);
+                               AAMDNodes(), V2, MemoryLocation::UnknownSize,
+                               V2AAInfo, nullptr, UnderlyingV2);
     if (R != MustAlias)
       // 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".
+      // cannot alias per GEP semantics: "Any memory access must be done through
+      // a pointer value associated with an address range of the memory access,
+      // otherwise the behavior is undefined.".
       return R;
 
     // If the max search depth is reached the result is undefined

Added: llvm/trunk/test/Analysis/BasicAA/pr31761.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/pr31761.ll?rev=293293&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/BasicAA/pr31761.ll (added)
+++ llvm/trunk/test/Analysis/BasicAA/pr31761.ll Fri Jan 27 10:12:22 2017
@@ -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
+}




More information about the llvm-commits mailing list