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) {
8 br i1 undef, label %if, label %else
17 ; CHECK: PHI %phi1 has values:
20 %phi1 = phi i32 [ 0, %if ], [ 1, %else ]
21 ; CHECK: PHI %phi2 has values:
24 %phi2 = phi i32* [ @X, %if ], [ %ptr, %else ]
28 ; CHECK-LABEL: PHI Values for function: chain
29 define void @chain() {
31 br i1 undef, label %if1, label %else1
40 ; CHECK: PHI %phi1 has values:
43 %phi1 = phi i32 [ 0, %if1 ], [ 1, %else1 ]
44 br i1 undef, label %if2, label %else2
53 ; CHECK: PHI %phi2 has values:
57 %phi2 = phi i32 [ %phi1, %if2 ], [ 2, %else2 ]
61 ; CHECK-LABEL: PHI Values for function: no_values
62 define void @no_values() {
67 ; CHECK: PHI %phi has values:
69 %phi = phi i32 [ %phi, %unreachable ]
73 ; CHECK-LABEL: PHI Values for function: simple_loop
74 define void @simple_loop() {
79 ; CHECK: PHI %phi has values:
81 %phi = phi i32 [ 0, %entry ], [ %phi, %loop ]
82 br i1 undef, label %loop, label %end
88 ; CHECK-LABEL: PHI Values for function: complex_loop
89 define void @complex_loop() {
91 br i1 undef, label %loop, label %end
94 ; CHECK: PHI %phi1 has values:
97 %phi1 = phi i32 [ 0, %entry ], [ %phi2, %then ]
98 br i1 undef, label %if, label %else
107 ; CHECK: PHI %phi2 has values:
110 %phi2 = phi i32 [ %phi1, %if ], [ 1, %else ]
111 br i1 undef, label %loop, label %end
114 ; CHECK: PHI %phi3 has values:
118 %phi3 = phi i32 [ 2, %entry ], [ %phi2, %then ]
122 ; CHECK-LABEL: PHI Values for function: strange_loop
123 define void @strange_loop() {
125 br i1 undef, label %ifelse, label %inloop
128 ; CHECK: PHI %phi1 has values:
133 %phi1 = phi i32 [ %phi3, %if ], [ 0, %else ], [ %phi2, %inloop ]
134 br i1 undef, label %inloop, label %end
137 ; CHECK: PHI %phi2 has values:
142 %phi2 = phi i32 [ %phi1, %loop ], [ 1, %entry ]
143 br i1 undef, label %ifelse, label %loop
146 ; CHECK: PHI %phi3 has values:
149 %phi3 = phi i32 [ 2, %entry ], [ 3, %inloop ]
150 br i1 undef, label %if, label %else
162 ; CHECK-LABEL: PHI Values for function: mutual_loops
163 define void @mutual_loops() {
165 br i1 undef, label %loop1, label %loop2
168 ; CHECK: PHI %phi1 has values:
174 %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop1.then ], [ %phi3, %loop2.if ]
175 br i1 undef, label %loop1.if, label %loop1.else
178 br i1 undef, label %loop1.then, label %loop2
184 ; CHECK: PHI %phi2 has values:
190 %phi2 = phi i32 [ 1, %loop1.if ], [ %phi1, %loop1.else ]
191 br i1 undef, label %loop1, label %end
194 ; CHECK: PHI %phi3 has values:
198 %phi3 = phi i32 [ 2, %entry ], [ %phi4, %loop2.then ], [ 3, %loop1.if ]
199 br i1 undef, label %loop2.if, label %loop2.else
202 br i1 undef, label %loop2.then, label %loop1
208 ; CHECK: PHI %phi4 has values:
212 %phi4 = phi i32 [ 4, %loop2.if ], [ %phi3, %loop2.else ]
213 br i1 undef, label %loop2, label %end
216 ; CHECK: PHI %phi5 has values:
222 %phi5 = phi i32 [ %phi2, %loop1.then ], [ %phi4, %loop2.then ]
226 ; CHECK-LABEL: PHI Values for function: nested_loops_several_values
227 define void @nested_loops_several_values() {
232 ; CHECK: PHI %phi1 has values:
235 %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
236 br i1 undef, label %loop2, label %end
239 ; CHECK: PHI %phi2 has values:
242 %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
243 br i1 undef, label %loop3, label %loop1
246 ; CHECK: PHI %phi3 has values:
249 %phi3 = phi i32 [ %add, %loop3 ], [ %phi2, %loop2 ]
250 %add = add i32 %phi3, 1
251 br i1 undef, label %loop3, label %loop2
257 ; CHECK-LABEL: PHI Values for function: nested_loops_one_value
258 define void @nested_loops_one_value() {
263 ; CHECK: PHI %phi1 has values:
265 %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
266 br i1 undef, label %loop2, label %end
269 ; CHECK: PHI %phi2 has values:
271 %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
272 br i1 undef, label %loop3, label %loop1
275 ; CHECK: PHI %phi3 has values:
277 %phi3 = phi i32 [ 0, %loop3 ], [ %phi2, %loop2 ]
278 br i1 undef, label %loop3, label %loop2