summaryrefslogtreecommitdiff
path: root/test/Analysis
diff options
context:
space:
mode:
authorArnold Schwaighofer <arnolds@codeaurora.org>2012-09-06 14:31:51 +0000
committerArnold Schwaighofer <arnolds@codeaurora.org>2012-09-06 14:31:51 +0000
commit029032693fdb065b6edfff6d68df188f98bee8ac (patch)
tree6acbf33c7f4e1a641f1d67aef5c1073ea3b373ec /test/Analysis
parent79cb162e5d7aeaa3602bf4a7afa253232f461b33 (diff)
downloadllvm-029032693fdb065b6edfff6d68df188f98bee8ac.tar.gz
llvm-029032693fdb065b6edfff6d68df188f98bee8ac.tar.bz2
llvm-029032693fdb065b6edfff6d68df188f98bee8ac.tar.xz
BasicAA: GEPs of NoAlias'ing base ptr with equivalent indices are NoAlias
If we can show that the base pointers of two GEPs don't alias each other using precise analysis and the indices and base offset are equal then the two GEPs also don't alias each other. This is primarily needed for the follow up patch that analyses NoAlias'ing PHI nodes. Part 1/2 of fix for PR13564. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163317 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r--test/Analysis/BasicAA/noalias-geps.ll54
1 files changed, 54 insertions, 0 deletions
diff --git a/test/Analysis/BasicAA/noalias-geps.ll b/test/Analysis/BasicAA/noalias-geps.ll
new file mode 100644
index 0000000000..a93d778da0
--- /dev/null
+++ b/test/Analysis/BasicAA/noalias-geps.ll
@@ -0,0 +1,54 @@
+; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
+
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+
+; Check that geps with equal base offsets of noalias base pointers stay noalias.
+define i32 @test(i32* %p, i16 %i) {
+ %pi = getelementptr i32* %p, i32 0
+ %pi.next = getelementptr i32* %p, i32 1
+ %b = icmp eq i16 %i, 0
+ br i1 %b, label %bb1, label %bb2
+
+bb1:
+ %f = getelementptr i32* %pi, i32 1
+ %g = getelementptr i32* %pi.next, i32 1
+ br label %bb3
+bb2:
+ %f2 = getelementptr i32* %pi, i32 1
+ %g2 = getelementptr i32* %pi.next, i32 1
+ br label %bb3
+
+bb3:
+ %ptr_phi = phi i32* [ %f, %bb1 ], [ %f2, %bb2 ]
+ %ptr_phi2 = phi i32* [ %g, %bb1 ], [ %g2, %bb2 ]
+; CHECK: NoAlias: i32* %f1, i32* %g1
+ %f1 = getelementptr i32* %ptr_phi , i32 1
+ %g1 = getelementptr i32* %ptr_phi2 , i32 1
+
+ret i32 0
+}
+
+; Check that geps with equal indices of noalias base pointers stay noalias.
+define i32 @test2([2 x i32]* %p, i32 %i) {
+ %pi = getelementptr [2 x i32]* %p, i32 0
+ %pi.next = getelementptr [2 x i32]* %p, i32 1
+ %b = icmp eq i32 %i, 0
+ br i1 %b, label %bb1, label %bb2
+
+bb1:
+ %f = getelementptr [2 x i32]* %pi, i32 1
+ %g = getelementptr [2 x i32]* %pi.next, i32 1
+ br label %bb3
+bb2:
+ %f2 = getelementptr [2 x i32]* %pi, i32 1
+ %g2 = getelementptr [2 x i32]* %pi.next, i32 1
+ br label %bb3
+bb3:
+ %ptr_phi = phi [2 x i32]* [ %f, %bb1 ], [ %f2, %bb2 ]
+ %ptr_phi2 = phi [2 x i32]* [ %g, %bb1 ], [ %g2, %bb2 ]
+; CHECK: NoAlias: i32* %f1, i32* %g1
+ %f1 = getelementptr [2 x i32]* %ptr_phi , i32 1, i32 %i
+ %g1 = getelementptr [2 x i32]* %ptr_phi2 , i32 1, i32 %i
+
+ret i32 0
+}