xref: /llvm-project/llvm/test/Analysis/CycleInfo/basic.ll (revision 1469d82e1cb3edc939d6b93089046edfef0cf36c)
1; RUN: opt < %s -disable-output -passes='verify<cycles>,print<cycles>' 2>&1 | FileCheck %s -check-prefix=CHECK
2
3define void @empty() {
4; CHECK-LABEL: CycleInfo for function: empty
5; CHECK-NOT:       depth
6
7  ret void
8}
9
10define void @simple(i1 %arg) {
11; CHECK-LABEL: CycleInfo for function: simple
12; CHECK:           depth=1: entries(loop)
13entry:
14  br label %loop
15
16loop:
17  br i1 %arg, label %loop, label %exit
18
19exit:
20  ret void
21}
22
23define void @two_latches(i1 %arg) {
24; CHECK-LABEL: CycleInfo for function: two_latches
25; CHECK:           depth=1: entries(loop) loop_next
26entry:
27  br label %loop
28
29loop:
30  br i1 %arg, label %loop, label %loop_next
31
32loop_next:
33  br i1 %arg, label %exit, label %loop
34
35exit:
36  ret void
37}
38
39define void @nested_simple(i1 %arg) {
40; CHECK-LABEL: CycleInfo for function: nested_simple
41; CHECK:           depth=1: entries(outer_header) outer_latch inner
42; CHECK:               depth=2: entries(inner)
43entry:
44  br label %outer_header
45
46outer_header:
47  br label %inner
48
49inner:
50  br i1 %arg, label %inner, label %outer_latch
51
52outer_latch:
53  br i1 %arg, label %outer_header, label %exit
54
55exit:
56  ret void
57}
58
59define void @nested_outer_latch_in_inner_loop(i1 %arg) {
60; CHECK-LABEL: CycleInfo for function: nested_outer_latch_in_inner_loop
61; CHECK:           depth=1: entries(outer_header) inner_header inner_latch
62; CHECK:               depth=2: entries(inner_header) inner_latch
63entry:
64  br label %outer_header
65
66outer_header:
67  br label %inner_header
68
69inner_header:
70  br i1 %arg, label %inner_latch, label %outer_header
71
72inner_latch:
73  br i1 %arg, label %exit, label %inner_header
74
75exit:
76  ret void
77}
78
79define void @sibling_loops(i1 %arg) {
80; CHECK-LABEL: CycleInfo for function: sibling_loops
81; CHECK-DAG:       depth=1: entries(left)
82; CHECK-DAG:       depth=1: entries(right)
83entry:
84  br i1 %arg, label %left, label %right
85
86left:
87  br i1 %arg, label %left, label %exit
88
89right:
90  br i1 %arg, label %right, label %exit
91
92exit:
93  ret void
94}
95
96define void @serial_loops(i1 %arg) {
97; CHECK-LABEL: CycleInfo for function: serial_loops
98; CHECK-DAG:       depth=1: entries(second)
99; CHECK-DAG:       depth=1: entries(first)
100entry:
101  br label %first
102
103first:
104  br i1 %arg, label %first, label %second
105
106second:
107  br i1 %arg, label %second, label %exit
108
109exit:
110  ret void
111}
112
113define void @nested_sibling_loops(i1 %arg) {
114; CHECK-LABEL: CycleInfo for function: nested_sibling_loops
115; CHECK:           depth=1: entries(outer_header) left right
116; CHECK-DAG:           depth=2: entries(right)
117; CHECK-DAG:           depth=2: entries(left)
118entry:
119  br label %outer_header
120
121outer_header:
122  br i1 %arg, label %left, label %right
123
124left:
125  switch i32 undef, label %exit [ i32 0, label %left
126                                  i32 1, label %outer_header ]
127
128right:
129  switch i32 undef, label %outer_header [ i32 0, label %exit
130                                          i32 1, label %right ]
131
132exit:
133  ret void
134}
135
136define void @deeper_nest(i1 %arg) {
137; CHECK-LABEL: CycleInfo for function: deeper_nest
138; CHECK:           depth=1: entries(outer_header) outer_latch middle_header inner_header inner_latch
139; CHECK:               depth=2: entries(middle_header) inner_header inner_latch
140; CHECK:                   depth=3: entries(inner_header) inner_latch
141entry:
142  br label %outer_header
143
144outer_header:
145  br label %middle_header
146
147middle_header:
148  br label %inner_header
149
150inner_header:
151  br i1 %arg, label %middle_header, label %inner_latch
152
153inner_latch:
154  br i1 %arg, label %inner_header, label %outer_latch
155
156outer_latch:
157  br i1 %arg, label %outer_header, label %exit
158
159exit:
160  ret void
161}
162
163define void @irreducible_basic(i1 %arg) {
164; CHECK-LABEL: CycleInfo for function: irreducible_basic
165; CHECK:           depth=1: entries(right left)
166entry:
167  br i1 %arg, label %left, label %right
168
169left:
170  br i1 %arg, label %right, label %exit
171
172right:
173  br i1 %arg, label %left, label %exit
174
175exit:
176  ret void
177}
178
179define void @irreducible_mess(i1 %arg) {
180; CHECK-LABEL: CycleInfo for function: irreducible_mess
181; CHECK:           depth=1: entries(B A) D C
182; CHECK:               depth=2: entries(D C A)
183; CHECK:                   depth=3: entries(C A)
184entry:
185  br i1 %arg, label %A, label %B
186
187A:
188  br i1 %arg, label %C, label %D
189
190B:
191  br i1 %arg, label %C, label %D
192
193C:
194  switch i32 undef, label %A [ i32 0, label %D
195                               i32 1, label %exit ]
196
197D:
198  switch i32 undef, label %B [ i32 0, label %C
199                               i32 1, label %exit ]
200
201exit:
202  ret void
203}
204
205define void @irreducible_into_simple_cycle(i1 %arg) {
206; CHECK-LABEL: CycleInfo for function: irreducible_into_simple_cycle
207; CHECK:           depth=1: entries(F C A) E D B
208entry:
209  switch i32 undef, label %A [ i32 0, label %C
210                               i32 1, label %F ]
211
212A:
213  br label %B
214
215B:
216  br label %C
217
218C:
219  br label %D
220
221D:
222  br i1 %arg, label %E, label %exit
223
224E:
225  br label %F
226
227F:
228  br i1 %arg, label %A, label %exit
229
230exit:
231  ret void
232}
233
234define void @irreducible_mountain_bug(i1 %arg) {
235; CHECK-LABEL: CycleInfo for function: irreducible_mountain_bug
236; CHECK:           depth=1: entries(while.cond)
237; CHECK:               depth=2: entries(cond.end61 cond.true49) while.body63 while.cond47
238; CHECK:                   depth=3: entries(while.body63 cond.true49) while.cond47
239entry:
240  br i1 %arg, label %if.end, label %if.then
241
242if.end:
243  br i1 %arg, label %if.then7, label %if.else
244
245if.then7:
246  br label %if.end16
247
248if.else:
249  br label %if.end16
250
251if.end16:
252  br i1 %arg, label %while.cond.preheader, label %if.then39
253
254while.cond.preheader:
255  br label %while.cond
256
257while.cond:
258  br i1 %arg, label %cond.true49, label %lor.rhs
259
260cond.true49:
261  br i1 %arg, label %if.then69, label %while.body63
262
263while.body63:
264  br i1 %arg, label %exit, label %while.cond47
265
266while.cond47:
267  br i1 %arg, label %cond.true49, label %cond.end61
268
269cond.end61:
270  br i1 %arg, label %while.body63, label %while.cond
271
272if.then69:
273  br i1 %arg, label %exit, label %while.cond
274
275lor.rhs:
276  br i1 %arg, label %cond.end61, label %while.end76
277
278while.end76:
279  br label %exit
280
281if.then39:
282  br i1 %arg, label %exit, label %if.end.i145
283
284if.end.i145:
285  br i1 %arg, label %exit, label %if.end8.i149
286
287if.end8.i149:
288  br label %exit
289
290if.then:
291  br i1 %arg, label %exit, label %if.end.i
292
293if.end.i:
294  br i1 %arg, label %exit, label %if.end8.i
295
296if.end8.i:
297  br label %exit
298
299exit:
300  ret void
301}
302