summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMehdi Amini <mehdi.amini@apple.com>2017-01-27 16:12:22 +0000
committerMehdi Amini <mehdi.amini@apple.com>2017-01-27 16:12:22 +0000
commit1726fc698ccb85fe4bb23c200a50f28b57fc53cb (patch)
tree590f2b7d27f91ee21fff4c91b5d08a3745b39348
parentc05c9db364b67ff45a3202a75e7d9498024bf66e (diff)
downloadbcm5719-llvm-1726fc698ccb85fe4bb23c200a50f28b57fc53cb.tar.gz
bcm5719-llvm-1726fc698ccb85fe4bb23c200a50f28b57fc53cb.zip
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 llvm-svn: 293293
-rw-r--r--llvm/lib/Analysis/BasicAliasAnalysis.cpp10
-rw-r--r--llvm/test/Analysis/BasicAA/pr31761.ll19
2 files changed, 24 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 97f642eb70d..55f40a34839 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -1191,14 +1191,14 @@ AliasResult BasicAAResult::aliasGEP(const GEPOperator *GEP1, uint64_t V1Size,
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
diff --git a/llvm/test/Analysis/BasicAA/pr31761.ll b/llvm/test/Analysis/BasicAA/pr31761.ll
new file mode 100644
index 00000000000..318dfdc9c24
--- /dev/null
+++ b/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
+}
OpenPOWER on IntegriCloud