1 ; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
3 @a = external global i32 ; <i32*> [#uses=7]
6 define i32 @test1() nounwind {
8 %0 = load i32, i32* @a, align 4
10 br i1 %1, label %bb, label %bb1
16 %2 = load i32, i32* @a, align 4
17 %3 = icmp eq i32 %2, 5
18 br i1 %3, label %bb2, label %bb3
24 %4 = load i32, i32* @a, align 4
25 %5 = icmp eq i32 %4, 4
26 ; CHECK: br i1 false, label %bb4, label %bb5
27 br i1 %5, label %bb4, label %bb5
30 %6 = load i32, i32* @a, align 4
35 %8 = load i32, i32* @a, align 4
36 %9 = icmp eq i32 %8, 5
37 ; CHECK: br i1 false, label %bb6, label %bb7
38 br i1 %9, label %bb6, label %bb7
41 %10 = load i32, i32* @a, align 4
46 %12 = load i32, i32* @a, align 4
49 bb8: ; preds = %bb7, %bb6, %bb4, %bb2, %bb
50 %.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
53 return: ; preds = %bb8
58 declare void @bar(i32)
60 ; CHECK-LABEL: @test3(
61 define void @test3(i32 %x, i32 %y) {
62 %xz = icmp eq i32 %x, 0
63 %yz = icmp eq i32 %y, 0
65 br i1 %z, label %both_zero, label %nope
67 call void @foo(i1 %xz)
68 ; CHECK: call void @foo(i1 true)
69 call void @foo(i1 %yz)
70 ; CHECK: call void @foo(i1 true)
71 call void @bar(i32 %x)
72 ; CHECK: call void @bar(i32 0)
73 call void @bar(i32 %y)
74 ; CHECK: call void @bar(i32 0)
78 ; CHECK: call void @foo(i1 false)
82 ; CHECK-LABEL: @test4(
83 define void @test4(i1 %b, i32 %x) {
84 br i1 %b, label %sw, label %case3
86 switch i32 %x, label %default [
95 call void @bar(i32 %x)
96 ; CHECK: call void @bar(i32 %x)
100 call void @bar(i32 %x)
101 ; CHECK: call void @bar(i32 %x)
105 call void @bar(i32 %x)
106 ; CHECK: call void @bar(i32 1)
110 call void @bar(i32 %x)
111 ; CHECK: call void @bar(i32 %x)
115 ; CHECK-LABEL: @test5(
116 define i1 @test5(i32 %x, i32 %y) {
117 %cmp = icmp eq i32 %x, %y
118 br i1 %cmp, label %same, label %different
121 %cmp2 = icmp ne i32 %x, %y
122 ; CHECK: ret i1 false
126 %cmp3 = icmp eq i32 %x, %y
127 ; CHECK: ret i1 false
131 ; CHECK-LABEL: @test6(
132 define i1 @test6(i32 %x, i32 %y) {
133 %cmp2 = icmp ne i32 %x, %y
134 %cmp = icmp eq i32 %x, %y
135 %cmp3 = icmp eq i32 %x, %y
136 br i1 %cmp, label %same, label %different
139 ; CHECK: ret i1 false
143 ; CHECK: ret i1 false
147 ; CHECK-LABEL: @test6_fp(
148 define i1 @test6_fp(float %x, float %y) {
149 %cmp2 = fcmp une float %x, %y
150 %cmp = fcmp oeq float %x, %y
151 %cmp3 = fcmp oeq float %x, %y
152 br i1 %cmp, label %same, label %different
155 ; CHECK: ret i1 false
159 ; CHECK: ret i1 false
163 ; CHECK-LABEL: @test7(
164 define i1 @test7(i32 %x, i32 %y) {
165 %cmp = icmp sgt i32 %x, %y
166 br i1 %cmp, label %same, label %different
169 %cmp2 = icmp sle i32 %x, %y
170 ; CHECK: ret i1 false
174 %cmp3 = icmp sgt i32 %x, %y
175 ; CHECK: ret i1 false
179 ; CHECK-LABEL: @test7_fp(
180 define i1 @test7_fp(float %x, float %y) {
181 %cmp = fcmp ogt float %x, %y
182 br i1 %cmp, label %same, label %different
185 %cmp2 = fcmp ule float %x, %y
186 ; CHECK: ret i1 false
190 %cmp3 = fcmp ogt float %x, %y
191 ; CHECK: ret i1 false
195 ; CHECK-LABEL: @test8(
196 define i1 @test8(i32 %x, i32 %y) {
197 %cmp2 = icmp sle i32 %x, %y
198 %cmp = icmp sgt i32 %x, %y
199 %cmp3 = icmp sgt i32 %x, %y
200 br i1 %cmp, label %same, label %different
203 ; CHECK: ret i1 false
207 ; CHECK: ret i1 false
211 ; CHECK-LABEL: @test8_fp(
212 define i1 @test8_fp(float %x, float %y) {
213 %cmp2 = fcmp ule float %x, %y
214 %cmp = fcmp ogt float %x, %y
215 %cmp3 = fcmp ogt float %x, %y
216 br i1 %cmp, label %same, label %different
219 ; CHECK: ret i1 false
223 ; CHECK: ret i1 false
228 ; CHECK-LABEL: @test9(
229 define i32 @test9(i32 %i, i32 %j) {
230 %cmp = icmp eq i32 %i, %j
231 br i1 %cmp, label %cond_true, label %ret
234 %diff = sub i32 %i, %j
244 ; CHECK-LABEL: @test10(
245 define i32 @test10(i32 %j, i32 %i) {
246 %cmp = icmp eq i32 %i, %j
247 br i1 %cmp, label %cond_true, label %ret
250 %diff = sub i32 %i, %j
259 declare i32 @yogibar()
261 ; CHECK-LABEL: @test11(
262 define i32 @test11(i32 %x) {
263 %v0 = call i32 @yogibar()
264 %v1 = call i32 @yogibar()
265 %cmp = icmp eq i32 %v0, %v1
266 br i1 %cmp, label %cond_true, label %next
273 %cmp2 = icmp eq i32 %x, %v0
274 br i1 %cmp2, label %cond_true2, label %next2
284 ; CHECK-LABEL: @test12(
285 define i32 @test12(i32 %x) {
286 %cmp = icmp eq i32 %x, 0
287 br i1 %cmp, label %cond_true, label %cond_false
296 %res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]
297 ; CHECK: %res = phi i32 [ 0, %cond_true ], [ %x, %cond_false ]
301 ; On the path from entry->if->end we know that ptr1==ptr2, so we can determine
302 ; that gep2 does not alias ptr1 on that path (as it would require that
303 ; ptr2==ptr2+2), so we can perform PRE of the load.
304 ; CHECK-LABEL: @test13
305 define i32 @test13(i32* %ptr1, i32* %ptr2) {
306 ; CHECK-LABEL: entry:
308 %gep1 = getelementptr i32, i32* %ptr2, i32 1
309 %gep2 = getelementptr i32, i32* %ptr2, i32 2
310 %cmp = icmp eq i32* %ptr1, %ptr2
311 br i1 %cmp, label %if, label %end
313 ; CHECK: [[CRIT_EDGE:.*]]:
314 ; CHECK: %[[PRE:.*]] = load i32, i32* %gep2, align 4
318 %val1 = load i32, i32* %gep2, align 4
322 ; CHECK: %val2 = phi i32 [ %val1, %if ], [ %[[PRE]], %[[CRIT_EDGE]] ]
325 %phi1 = phi i32* [ %ptr1, %if ], [ %gep1, %entry ]
326 %phi2 = phi i32 [ %val1, %if ], [ 0, %entry ]
327 store i32 0, i32* %phi1, align 4
328 %val2 = load i32, i32* %gep2, align 4
329 %ret = add i32 %phi2, %val2
333 ; CHECK-LABEL: @test14
334 define void @test14(i32* %ptr1, i32* noalias %ptr2) {
336 %gep1 = getelementptr inbounds i32, i32* %ptr1, i32 1
337 %gep2 = getelementptr inbounds i32, i32* %ptr1, i32 2
342 %phi1 = phi i32* [ %gep3, %loop.end ], [ %gep1, %entry ]
343 br i1 undef, label %if1, label %then
345 ; CHECK: [[CRIT_EDGE:.*]]:
346 ; CHECK: %[[PRE:.*]] = load i32, i32* %gep2, align 4
349 ; CHECK: %val2 = phi i32 [ %[[PRE]], %[[CRIT_EDGE]] ], [ %val3, %loop.end ]
352 %val2 = load i32, i32* %gep2, align 4
353 store i32 %val2, i32* %gep2, align 4
354 store i32 0, i32* %phi1, align 4
359 %cmp = icmp eq i32* %gep2, %ptr2
360 br i1 %cmp, label %loop.end, label %if2
366 %phi3 = phi i32* [ %gep2, %then ], [ %ptr1, %if2 ]
367 %val3 = load i32, i32* %gep2, align 4
368 store i32 %val3, i32* %phi3, align 4
369 %gep3 = getelementptr inbounds i32, i32* %ptr1, i32 1
370 br i1 undef, label %loop, label %if1