[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Analysis / PhiValues / basic.ll
blobca013828368c9f60ebb741823c50cbcaeef238d9
1 ; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s
3 @X = common global i32 0
5 ; CHECK-LABEL: PHI Values for function: simple
6 define void @simple(i32* %ptr) {
7 entry:
8   br i1 undef, label %if, label %else
10 if:
11   br label %end
13 else:
14   br label %end
16 end:
17 ; CHECK: PHI %phi1 has values:
18 ; CHECK-DAG: i32 0
19 ; CHECK-DAG: i32 1
20   %phi1 = phi i32 [ 0, %if ], [ 1, %else ]
21 ; CHECK: PHI %phi2 has values:
22 ; CHECK-DAG: @X
23 ; CHECK-DAG: %ptr
24   %phi2 = phi i32* [ @X, %if ], [ %ptr, %else ]
25   ret void
28 ; CHECK-LABEL: PHI Values for function: chain
29 define void @chain() {
30 entry:
31   br i1 undef, label %if1, label %else1
33 if1:
34   br label %middle
36 else1:
37   br label %middle
39 middle:
40 ; CHECK: PHI %phi1 has values:
41 ; CHECK-DAG: i32 0
42 ; CHECK-DAG: i32 1
43   %phi1 = phi i32 [ 0, %if1 ], [ 1, %else1 ]
44   br i1 undef, label %if2, label %else2
46 if2:
47   br label %end
49 else2:
50   br label %end
52 end:
53 ; CHECK: PHI %phi2 has values:
54 ; CHECK-DAG: i32 0
55 ; CHECK-DAG: i32 1
56 ; CHECK-DAG: i32 2
57   %phi2 = phi i32 [ %phi1, %if2 ], [ 2, %else2 ]
58   ret void
61 ; CHECK-LABEL: PHI Values for function: no_values
62 define void @no_values() {
63 entry:
64   ret void
66 unreachable:
67 ; CHECK: PHI %phi has values:
68 ; CHECK-DAG: NONE
69   %phi = phi i32 [ %phi, %unreachable ]
70   br label %unreachable
73 ; CHECK-LABEL: PHI Values for function: simple_loop
74 define void @simple_loop() {
75 entry:
76   br label %loop
78 loop:
79 ; CHECK: PHI %phi has values:
80 ; CHECK-DAG: i32 0
81   %phi = phi i32 [ 0, %entry ], [ %phi, %loop ]
82   br i1 undef, label %loop, label %end
84 end:
85   ret void
88 ; CHECK-LABEL: PHI Values for function: complex_loop
89 define void @complex_loop() {
90 entry:
91   br i1 undef, label %loop, label %end
93 loop:
94 ; CHECK: PHI %phi1 has values:
95 ; CHECK-DAG: i32 0
96 ; CHECK-DAG: i32 1
97   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %then ]
98   br i1 undef, label %if, label %else
101   br label %then
103 else:
104   br label %then
106 then:
107 ; CHECK: PHI %phi2 has values:
108 ; CHECK-DAG: i32 0
109 ; CHECK-DAG: i32 1
110   %phi2 = phi i32 [ %phi1, %if ], [ 1, %else ]
111   br i1 undef, label %loop, label %end
113 end:
114 ; CHECK: PHI %phi3 has values:
115 ; CHECK-DAG: i32 0
116 ; CHECK-DAG: i32 1
117 ; CHECK-DAG: i32 2
118   %phi3 = phi i32 [ 2, %entry ], [ %phi2, %then ]
119   ret void
122 ; CHECK-LABEL: PHI Values for function: strange_loop
123 define void @strange_loop() {
124 entry:
125   br i1 undef, label %ifelse, label %inloop
127 loop:
128 ; CHECK: PHI %phi1 has values:
129 ; CHECK-DAG: i32 0
130 ; CHECK-DAG: i32 1
131 ; CHECK-DAG: i32 2
132 ; CHECK-DAG: i32 3
133   %phi1 = phi i32 [ %phi3, %if ], [ 0, %else ], [ %phi2, %inloop ]
134   br i1 undef, label %inloop, label %end
136 inloop:
137 ; CHECK: PHI %phi2 has values:
138 ; CHECK-DAG: i32 0
139 ; CHECK-DAG: i32 1
140 ; CHECK-DAG: i32 2
141 ; CHECK-DAG: i32 3
142   %phi2 = phi i32 [ %phi1, %loop ], [ 1, %entry ]
143   br i1 undef, label %ifelse, label %loop
145 ifelse:
146 ; CHECK: PHI %phi3 has values:
147 ; CHECK-DAG: i32 2
148 ; CHECK-DAG: i32 3
149   %phi3 = phi i32 [ 2, %entry ], [ 3, %inloop ]
150   br i1 undef, label %if, label %else
153   br label %loop
155 else:
156   br label %loop
158 end:
159   ret void
162 ; CHECK-LABEL: PHI Values for function: mutual_loops
163 define void @mutual_loops() {
164 entry:
165   br i1 undef, label %loop1, label %loop2
167 loop1:
168 ; CHECK: PHI %phi1 has values:
169 ; CHECK-DAG: 0
170 ; CHECK-DAG: 1
171 ; CHECK-DAG: 2
172 ; CHECK-DAG: 3
173 ; CHECK-DAG: 4
174   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop1.then ], [ %phi3, %loop2.if ]
175   br i1 undef, label %loop1.if, label %loop1.else
177 loop1.if:
178   br i1 undef, label %loop1.then, label %loop2
180 loop1.else:
181   br label %loop1.then
183 loop1.then:
184 ; CHECK: PHI %phi2 has values:
185 ; CHECK-DAG: 0
186 ; CHECK-DAG: 1
187 ; CHECK-DAG: 2
188 ; CHECK-DAG: 3
189 ; CHECK-DAG: 4
190   %phi2 = phi i32 [ 1, %loop1.if ], [ %phi1, %loop1.else ]
191   br i1 undef, label %loop1, label %end
193 loop2:
194 ; CHECK: PHI %phi3 has values:
195 ; CHECK-DAG: 2
196 ; CHECK-DAG: 3
197 ; CHECK-DAG: 4
198   %phi3 = phi i32 [ 2, %entry ], [ %phi4, %loop2.then ], [ 3, %loop1.if ]
199   br i1 undef, label %loop2.if, label %loop2.else
201 loop2.if:
202   br i1 undef, label %loop2.then, label %loop1
204 loop2.else:
205   br label %loop2.then
207 loop2.then:
208 ; CHECK: PHI %phi4 has values:
209 ; CHECK-DAG: 2
210 ; CHECK-DAG: 3
211 ; CHECK-DAG: 4
212   %phi4 = phi i32 [ 4, %loop2.if ], [ %phi3, %loop2.else ]
213   br i1 undef, label %loop2, label %end
215 end:
216 ; CHECK: PHI %phi5 has values:
217 ; CHECK-DAG: 0
218 ; CHECK-DAG: 1
219 ; CHECK-DAG: 2
220 ; CHECK-DAG: 3
221 ; CHECK-DAG: 4
222   %phi5 = phi i32 [ %phi2, %loop1.then ], [ %phi4, %loop2.then ]
223   ret void
226 ; CHECK-LABEL: PHI Values for function: nested_loops_several_values
227 define void @nested_loops_several_values() {
228 entry:
229   br label %loop1
231 loop1:
232 ; CHECK: PHI %phi1 has values:
233 ; CHECK-DAG: i32 0
234 ; CHECK-DAG: %add
235   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
236   br i1 undef, label %loop2, label %end
238 loop2:
239 ; CHECK: PHI %phi2 has values:
240 ; CHECK-DAG: i32 0
241 ; CHECK-DAG: %add
242   %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
243   br i1 undef, label %loop3, label %loop1
245 loop3:
246 ; CHECK: PHI %phi3 has values:
247 ; CHECK-DAG: i32 0
248 ; CHECK-DAG: %add
249   %phi3 = phi i32 [ %add, %loop3 ], [ %phi2, %loop2 ]
250   %add = add i32 %phi3, 1
251   br i1 undef, label %loop3, label %loop2
253 end:
254   ret void
257 ; CHECK-LABEL: PHI Values for function: nested_loops_one_value
258 define void @nested_loops_one_value() {
259 entry:
260   br label %loop1
262 loop1:
263 ; CHECK: PHI %phi1 has values:
264 ; CHECK-DAG: i32 0
265   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
266   br i1 undef, label %loop2, label %end
268 loop2:
269 ; CHECK: PHI %phi2 has values:
270 ; CHECK-DAG: i32 0
271   %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
272   br i1 undef, label %loop3, label %loop1
274 loop3:
275 ; CHECK: PHI %phi3 has values:
276 ; CHECK-DAG: i32 0
277   %phi3 = phi i32 [ 0, %loop3 ], [ %phi2, %loop2 ]
278   br i1 undef, label %loop3, label %loop2
280 end:
281   ret void