blob: ca013828368c9f60ebb741823c50cbcaeef238d9 [file] [log] [blame]
John Brawnbdbbd832018-06-28 14:13:06 +00001; 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}