1; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s
2
3@X = common global i32 0
4
5; CHECK-LABEL: PHI Values for function: simple
6define void @simple(i32* %ptr) {
7entry:
8  br i1 undef, label %if, label %else
9
10if:
11  br label %end
12
13else:
14  br label %end
15
16end:
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
26}
27
28; CHECK-LABEL: PHI Values for function: chain
29define void @chain() {
30entry:
31  br i1 undef, label %if1, label %else1
32
33if1:
34  br label %middle
35
36else1:
37  br label %middle
38
39middle:
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
45
46if2:
47  br label %end
48
49else2:
50  br label %end
51
52end:
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
59}
60
61; CHECK-LABEL: PHI Values for function: no_values
62define void @no_values() {
63entry:
64  ret void
65
66unreachable:
67; CHECK: PHI %phi has values:
68; CHECK-DAG: NONE
69  %phi = phi i32 [ %phi, %unreachable ]
70  br label %unreachable
71}
72
73; CHECK-LABEL: PHI Values for function: simple_loop
74define void @simple_loop() {
75entry:
76  br label %loop
77
78loop:
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
83
84end:
85  ret void
86}
87
88; CHECK-LABEL: PHI Values for function: complex_loop
89define void @complex_loop() {
90entry:
91  br i1 undef, label %loop, label %end
92
93loop:
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
99
100if:
101  br label %then
102
103else:
104  br label %then
105
106then:
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
112
113end:
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
120}
121
122; CHECK-LABEL: PHI Values for function: strange_loop
123define void @strange_loop() {
124entry:
125  br i1 undef, label %ifelse, label %inloop
126
127loop:
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
135
136inloop:
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
144
145ifelse:
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
151
152if:
153  br label %loop
154
155else:
156  br label %loop
157
158end:
159  ret void
160}
161
162; CHECK-LABEL: PHI Values for function: mutual_loops
163define void @mutual_loops() {
164entry:
165  br i1 undef, label %loop1, label %loop2
166
167loop1:
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
176
177loop1.if:
178  br i1 undef, label %loop1.then, label %loop2
179
180loop1.else:
181  br label %loop1.then
182
183loop1.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
192
193loop2:
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
200
201loop2.if:
202  br i1 undef, label %loop2.then, label %loop1
203
204loop2.else:
205  br label %loop2.then
206
207loop2.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
214
215end:
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
224}
225
226; CHECK-LABEL: PHI Values for function: nested_loops_several_values
227define void @nested_loops_several_values() {
228entry:
229  br label %loop1
230
231loop1:
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
237
238loop2:
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
244
245loop3:
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
252
253end:
254  ret void
255}
256
257; CHECK-LABEL: PHI Values for function: nested_loops_one_value
258define void @nested_loops_one_value() {
259entry:
260  br label %loop1
261
262loop1:
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
267
268loop2:
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
273
274loop3:
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
279
280end:
281  ret void
282}
283