Teach basicaa that x|c == x+c when the c bits of x are clear. This
[oota-llvm.git] / test / Analysis / BasicAA / gep-alias.ll
1 ; RUN: opt < %s -gvn -instcombine -S |& FileCheck %s
2 ; Make sure that basicaa thinks R and r are must aliases.
3
4 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"
5
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