Make BasicAliasAnalysis a normal AliasAnalysis implementation which
[oota-llvm.git] / test / Analysis / BasicAA / gep-alias.ll
1 ; RUN: opt < %s -basicaa -gvn -instcombine -S |& FileCheck %s
2
3 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"
4
5 ; Make sure that basicaa thinks R and r are must aliases.
6 define i32 @test1(i8 * %P) {
7 entry:
8         %Q = bitcast i8* %P to {i32, i32}*
9         %R = getelementptr {i32, i32}* %Q, i32 0, i32 1
10         %S = load i32* %R
11
12         %q = bitcast i8* %P to {i32, i32}*
13         %r = getelementptr {i32, i32}* %q, i32 0, i32 1
14         %s = load i32* %r
15
16         %t = sub i32 %S, %s
17         ret i32 %t
18 ; CHECK: @test1
19 ; CHECK: ret i32 0
20 }
21
22 define i32 @test2(i8 * %P) {
23 entry:
24         %Q = bitcast i8* %P to {i32, i32, i32}*
25         %R = getelementptr {i32, i32, i32}* %Q, i32 0, i32 1
26         %S = load i32* %R
27
28         %r = getelementptr {i32, i32, i32}* %Q, i32 0, i32 2
29   store i32 42, i32* %r
30
31         %s = load i32* %R
32
33         %t = sub i32 %S, %s
34         ret i32 %t
35 ; CHECK: @test2
36 ; CHECK: ret i32 0
37 }
38
39
40 ; This was a miscompilation.
41 define i32 @test3({float, {i32, i32, i32}}* %P) {
42 entry:
43   %P2 = getelementptr {float, {i32, i32, i32}}* %P, i32 0, i32 1
44         %R = getelementptr {i32, i32, i32}* %P2, i32 0, i32 1
45         %S = load i32* %R
46
47         %r = getelementptr {i32, i32, i32}* %P2, i32 0, i32 2
48   store i32 42, i32* %r
49
50         %s = load i32* %R
51
52         %t = sub i32 %S, %s
53         ret i32 %t
54 ; CHECK: @test3
55 ; CHECK: ret i32 0
56 }
57
58
59 ;; This is reduced from the SmallPtrSet constructor.
60 %SmallPtrSetImpl = type { i8**, i32, i32, i32, [1 x i8*] }
61 %SmallPtrSet64 = type { %SmallPtrSetImpl, [64 x i8*] }
62
63 define i32 @test4(%SmallPtrSet64* %P) {
64 entry:
65   %tmp2 = getelementptr inbounds %SmallPtrSet64* %P, i64 0, i32 0, i32 1
66   store i32 64, i32* %tmp2, align 8
67   %tmp3 = getelementptr inbounds %SmallPtrSet64* %P, i64 0, i32 0, i32 4, i64 64
68   store i8* null, i8** %tmp3, align 8
69   %tmp4 = load i32* %tmp2, align 8
70         ret i32 %tmp4
71 ; CHECK: @test4
72 ; CHECK: ret i32 64
73 }
74
75 ; P[i] != p[i+1]
76 define i32 @test5(i32* %p, i64 %i) {
77   %pi = getelementptr i32* %p, i64 %i
78   %i.next = add i64 %i, 1
79   %pi.next = getelementptr i32* %p, i64 %i.next
80   %x = load i32* %pi
81   store i32 42, i32* %pi.next
82   %y = load i32* %pi
83   %z = sub i32 %x, %y
84   ret i32 %z
85 ; CHECK: @test5
86 ; CHECK: ret i32 0
87 }
88
89 ; P[i] != p[(i*4)|1]
90 define i32 @test6(i32* %p, i64 %i1) {
91   %i = shl i64 %i1, 2
92   %pi = getelementptr i32* %p, i64 %i
93   %i.next = or i64 %i, 1
94   %pi.next = getelementptr i32* %p, i64 %i.next
95   %x = load i32* %pi
96   store i32 42, i32* %pi.next
97   %y = load i32* %pi
98   %z = sub i32 %x, %y
99   ret i32 %z
100 ; CHECK: @test6
101 ; CHECK: ret i32 0
102 }
103
104 ; P[1] != P[i*4]
105 define i32 @test7(i32* %p, i64 %i) {
106   %pi = getelementptr i32* %p, i64 1
107   %i.next = shl i64 %i, 2
108   %pi.next = getelementptr i32* %p, i64 %i.next
109   %x = load i32* %pi
110   store i32 42, i32* %pi.next
111   %y = load i32* %pi
112   %z = sub i32 %x, %y
113   ret i32 %z
114 ; CHECK: @test7
115 ; CHECK: ret i32 0
116 }
117
118 ; P[zext(i)] != p[zext(i+1)]
119 ; PR1143
120 define i32 @test8(i32* %p, i16 %i) {
121   %i1 = zext i16 %i to i32
122   %pi = getelementptr i32* %p, i32 %i1
123   %i.next = add i16 %i, 1
124   %i.next2 = zext i16 %i.next to i32
125   %pi.next = getelementptr i32* %p, i32 %i.next2
126   %x = load i32* %pi
127   store i32 42, i32* %pi.next
128   %y = load i32* %pi
129   %z = sub i32 %x, %y
130   ret i32 %z
131 ; CHECK: @test8
132 ; CHECK: ret i32 0
133 }
134
135 define i8 @test9([4 x i8] *%P, i32 %i, i32 %j) {
136   %i2 = shl i32 %i, 2
137   %i3 = add i32 %i2, 1
138   ; P2 = P + 1 + 4*i
139   %P2 = getelementptr [4 x i8] *%P, i32 0, i32 %i3
140
141   %j2 = shl i32 %j, 2
142   
143   ; P4 = P + 4*j
144   %P4 = getelementptr [4 x i8]* %P, i32 0, i32 %j2
145
146   %x = load i8* %P2
147   store i8 42, i8* %P4
148   %y = load i8* %P2
149   %z = sub i8 %x, %y
150   ret i8 %z
151 ; CHECK: @test9
152 ; CHECK: ret i8 0
153 }
154
155 define i8 @test10([4 x i8] *%P, i32 %i) {
156   %i2 = shl i32 %i, 2
157   %i3 = add i32 %i2, 4
158   ; P2 = P + 4 + 4*i
159   %P2 = getelementptr [4 x i8] *%P, i32 0, i32 %i3
160   
161   ; P4 = P + 4*i
162   %P4 = getelementptr [4 x i8]* %P, i32 0, i32 %i2
163
164   %x = load i8* %P2
165   store i8 42, i8* %P4
166   %y = load i8* %P2
167   %z = sub i8 %x, %y
168   ret i8 %z
169 ; CHECK: @test10
170 ; CHECK: ret i8 0
171 }