Speculatively revert r8644[3-5], they seem to be leading to infinite loops in
[oota-llvm.git] / test / Transforms / InstCombine / phi.ll
1 ; This test makes sure that these instructions are properly eliminated.
2 ;
3 ; RUN: opt < %s -instcombine -S | FileCheck %s
4
5 define i32 @test1(i32 %A, i1 %b) {
6 BB0:
7         br i1 %b, label %BB1, label %BB2
8
9 BB1:
10         ; Combine away one argument PHI nodes
11         %B = phi i32 [ %A, %BB0 ]               
12         ret i32 %B
13
14 BB2:
15         ret i32 %A
16 ; CHECK: @test1
17 ; CHECK: BB1:
18 ; CHECK-NEXT: ret i32 %A
19 }
20
21 define i32 @test2(i32 %A, i1 %b) {
22 BB0:
23         br i1 %b, label %BB1, label %BB2
24
25 BB1:
26         br label %BB2
27
28 BB2:
29         ; Combine away PHI nodes with same values
30         %B = phi i32 [ %A, %BB0 ], [ %A, %BB1 ]         
31         ret i32 %B
32 ; CHECK: @test2
33 ; CHECK: BB2:
34 ; CHECK-NEXT: ret i32 %A
35 }
36
37 define i32 @test3(i32 %A, i1 %b) {
38 BB0:
39         br label %Loop
40
41 Loop:
42         ; PHI has same value always.
43         %B = phi i32 [ %A, %BB0 ], [ %B, %Loop ]
44         br i1 %b, label %Loop, label %Exit
45
46 Exit:
47         ret i32 %B
48 ; CHECK: @test3
49 ; CHECK: Exit:
50 ; CHECK-NEXT: ret i32 %A
51 }
52
53 define i32 @test4(i1 %b) {
54 BB0:
55         ; Loop is unreachable
56         ret i32 7
57
58 Loop:           ; preds = %L2, %Loop
59         ; PHI has same value always.
60         %B = phi i32 [ %B, %L2 ], [ %B, %Loop ]         
61         br i1 %b, label %L2, label %Loop
62
63 L2:             ; preds = %Loop
64         br label %Loop
65 ; CHECK: @test4
66 ; CHECK: Loop:
67 ; CHECK-NEXT: br i1 %b
68 }
69
70 define i32 @test5(i32 %A, i1 %b) {
71 BB0:
72         br label %Loop
73
74 Loop:           ; preds = %Loop, %BB0
75         ; PHI has same value always.
76         %B = phi i32 [ %A, %BB0 ], [ undef, %Loop ]             
77         br i1 %b, label %Loop, label %Exit
78
79 Exit:           ; preds = %Loop
80         ret i32 %B
81 ; CHECK: @test5
82 ; CHECK: Loop:
83 ; CHECK-NEXT: br i1 %b
84 ; CHECK: Exit:
85 ; CHECK-NEXT: ret i32 %A
86 }
87
88 define i32 @test6(i16 %A, i1 %b) {
89 BB0:
90         %X = zext i16 %A to i32              
91         br i1 %b, label %BB1, label %BB2
92
93 BB1:           
94         %Y = zext i16 %A to i32              
95         br label %BB2
96
97 BB2:           
98         ;; Suck casts into phi
99         %B = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]         
100         ret i32 %B
101 ; CHECK: @test6
102 ; CHECK: BB2:
103 ; CHECK: zext i16 %A to i32
104 ; CHECK-NEXT: ret i32
105 }
106
107 define i32 @test7(i32 %A, i1 %b) {
108 BB0:
109         br label %Loop
110
111 Loop:           ; preds = %Loop, %BB0
112         ; PHI is dead.
113         %B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]                
114         %C = add i32 %B, 123            
115         br i1 %b, label %Loop, label %Exit
116
117 Exit:           ; preds = %Loop
118         ret i32 0
119 ; CHECK: @test7
120 ; CHECK: Loop:
121 ; CHECK-NEXT: br i1 %b
122 }
123
124 define i32* @test8({ i32, i32 } *%A, i1 %b) {
125 BB0:
126         %X = getelementptr { i32, i32 } *%A, i32 0, i32 1
127         br i1 %b, label %BB1, label %BB2
128
129 BB1:
130         %Y = getelementptr { i32, i32 } *%A, i32 0, i32 1
131         br label %BB2
132
133 BB2:
134         ;; Suck GEPs into phi
135         %B = phi i32* [ %X, %BB0 ], [ %Y, %BB1 ]
136         ret i32* %B
137 ; CHECK: @test8
138 ; CHECK-NOT: phi
139 ; CHECK: BB2:
140 ; CHECK-NEXT: %B = getelementptr 
141 ; CHECK-NEXT: ret i32* %B
142 }
143
144 define i32 @test9(i32* %A, i32* %B) {
145 entry:
146   %c = icmp eq i32* %A, null
147   br i1 %c, label %bb1, label %bb
148
149 bb:
150   %C = load i32* %B, align 1
151   br label %bb2
152
153 bb1:
154   %D = load i32* %A, align 1
155   br label %bb2
156
157 bb2:
158   %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
159   ret i32 %E
160 ; CHECK: @test9
161 ; CHECK:       bb2:
162 ; CHECK-NEXT:        phi i32* [ %B, %bb ], [ %A, %bb1 ]
163 ; CHECK-NEXT:   %E = load i32* %{{[^,]*}}, align 1
164 ; CHECK-NEXT:   ret i32 %E
165
166 }
167
168 define i32 @test10(i32* %A, i32* %B) {
169 entry:
170   %c = icmp eq i32* %A, null
171   br i1 %c, label %bb1, label %bb
172
173 bb:
174   %C = load i32* %B, align 16
175   br label %bb2
176
177 bb1:
178   %D = load i32* %A, align 32
179   br label %bb2
180
181 bb2:
182   %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
183   ret i32 %E
184 ; CHECK: @test10
185 ; CHECK:       bb2:
186 ; CHECK-NEXT:        phi i32* [ %B, %bb ], [ %A, %bb1 ]
187 ; CHECK-NEXT:   %E = load i32* %{{[^,]*}}, align 16
188 ; CHECK-NEXT:   ret i32 %E
189 }
190
191
192 ; PR1777
193 declare i1 @test11a()
194
195 define i1 @test11() {
196 entry:
197   %a = alloca i32
198   %i = ptrtoint i32* %a to i32
199   %b = call i1 @test11a()
200   br i1 %b, label %one, label %two
201
202 one:
203   %x = phi i32 [%i, %entry], [%y, %two]
204   %c = call i1 @test11a()
205   br i1 %c, label %two, label %end
206
207 two:
208   %y = phi i32 [%i, %entry], [%x, %one]
209   %d = call i1 @test11a()
210   br i1 %d, label %one, label %end
211
212 end:
213   %f = phi i32 [ %x, %one], [%y, %two]
214   ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter
215   ; even though %f must equal %i at this point
216   %g = inttoptr i32 %f to i32*
217   store i32 10, i32* %g
218   %z = call i1 @test11a()
219   ret i1 %z
220 ; CHECK: @test11
221 ; CHECK-NOT: phi i32
222 ; CHECK: ret i1 %z
223 }
224