[clang] Fix description for fprofile-sample-use= on Windows (#117973)
[llvm-project.git] / llvm / test / Analysis / CycleInfo / basic.ll
blob33e5227b162fd383ef63c2216576ab846629c22c
1 ; RUN: opt < %s -disable-output -passes='verify<cycles>,print<cycles>' 2>&1 | FileCheck %s -check-prefix=CHECK
3 define void @empty() {
4 ; CHECK-LABEL: CycleInfo for function: empty
5 ; CHECK-NOT:       depth
7   ret void
10 define void @simple(i1 %arg) {
11 ; CHECK-LABEL: CycleInfo for function: simple
12 ; CHECK:           depth=1: entries(loop)
13 entry:
14   br label %loop
16 loop:
17   br i1 %arg, label %loop, label %exit
19 exit:
20   ret void
23 define void @two_latches(i1 %arg) {
24 ; CHECK-LABEL: CycleInfo for function: two_latches
25 ; CHECK:           depth=1: entries(loop) loop_next
26 entry:
27   br label %loop
29 loop:
30   br i1 %arg, label %loop, label %loop_next
32 loop_next:
33   br i1 %arg, label %exit, label %loop
35 exit:
36   ret void
39 define 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)
43 entry:
44   br label %outer_header
46 outer_header:
47   br label %inner
49 inner:
50   br i1 %arg, label %inner, label %outer_latch
52 outer_latch:
53   br i1 %arg, label %outer_header, label %exit
55 exit:
56   ret void
59 define 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
63 entry:
64   br label %outer_header
66 outer_header:
67   br label %inner_header
69 inner_header:
70   br i1 %arg, label %inner_latch, label %outer_header
72 inner_latch:
73   br i1 %arg, label %exit, label %inner_header
75 exit:
76   ret void
79 define 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)
83 entry:
84   br i1 %arg, label %left, label %right
86 left:
87   br i1 %arg, label %left, label %exit
89 right:
90   br i1 %arg, label %right, label %exit
92 exit:
93   ret void
96 define 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)
100 entry:
101   br label %first
103 first:
104   br i1 %arg, label %first, label %second
106 second:
107   br i1 %arg, label %second, label %exit
109 exit:
110   ret void
113 define 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)
118 entry:
119   br label %outer_header
121 outer_header:
122   br i1 %arg, label %left, label %right
124 left:
125   switch i32 undef, label %exit [ i32 0, label %left
126                                   i32 1, label %outer_header ]
128 right:
129   switch i32 undef, label %outer_header [ i32 0, label %exit
130                                           i32 1, label %right ]
132 exit:
133   ret void
136 define 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
141 entry:
142   br label %outer_header
144 outer_header:
145   br label %middle_header
147 middle_header:
148   br label %inner_header
150 inner_header:
151   br i1 %arg, label %middle_header, label %inner_latch
153 inner_latch:
154   br i1 %arg, label %inner_header, label %outer_latch
156 outer_latch:
157   br i1 %arg, label %outer_header, label %exit
159 exit:
160   ret void
163 define void @irreducible_basic(i1 %arg) {
164 ; CHECK-LABEL: CycleInfo for function: irreducible_basic
165 ; CHECK:           depth=1: entries(right left)
166 entry:
167   br i1 %arg, label %left, label %right
169 left:
170   br i1 %arg, label %right, label %exit
172 right:
173   br i1 %arg, label %left, label %exit
175 exit:
176   ret void
179 define 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)
184 entry:
185   br i1 %arg, label %A, label %B
188   br i1 %arg, label %C, label %D
191   br i1 %arg, label %C, label %D
194   switch i32 undef, label %A [ i32 0, label %D
195                                i32 1, label %exit ]
198   switch i32 undef, label %B [ i32 0, label %C
199                                i32 1, label %exit ]
201 exit:
202   ret void
205 define 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
208 entry:
209   switch i32 undef, label %A [ i32 0, label %C
210                                i32 1, label %F ]
213   br label %B
216   br label %C
219   br label %D
222   br i1 %arg, label %E, label %exit
225   br label %F
228   br i1 %arg, label %A, label %exit
230 exit:
231   ret void
234 define 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
239 entry:
240   br i1 %arg, label %if.end, label %if.then
242 if.end:
243   br i1 %arg, label %if.then7, label %if.else
245 if.then7:
246   br label %if.end16
248 if.else:
249   br label %if.end16
251 if.end16:
252   br i1 %arg, label %while.cond.preheader, label %if.then39
254 while.cond.preheader:
255   br label %while.cond
257 while.cond:
258   br i1 %arg, label %cond.true49, label %lor.rhs
260 cond.true49:
261   br i1 %arg, label %if.then69, label %while.body63
263 while.body63:
264   br i1 %arg, label %exit, label %while.cond47
266 while.cond47:
267   br i1 %arg, label %cond.true49, label %cond.end61
269 cond.end61:
270   br i1 %arg, label %while.body63, label %while.cond
272 if.then69:
273   br i1 %arg, label %exit, label %while.cond
275 lor.rhs:
276   br i1 %arg, label %cond.end61, label %while.end76
278 while.end76:
279   br label %exit
281 if.then39:
282   br i1 %arg, label %exit, label %if.end.i145
284 if.end.i145:
285   br i1 %arg, label %exit, label %if.end8.i149
287 if.end8.i149:
288   br label %exit
290 if.then:
291   br i1 %arg, label %exit, label %if.end.i
293 if.end.i:
294   br i1 %arg, label %exit, label %if.end8.i
296 if.end8.i:
297   br label %exit
299 exit:
300   ret void