It's not necessary to do rounding for alloca operations when the requested
alignment is equal to the stack alignment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40004 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Analysis/BasicAA/2003-02-26-AccessSizeTest.ll b/test/Analysis/BasicAA/2003-02-26-AccessSizeTest.ll
new file mode 100644
index 0000000..cb2b27e
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-02-26-AccessSizeTest.ll
@@ -0,0 +1,18 @@
+; This testcase makes sure that size is taken to account when alias analysis
+; is performed. It is not legal to delete the second load instruction because
+; the value computed by the first load instruction is changed by the store.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse -instcombine | llvm-dis | grep DONOTREMOVE
+
+int %test() {
+ %A = alloca int
+ store int 0, int* %A
+ %X = load int* %A
+ %B = cast int* %A to sbyte*
+ %C = getelementptr sbyte* %B, long 1
+ store sbyte 1, sbyte* %C ; Aliases %A
+ %Y.DONOTREMOVE = load int* %A
+ %Z = sub int %X, %Y.DONOTREMOVE
+ ret int %Z
+}
+
diff --git a/test/Analysis/BasicAA/2003-03-04-GEPCrash.ll b/test/Analysis/BasicAA/2003-03-04-GEPCrash.ll
new file mode 100644
index 0000000..ee008a8
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-03-04-GEPCrash.ll
@@ -0,0 +1,7 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -aa-eval -disable-output
+; Test for a bug in BasicAA which caused a crash when querying equality of P1&P2
+void %test({[2 x int],[2 x int]}* %A, long %X, long %Y) {
+ %P1 = getelementptr {[2 x int],[2 x int]}* %A, long 0, uint 0, long %X
+ %P2 = getelementptr {[2 x int],[2 x int]}* %A, long 0, uint 1, long %Y
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2003-04-22-GEPProblem.ll b/test/Analysis/BasicAA/2003-04-22-GEPProblem.ll
new file mode 100644
index 0000000..ddadc8e
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-04-22-GEPProblem.ll
@@ -0,0 +1,15 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse -instcombine | llvm-dis | grep sub
+
+; BasicAA was incorrectly concluding that P1 and P2 didn't conflict!
+
+int %test(int *%Ptr, long %V) {
+ %P2 = getelementptr int* %Ptr, long 1
+ %P1 = getelementptr int* %Ptr, long %V
+ %X = load int* %P1
+ store int 5, int* %P2
+
+ %Y = load int* %P1
+
+ %Z = sub int %X, %Y
+ ret int %Z
+}
diff --git a/test/Analysis/BasicAA/2003-04-25-GEPCrash.ll b/test/Analysis/BasicAA/2003-04-25-GEPCrash.ll
new file mode 100644
index 0000000..7e39f13
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-04-25-GEPCrash.ll
@@ -0,0 +1,7 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -aa-eval -disable-output
+; Test for a bug in BasicAA which caused a crash when querying equality of P1&P2
+void %test([17 x ushort]* %mask_bits) {
+ %P1 = getelementptr [17 x ushort]* %mask_bits, long 0, long 0
+ %P2 = getelementptr [17 x ushort]* %mask_bits, long 252645134, long 0
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2003-05-21-GEP-Problem.ll b/test/Analysis/BasicAA/2003-05-21-GEP-Problem.ll
new file mode 100644
index 0000000..146fc54
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-05-21-GEP-Problem.ll
@@ -0,0 +1,21 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output
+ %struct..apr_array_header_t = type { int*, int, int, int, sbyte* }
+ %struct..apr_table_t = type { %struct..apr_array_header_t, uint, [32 x int], [32 x int] }
+
+void %table_reindex(%struct..apr_table_t* %t.1) { ; No predecessors!
+ br label %loopentry
+
+loopentry: ; preds = %0, %no_exit
+ %tmp.101 = getelementptr %struct..apr_table_t* %t.1, long 0, uint 0, uint 2
+ %tmp.11 = load int* %tmp.101 ; <int> [#uses=0]
+ br bool false, label %no_exit, label %UnifiedExitNode
+
+no_exit: ; preds = %loopentry
+ %tmp.25 = cast int 0 to long ; <long> [#uses=1]
+ %tmp.261 = getelementptr %struct..apr_table_t* %t.1, long 0, uint 3, long %tmp.25 ; <int*> [#uses=1]
+ store int 0, int* %tmp.261
+ br label %loopentry
+
+UnifiedExitNode: ; preds = %loopentry
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2003-06-01-AliasCrash.ll b/test/Analysis/BasicAA/2003-06-01-AliasCrash.ll
new file mode 100644
index 0000000..772bca9
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-06-01-AliasCrash.ll
@@ -0,0 +1,11 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -aa-eval -disable-output
+
+int %MTConcat([3 x int]* %a.1) {
+ %tmp.961 = getelementptr [3 x int]* %a.1, long 0, long 4
+ %tmp.97 = load int* %tmp.961
+ %tmp.119 = getelementptr [3 x int]* %a.1, long 1, long 0
+ %tmp.120 = load int* %tmp.119
+ %tmp.1541 = getelementptr [3 x int]* %a.1, long 0, long 4
+ %tmp.155 = load int* %tmp.1541
+ ret int 0
+}
diff --git a/test/Analysis/BasicAA/2003-07-03-BasicAACrash.ll b/test/Analysis/BasicAA/2003-07-03-BasicAACrash.ll
new file mode 100644
index 0000000..61f3957
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-07-03-BasicAACrash.ll
@@ -0,0 +1,12 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -aa-eval -disable-output
+
+ %struct..RefPoint = type { int, { uint, ushort, ushort } }
+ %struct..RefRect = type { %struct..RefPoint, %struct..RefPoint }
+
+implementation ; Functions:
+
+uint %BMT_CommitPartDrawObj() {
+ %tmp.19111 = getelementptr %struct..RefRect* null, long 0, uint 0, uint 1, uint 2
+ %tmp.20311 = getelementptr %struct..RefRect* null, long 0, uint 1, uint 1, uint 2
+ ret uint 0
+}
diff --git a/test/Analysis/BasicAA/2003-09-19-LocalArgument.ll b/test/Analysis/BasicAA/2003-09-19-LocalArgument.ll
new file mode 100644
index 0000000..ee6ac9c
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-09-19-LocalArgument.ll
@@ -0,0 +1,12 @@
+; In this test, a local alloca cannot alias an incoming argument.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse -instcombine | llvm-dis | not grep sub
+
+int %test(int* %P) {
+ %X = alloca int
+ %V1 = load int* %P
+ store int 0, int* %X
+ %V2 = load int* %P
+ %Diff = sub int %V1, %V2
+ ret int %Diff
+}
diff --git a/test/Analysis/BasicAA/2003-11-04-SimpleCases.ll b/test/Analysis/BasicAA/2003-11-04-SimpleCases.ll
new file mode 100644
index 0000000..1d122fd
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-11-04-SimpleCases.ll
@@ -0,0 +1,16 @@
+; This testcase consists of alias relations which should be completely
+; resolvable by basicaa.
+
+; RUN: llvm-upgrade < %s | llvm-as | \
+; RUN: opt -aa-eval -print-may-aliases -disable-output |& not grep May:
+
+%T = type { uint, [10 x ubyte] }
+
+void %test(%T* %P) {
+ %A = getelementptr %T* %P, long 0
+ %B = getelementptr %T* %P, long 0, uint 0
+ %C = getelementptr %T* %P, long 0, uint 1
+ %D = getelementptr %T* %P, long 0, uint 1, long 0
+ %E = getelementptr %T* %P, long 0, uint 1, long 5
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2003-12-11-ConstExprGEP.ll b/test/Analysis/BasicAA/2003-12-11-ConstExprGEP.ll
new file mode 100644
index 0000000..5f602b8
--- /dev/null
+++ b/test/Analysis/BasicAA/2003-12-11-ConstExprGEP.ll
@@ -0,0 +1,18 @@
+; This testcase consists of alias relations which should be completely
+; resolvable by basicaa, but require analysis of getelementptr constant exprs.
+
+; RUN: llvm-upgrade < %s | llvm-as | \
+; RUN: opt -aa-eval -print-may-aliases -disable-output |& not grep May:
+
+%T = type { uint, [10 x ubyte] }
+
+%G = external global %T
+
+void %test() {
+ %D = getelementptr %T* %G, long 0, uint 0
+ %E = getelementptr %T* %G, long 0, uint 1, long 5
+ %F = getelementptr uint* getelementptr (%T* %G, long 0, uint 0), long 0
+ %X = getelementptr [10 x ubyte]* getelementptr (%T* %G, long 0, uint 1), long 0, long 5
+
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2004-01-29-InvariantMemory.llx b/test/Analysis/BasicAA/2004-01-29-InvariantMemory.llx
new file mode 100644
index 0000000..c8c30f9
--- /dev/null
+++ b/test/Analysis/BasicAA/2004-01-29-InvariantMemory.llx
@@ -0,0 +1,13 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -load-vn -gcse -instcombine | \
+; RUN: llvm-dis | not grep load
+
+%X = constant [2 x int] [int 4, int 5]
+
+int %test(int* %Y, long %idx) {
+ %P = getelementptr [2 x int]* %X, long 0, long %idx
+ %A = load int* %P ; Load from invariant memory
+ store int 4, int* %Y ; Store could not be to %X
+ %B = load int* %P
+ %C = sub int %A, %B
+ ret int %C
+}
diff --git a/test/Analysis/BasicAA/2004-07-28-MustAliasbug.llx b/test/Analysis/BasicAA/2004-07-28-MustAliasbug.llx
new file mode 100644
index 0000000..65bc21a
--- /dev/null
+++ b/test/Analysis/BasicAA/2004-07-28-MustAliasbug.llx
@@ -0,0 +1,10 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -dse | llvm-dis | grep {store i32 0}
+
+void %test({int,int }* %P) {
+ %Q = getelementptr {int,int}* %P, int 1
+ %X = getelementptr {int,int}* %Q, int 0, uint 1
+ %Y = getelementptr {int,int}* %Q, int 1, uint 1
+ store int 0, int* %X
+ store int 1, int* %Y
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll b/test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll
new file mode 100644
index 0000000..2539c45
--- /dev/null
+++ b/test/Analysis/BasicAA/2004-12-08-BasicAACrash.ll
@@ -0,0 +1,24 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -licm
+
+"java/lang/Object" = type { %struct.llvm_java_object_base }
+ "java/lang/StringBuffer" = type { "java/lang/Object", int, { "java/lang/Object", uint, [0 x ushort] }*, bool }
+ %struct.llvm_java_object_base = type opaque
+
+implementation ; Functions:
+
+void "java/lang/StringBuffer/setLength(I)V"(%struct.llvm_java_object_base*) {
+bc0:
+ br bool false, label %bc40, label %bc65
+
+bc65: ; preds = %bc0, %bc40
+ ret void
+
+bc40: ; preds = %bc0, %bc40
+ %tmp75 = cast %struct.llvm_java_object_base* %0 to "java/lang/StringBuffer"* ; <"java/lang/StringBuffer"*> [#uses=1]
+ %tmp76 = getelementptr "java/lang/StringBuffer"* %tmp75, int 0, uint 1 ; <int*> [#uses=1]
+ store int 0, int* %tmp76
+ %tmp381 = cast %struct.llvm_java_object_base* %0 to "java/lang/StringBuffer"* ; <"java/lang/StringBuffer"*> [#uses=1]
+ %tmp392 = getelementptr "java/lang/StringBuffer"* %tmp381, int 0, uint 1 ; <int*> [#uses=1]
+ %tmp403 = load int* %tmp392 ; <int> [#uses=0]
+ br bool false, label %bc40, label %bc65
+}
diff --git a/test/Analysis/BasicAA/2004-12-08-BasicAACrash2.ll b/test/Analysis/BasicAA/2004-12-08-BasicAACrash2.ll
new file mode 100644
index 0000000..d5d16d8
--- /dev/null
+++ b/test/Analysis/BasicAA/2004-12-08-BasicAACrash2.ll
@@ -0,0 +1,22 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -dse
+
+"java/lang/Object" = type { %struct.llvm_java_object_base }
+ "java/lang/StringBuffer" = type { "java/lang/Object", int, { "java/lang/Object", uint, [0 x ushort] }*, bool }
+ %struct.llvm_java_object_base = type opaque
+
+implementation ; Functions:
+
+void "java/lang/StringBuffer/ensureCapacity_unsynchronized(I)V"() {
+bc0:
+ %tmp = getelementptr "java/lang/StringBuffer"* null, int 0, uint 3 ; <bool*> [#uses=1]
+ br bool false, label %bc16, label %bc7
+
+bc16: ; preds = %bc0
+ %tmp91 = getelementptr "java/lang/StringBuffer"* null, int 0, uint 2 ; <{ "java/lang/Object", uint, [0 x ushort] }**> [#uses=1]
+ store { "java/lang/Object", uint, [0 x ushort] }* null, { "java/lang/Object", uint, [0 x ushort] }** %tmp91
+ store bool false, bool* %tmp
+ ret void
+
+bc7: ; preds = %bc0
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2005-03-09-BrokenBasicAA.ll b/test/Analysis/BasicAA/2005-03-09-BrokenBasicAA.ll
new file mode 100644
index 0000000..f7f42ba
--- /dev/null
+++ b/test/Analysis/BasicAA/2005-03-09-BrokenBasicAA.ll
@@ -0,0 +1,15 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -load-vn -gcse -instcombine |\
+; RUN: llvm-dis | grep {load i32\\* %A}
+
+declare double* %useit(int*)
+
+int %foo(uint %Amt) {
+ %A = malloc int, uint %Amt
+ %P = call double* %useit(int* %A)
+
+ %X = load int* %A
+ store double 0.0, double* %P
+ %Y = load int* %A
+ %Z = sub int %X, %Y
+ ret int %Z
+}
diff --git a/test/Analysis/BasicAA/2006-03-03-BadArraySubscript.ll b/test/Analysis/BasicAA/2006-03-03-BadArraySubscript.ll
new file mode 100644
index 0000000..f29e9a0
--- /dev/null
+++ b/test/Analysis/BasicAA/2006-03-03-BadArraySubscript.ll
@@ -0,0 +1,32 @@
+; RUN: llvm-upgrade < %s | llvm-as | \
+; RUN: opt -aa-eval -disable-output |& grep {2 no alias respon}
+
+;; TEST that A[1][0] may alias A[0][i].
+
+void %test(int %N) {
+entry:
+ %X = alloca [3 x [3 x int]] ; <[3 x [3 x int]]*> [#uses=4]
+ %tmp.24 = setgt int %N, 0 ; <bool> [#uses=1]
+ br bool %tmp.24, label %no_exit, label %loopexit
+
+no_exit: ; preds = %no_exit, %entry
+ %i.0.0 = phi int [ 0, %entry ], [ %inc, %no_exit ] ; <int> [#uses=2]
+ %tmp.6 = getelementptr [3 x [3 x int]]* %X, int 0, int 0, int %i.0.0 ; <int*> [#uses=1]
+ store int 1, int* %tmp.6
+ %tmp.8 = getelementptr [3 x [3 x int]]* %X, int 0, int 0, int 0 ; <int*> [#uses=1]
+ %tmp.9 = load int* %tmp.8 ; <int> [#uses=1]
+ %tmp.11 = getelementptr [3 x [3 x int]]* %X, int 0, int 1, int 0 ; <int*> [#uses=1]
+ %tmp.12 = load int* %tmp.11 ; <int> [#uses=1]
+ %tmp.13 = add int %tmp.12, %tmp.9 ; <int> [#uses=1]
+ %inc = add int %i.0.0, 1 ; <int> [#uses=2]
+ %tmp.2 = setlt int %inc, %N ; <bool> [#uses=1]
+ br bool %tmp.2, label %no_exit, label %loopexit
+
+loopexit: ; preds = %no_exit, %entry
+ %Y.0.1 = phi int [ 0, %entry ], [ %tmp.13, %no_exit ] ; <int> [#uses=1]
+ %tmp.4 = getelementptr [3 x [3 x int]]* %X, int 0, int 0 ; <[3 x int]*> [#uses=1]
+ %tmp.15 = call int (...)* %foo( [3 x int]* %tmp.4, int %Y.0.1 ) ; <int> [#uses=0]
+ ret void
+}
+
+declare int %foo(...)
diff --git a/test/Analysis/BasicAA/2006-11-03-BasicAAVectorCrash.ll b/test/Analysis/BasicAA/2006-11-03-BasicAAVectorCrash.ll
new file mode 100644
index 0000000..0503fac
--- /dev/null
+++ b/test/Analysis/BasicAA/2006-11-03-BasicAAVectorCrash.ll
@@ -0,0 +1,51 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -licm -disable-output
+target endian = big
+target pointersize = 32
+target triple = "powerpc-apple-darwin8.7.0"
+
+implementation ; Functions:
+
+void %glgRunProcessor() {
+entry:
+ br bool false, label %bb2037.i, label %cond_true.i18
+
+cond_true.i18: ; preds = %entry
+ ret void
+
+bb205.i: ; preds = %bb2037.i
+ switch uint 0, label %bb1013.i [
+ uint 14, label %bb239.i
+ uint 15, label %bb917.i
+ ]
+
+bb239.i: ; preds = %bb205.i
+ br bool false, label %cond_false277.i, label %cond_true264.i
+
+cond_true264.i: ; preds = %bb239.i
+ ret void
+
+cond_false277.i: ; preds = %bb239.i
+ %tmp1062.i = getelementptr [2 x <4 x int>]* null, int 0, int 1 ; <<4 x int>*> [#uses=1]
+ store <4 x int> zeroinitializer, <4 x int>* %tmp1062.i
+ br bool false, label %cond_true1032.i, label %cond_false1063.i85
+
+bb917.i: ; preds = %bb205.i
+ ret void
+
+bb1013.i: ; preds = %bb205.i
+ ret void
+
+cond_true1032.i: ; preds = %cond_false277.i
+ %tmp1187.i = getelementptr [2 x <4 x int>]* null, int 0, int 0, int 7 ; <int*> [#uses=1]
+ store int 0, int* %tmp1187.i
+ br label %bb2037.i
+
+cond_false1063.i85: ; preds = %cond_false277.i
+ ret void
+
+bb2037.i: ; preds = %cond_true1032.i, %entry
+ br bool false, label %bb205.i, label %cond_next2042.i
+
+cond_next2042.i: ; preds = %bb2037.i
+ ret void
+}
diff --git a/test/Analysis/BasicAA/2007-01-13-BasePointerBadNoAlias.ll b/test/Analysis/BasicAA/2007-01-13-BasePointerBadNoAlias.ll
new file mode 100644
index 0000000..683e07d
--- /dev/null
+++ b/test/Analysis/BasicAA/2007-01-13-BasePointerBadNoAlias.ll
@@ -0,0 +1,35 @@
+; PR1109
+; RUN: llvm-as < %s | opt -basicaa -load-vn -gcse -instcombine | llvm-dis | \
+; RUN: grep {sub i32}
+; RUN: llvm-as < %s | opt -basicaa -load-vn -gcse -instcombine | llvm-dis | \
+; RUN: not grep {ret i32 0}
+; END.
+
+target datalayout = "e-p:32:32"
+target triple = "i686-apple-darwin8"
+ %struct.CONSTRAINT = type { i32, i32, i32, i32 }
+ %struct.FILE_POS = type { i8, i8, i16, i32 }
+ %struct.FIRST_UNION = type { %struct.FILE_POS }
+ %struct.FOURTH_UNION = type { %struct.CONSTRAINT }
+ %struct.GAP = type { i8, i8, i16 }
+ %struct.LIST = type { %struct.rec*, %struct.rec* }
+ %struct.SECOND_UNION = type { { i16, i8, i8 } }
+ %struct.STYLE = type { { %struct.GAP }, { %struct.GAP }, i16, i16, i16, i8, i8 }
+ %struct.THIRD_UNION = type { { [2 x i32], [2 x i32] } }
+ %struct.closure_type = type { [2 x %struct.LIST], %struct.FIRST_UNION, %struct.SECOND_UNION, %struct.THIRD_UNION, %struct.FOURTH_UNION, %struct.rec*, { %struct.rec* } }
+ %struct.head_type = type { [2 x %struct.LIST], %struct.FIRST_UNION, %struct.SECOND_UNION, %struct.THIRD_UNION, %struct.FOURTH_UNION, %struct.rec*, { %struct.rec* }, %struct.rec*, %struct.rec*, %struct.rec*, %struct.rec*, %struct.rec*, %struct.rec*, %struct.rec*, %struct.rec*, i32 }
+ %struct.rec = type { %struct.head_type }
+
+
+define i32 @test(%struct.closure_type* %tmp18169) {
+ %tmp18174 = getelementptr %struct.closure_type* %tmp18169, i32 0, i32 4, i32 0, i32 0 ; <i32*> [#uses=2]
+ %tmp18269 = bitcast i32* %tmp18174 to %struct.STYLE* ; <%struct.STYLE*> [#uses=1]
+ %A = load i32* %tmp18174 ; <i32> [#uses=1]
+
+ %tmp18272 = getelementptr %struct.STYLE* %tmp18269, i32 0, i32 0, i32 0, i32 2 ; <i16*> [#uses=1]
+ store i16 123, i16* %tmp18272
+
+ %Q = load i32* %tmp18174 ; <i32> [#uses=1]
+ %Z = sub i32 %A, %Q ; <i32> [#uses=1]
+ ret i32 %Z
+}
diff --git a/test/Analysis/BasicAA/dg.exp b/test/Analysis/BasicAA/dg.exp
new file mode 100644
index 0000000..879685c
--- /dev/null
+++ b/test/Analysis/BasicAA/dg.exp
@@ -0,0 +1,3 @@
+load_lib llvm.exp
+
+RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]]
diff --git a/test/Analysis/BasicAA/featuretest.ll b/test/Analysis/BasicAA/featuretest.ll
new file mode 100644
index 0000000..52e0a52
--- /dev/null
+++ b/test/Analysis/BasicAA/featuretest.ll
@@ -0,0 +1,85 @@
+; This testcase tests for various features the basicaa test should be able to
+; determine, as noted in the comments.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -load-vn -gcse -instcombine -dce | llvm-dis | not grep REMOVE
+
+%Global = external global { int }
+
+implementation
+
+
+; Array test: Test that operations on one local array do not invalidate
+; operations on another array. Important for scientific codes.
+;
+int %different_array_test(long %A, long %B) {
+ %Array1 = alloca int, uint 100
+ %Array2 = alloca int, uint 200
+
+ %pointer = getelementptr int* %Array1, long %A
+ %val = load int* %pointer
+
+ %pointer2 = getelementptr int* %Array2, long %B
+ store int 7, int* %pointer2
+
+ %REMOVE = load int* %pointer ; redundant with above load
+ %retval = sub int %REMOVE, %val
+ ret int %retval
+}
+
+; Constant index test: Constant indexes into the same array should not
+; interfere with each other. Again, important for scientific codes.
+;
+int %constant_array_index_test() {
+ %Array = alloca int, uint 100
+ %P1 = getelementptr int* %Array, long 7
+ %P2 = getelementptr int* %Array, long 6
+
+ %A = load int* %P1
+ store int 1, int* %P2 ; Should not invalidate load
+ %BREMOVE = load int* %P1
+ %Val = sub int %A, %BREMOVE
+ ret int %Val
+}
+
+; Test that if two pointers are spaced out by a constant getelementptr, that
+; they cannot alias.
+int %gep_distance_test(int* %A) {
+ %REMOVEu = load int* %A
+ %B = getelementptr int* %A, long 2 ; Cannot alias A
+ store int 7, int* %B
+ %REMOVEv = load int* %A
+ %r = sub int %REMOVEu, %REMOVEv
+ ret int %r
+}
+
+; Test that if two pointers are spaced out by a constant offset, that they
+; cannot alias, even if there is a variable offset between them...
+int %gep_distance_test2({int,int}* %A, long %distance) {
+ %A = getelementptr {int,int}* %A, long 0, uint 0
+ %REMOVEu = load int* %A
+ %B = getelementptr {int,int}* %A, long %distance, uint 1
+ store int 7, int* %B ; B cannot alias A, it's at least 4 bytes away
+ %REMOVEv = load int* %A
+ %r = sub int %REMOVEu, %REMOVEv
+ ret int %r
+}
+
+; Test that we can do funny pointer things and that distance calc will still
+; work.
+int %gep_distance_test3(int * %A) {
+ %X = load int* %A
+ %B = cast int* %A to sbyte*
+ %C = getelementptr sbyte* %B, long 4
+ %Y = load sbyte* %C
+ ret int 8
+}
+
+; Test that we can disambiguate globals reached through constantexpr geps
+int %constexpr_test() {
+ %X = alloca int
+ %Y = load int* %X
+ store int 5, int* getelementptr ({ int }* %Global, long 0, uint 0)
+ %REMOVE = load int* %X
+ %retval = sub int %Y, %REMOVE
+ ret int %retval
+}
diff --git a/test/Analysis/BasicAA/gcsetest.ll b/test/Analysis/BasicAA/gcsetest.ll
new file mode 100644
index 0000000..cd1286f
--- /dev/null
+++ b/test/Analysis/BasicAA/gcsetest.ll
@@ -0,0 +1,46 @@
+; Test that GCSE uses basicaa to do alias analysis, which is capable of
+; disambiguating some obvious cases. All loads should be removable in
+; this testcase.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -load-vn -gcse -instcombine -dce | llvm-dis | not grep load
+
+%A = global int 7
+%B = global int 8
+implementation
+
+int %test() {
+ %A1 = load int* %A
+
+ store int 123, int* %B ; Store cannot alias %A
+
+ %A2 = load int* %A
+ %X = sub int %A1, %A2
+ ret int %X
+}
+
+int %test2() {
+ %A1 = load int* %A
+ br label %Loop
+Loop:
+ %AP = phi int [0, %0], [%X, %Loop]
+ store int %AP, int* %B ; Store cannot alias %A
+
+ %A2 = load int* %A
+ %X = sub int %A1, %A2
+ %c = seteq int %X, 0
+ br bool %c, label %out, label %Loop
+
+out:
+ ret int %X
+}
+
+declare void %external()
+
+int %test3() {
+ %X = alloca int
+ store int 7, int* %X
+ call void %external()
+ %V = load int* %X
+ ret int %V
+}
+
diff --git a/test/Analysis/BasicAA/global-size.ll b/test/Analysis/BasicAA/global-size.ll
new file mode 100644
index 0000000..5e75249
--- /dev/null
+++ b/test/Analysis/BasicAA/global-size.ll
@@ -0,0 +1,17 @@
+; A store or load cannot alias a global if the accessed amount is larger then
+; the global.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -load-vn -gcse -instcombine | llvm-dis | not grep load
+
+%B = global short 8
+
+implementation
+
+short %test(int *%P) {
+ %X = load short* %B
+ store int 7, int* %P
+ %Y = load short* %B
+ %Z = sub short %Y, %X
+ ret short %Z
+}
+
diff --git a/test/Analysis/BasicAA/licmtest.ll b/test/Analysis/BasicAA/licmtest.ll
new file mode 100644
index 0000000..0b13943
--- /dev/null
+++ b/test/Analysis/BasicAA/licmtest.ll
@@ -0,0 +1,42 @@
+; Test that LICM uses basicaa to do alias analysis, which is capable of
+; disambiguating some obvious cases. If LICM is able to disambiguate the
+; two pointers, then the load should be hoisted, and the store sunk. Thus
+; the loop becomes empty and can be deleted by ADCE.
+
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -licm --adce | llvm-dis | not grep Loop
+
+%A = global int 7
+%B = global int 8
+%C = global [2 x int ] [ int 4, int 8 ]
+implementation
+
+int %test(bool %c) {
+ %Atmp = load int* %A
+ br label %Loop
+Loop:
+ %ToRemove = load int* %A
+ store int %Atmp, int* %B ; Store cannot alias %A
+
+ br bool %c, label %Out, label %Loop
+Out:
+ %X = sub int %ToRemove, %Atmp
+ ret int %X
+}
+
+int %test2(bool %c) {
+ br label %Loop
+Loop:
+ %AVal = load int* %A
+ %C0 = getelementptr [2 x int ]* %C, long 0, long 0
+ store int %AVal, int* %C0 ; Store cannot alias %A
+
+ %BVal = load int* %B
+ %C1 = getelementptr [2 x int ]* %C, long 0, long 1
+ store int %BVal, int* %C1 ; Store cannot alias %A, %B, or %C0
+
+ br bool %c, label %Out, label %Loop
+Out:
+ %X = sub int %AVal, %BVal
+ ret int %X
+}
+
diff --git a/test/Analysis/BasicAA/modref.ll b/test/Analysis/BasicAA/modref.ll
new file mode 100644
index 0000000..adf195e
--- /dev/null
+++ b/test/Analysis/BasicAA/modref.ll
@@ -0,0 +1,16 @@
+; A very rudimentary test on AliasAnalysis::getModRefInfo.
+; RUN: llvm-upgrade < %s | llvm-as | \
+; RUN: opt -print-all-alias-modref-info -aa-eval -disable-output |& \
+; RUN: not grep NoModRef
+
+int %callee() {
+ %X = alloca { int, int }
+ %Y = getelementptr { int, int }* %X, uint 0, uint 0
+ %Z = load int* %Y
+ ret int %Z
+}
+
+int %caller() {
+ %X = call int %callee()
+ ret int %X
+}
diff --git a/test/Analysis/BasicAA/tailcall-modref.ll b/test/Analysis/BasicAA/tailcall-modref.ll
new file mode 100644
index 0000000..9d447d9
--- /dev/null
+++ b/test/Analysis/BasicAA/tailcall-modref.ll
@@ -0,0 +1,17 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -basicaa -load-vn -gcse -instcombine |\
+; RUN: llvm-dis | grep {ret i32 0}
+declare void %foo(int*)
+declare void %bar()
+
+int %test() {
+ %A = alloca int
+ call void %foo(int* %A)
+
+ %X = load int* %A
+ tail call void %bar() ;; Cannot modify *%A because it's on the stack.
+ %Y = load int* %A
+ %Z = sub int %X, %Y
+ ret int %Z
+}
+
+