Use "isa" since the variable isn't used.
[llvm-complete.git] / test / Transforms / SimpleLoopUnswitch / nontrivial-unswitch-cost.ll
blob8862d013297924fa6d9218fb3c56fca2acf8723f
1 ; Specifically exercise the cost modeling for non-trivial loop unswitching.
3 ; RUN: opt -passes='loop(unswitch<nontrivial>),verify<loops>' -unswitch-threshold=5 -S < %s | FileCheck %s
4 ; RUN: opt -simple-loop-unswitch -enable-nontrivial-unswitch -unswitch-threshold=5 -S < %s | FileCheck %s
5 ; RUN: opt -simple-loop-unswitch -enable-nontrivial-unswitch -unswitch-threshold=5 -enable-mssa-loop-dependency=true -verify-memoryssa -S < %s | FileCheck %s
7 declare void @a()
8 declare void @b()
9 declare void @x()
11 ; First establish enough code size in the duplicated 'loop_begin' block to
12 ; suppress unswitching.
13 define void @test_no_unswitch(i1* %ptr, i1 %cond) {
14 ; CHECK-LABEL: @test_no_unswitch(
15 entry:
16   br label %loop_begin
17 ; CHECK-NEXT:  entry:
18 ; CHECK-NEXT:    br label %loop_begin
20 ; We shouldn't have unswitched into any other block either.
21 ; CHECK-NOT:     br i1 %cond
23 loop_begin:
24   call void @x()
25   call void @x()
26   call void @x()
27   call void @x()
28   br i1 %cond, label %loop_a, label %loop_b
29 ; CHECK:       loop_begin:
30 ; CHECK-NEXT:    call void @x()
31 ; CHECK-NEXT:    call void @x()
32 ; CHECK-NEXT:    call void @x()
33 ; CHECK-NEXT:    call void @x()
34 ; CHECK-NEXT:    br i1 %cond, label %loop_a, label %loop_b
36 loop_a:
37   call void @a()
38   br label %loop_latch
40 loop_b:
41   call void @b()
42   br label %loop_latch
44 loop_latch:
45   %v = load i1, i1* %ptr
46   br i1 %v, label %loop_begin, label %loop_exit
48 loop_exit:
49   ret void
52 ; Now check that the smaller formulation of 'loop_begin' does in fact unswitch
53 ; with our low threshold.
54 define void @test_unswitch(i1* %ptr, i1 %cond) {
55 ; CHECK-LABEL: @test_unswitch(
56 entry:
57   br label %loop_begin
58 ; CHECK-NEXT:  entry:
59 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
61 loop_begin:
62   call void @x()
63   br i1 %cond, label %loop_a, label %loop_b
65 loop_a:
66   call void @a()
67   br label %loop_latch
68 ; The 'loop_a' unswitched loop.
70 ; CHECK:       entry.split.us:
71 ; CHECK-NEXT:    br label %loop_begin.us
73 ; CHECK:       loop_begin.us:
74 ; CHECK-NEXT:    call void @x()
75 ; CHECK-NEXT:    br label %loop_a.us
77 ; CHECK:       loop_a.us:
78 ; CHECK-NEXT:    call void @a()
79 ; CHECK-NEXT:    br label %loop_latch.us
81 ; CHECK:       loop_latch.us:
82 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
83 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
85 ; CHECK:       loop_exit.split.us:
86 ; CHECK-NEXT:    br label %loop_exit
88 loop_b:
89   call void @b()
90   br label %loop_latch
91 ; The 'loop_b' unswitched loop.
93 ; CHECK:       entry.split:
94 ; CHECK-NEXT:    br label %loop_begin
96 ; CHECK:       loop_begin:
97 ; CHECK-NEXT:    call void @x()
98 ; CHECK-NEXT:    br label %loop_b
100 ; CHECK:       loop_b:
101 ; CHECK-NEXT:    call void @b()
102 ; CHECK-NEXT:    br label %loop_latch
104 ; CHECK:       loop_latch:
105 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
106 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
108 ; CHECK:       loop_exit.split:
109 ; CHECK-NEXT:    br label %loop_exit
111 loop_latch:
112   %v = load i1, i1* %ptr
113   br i1 %v, label %loop_begin, label %loop_exit
115 loop_exit:
116   ret void
117 ; CHECK:       loop_exit:
118 ; CHECK-NEXT:    ret void
121 ; Check that even with large amounts of code on either side of the unswitched
122 ; branch, if that code would be kept in only one of the unswitched clones it
123 ; doesn't contribute to the cost.
124 define void @test_unswitch_non_dup_code(i1* %ptr, i1 %cond) {
125 ; CHECK-LABEL: @test_unswitch_non_dup_code(
126 entry:
127   br label %loop_begin
128 ; CHECK-NEXT:  entry:
129 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
131 loop_begin:
132   call void @x()
133   br i1 %cond, label %loop_a, label %loop_b
135 loop_a:
136   call void @a()
137   call void @a()
138   call void @a()
139   call void @a()
140   br label %loop_latch
141 ; The 'loop_a' unswitched loop.
143 ; CHECK:       entry.split.us:
144 ; CHECK-NEXT:    br label %loop_begin.us
146 ; CHECK:       loop_begin.us:
147 ; CHECK-NEXT:    call void @x()
148 ; CHECK-NEXT:    br label %loop_a.us
150 ; CHECK:       loop_a.us:
151 ; CHECK-NEXT:    call void @a()
152 ; CHECK-NEXT:    call void @a()
153 ; CHECK-NEXT:    call void @a()
154 ; CHECK-NEXT:    call void @a()
155 ; CHECK-NEXT:    br label %loop_latch.us
157 ; CHECK:       loop_latch.us:
158 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
159 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
161 ; CHECK:       loop_exit.split.us:
162 ; CHECK-NEXT:    br label %loop_exit
164 loop_b:
165   call void @b()
166   call void @b()
167   call void @b()
168   call void @b()
169   br label %loop_latch
170 ; The 'loop_b' unswitched loop.
172 ; CHECK:       entry.split:
173 ; CHECK-NEXT:    br label %loop_begin
175 ; CHECK:       loop_begin:
176 ; CHECK-NEXT:    call void @x()
177 ; CHECK-NEXT:    br label %loop_b
179 ; CHECK:       loop_b:
180 ; CHECK-NEXT:    call void @b()
181 ; CHECK-NEXT:    call void @b()
182 ; CHECK-NEXT:    call void @b()
183 ; CHECK-NEXT:    call void @b()
184 ; CHECK-NEXT:    br label %loop_latch
186 ; CHECK:       loop_latch:
187 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
188 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
190 ; CHECK:       loop_exit.split:
191 ; CHECK-NEXT:    br label %loop_exit
193 loop_latch:
194   %v = load i1, i1* %ptr
195   br i1 %v, label %loop_begin, label %loop_exit
197 loop_exit:
198   ret void
199 ; CHECK:       loop_exit:
200 ; CHECK-NEXT:    ret void
203 ; Much like with non-duplicated code directly in the successor, we also won't
204 ; duplicate even interesting CFGs.
205 define void @test_unswitch_non_dup_code_in_cfg(i1* %ptr, i1 %cond) {
206 ; CHECK-LABEL: @test_unswitch_non_dup_code_in_cfg(
207 entry:
208   br label %loop_begin
209 ; CHECK-NEXT:  entry:
210 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
212 loop_begin:
213   call void @x()
214   br i1 %cond, label %loop_a, label %loop_b
216 loop_a:
217   %v1 = load i1, i1* %ptr
218   br i1 %v1, label %loop_a_a, label %loop_a_b
220 loop_a_a:
221   call void @a()
222   br label %loop_latch
224 loop_a_b:
225   call void @a()
226   br label %loop_latch
227 ; The 'loop_a' unswitched loop.
229 ; CHECK:       entry.split.us:
230 ; CHECK-NEXT:    br label %loop_begin.us
232 ; CHECK:       loop_begin.us:
233 ; CHECK-NEXT:    call void @x()
234 ; CHECK-NEXT:    br label %loop_a.us
236 ; CHECK:       loop_a.us:
237 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
238 ; CHECK-NEXT:    br i1 %[[V]], label %loop_a_a.us, label %loop_a_b.us
240 ; CHECK:       loop_a_b.us:
241 ; CHECK-NEXT:    call void @a()
242 ; CHECK-NEXT:    br label %loop_latch.us
244 ; CHECK:       loop_a_a.us:
245 ; CHECK-NEXT:    call void @a()
246 ; CHECK-NEXT:    br label %loop_latch.us
248 ; CHECK:       loop_latch.us:
249 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
250 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
252 ; CHECK:       loop_exit.split.us:
253 ; CHECK-NEXT:    br label %loop_exit
255 loop_b:
256   %v2 = load i1, i1* %ptr
257   br i1 %v2, label %loop_b_a, label %loop_b_b
259 loop_b_a:
260   call void @b()
261   br label %loop_latch
263 loop_b_b:
264   call void @b()
265   br label %loop_latch
266 ; The 'loop_b' unswitched loop.
268 ; CHECK:       entry.split:
269 ; CHECK-NEXT:    br label %loop_begin
271 ; CHECK:       loop_begin:
272 ; CHECK-NEXT:    call void @x()
273 ; CHECK-NEXT:    br label %loop_b
275 ; CHECK:       loop_b:
276 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
277 ; CHECK-NEXT:    br i1 %[[V]], label %loop_b_a, label %loop_b_b
279 ; CHECK:       loop_b_a:
280 ; CHECK-NEXT:    call void @b()
281 ; CHECK-NEXT:    br label %loop_latch
283 ; CHECK:       loop_b_b:
284 ; CHECK-NEXT:    call void @b()
285 ; CHECK-NEXT:    br label %loop_latch
287 ; CHECK:       loop_latch:
288 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
289 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
291 ; CHECK:       loop_exit.split:
292 ; CHECK-NEXT:    br label %loop_exit
294 loop_latch:
295   %v3 = load i1, i1* %ptr
296   br i1 %v3, label %loop_begin, label %loop_exit
298 loop_exit:
299   ret void
300 ; CHECK:       loop_exit:
301 ; CHECK-NEXT:    ret void
304 ; Check that even if there is *some* non-duplicated code on one side of an
305 ; unswitch, we don't count any other code in the loop that will in fact have to
306 ; be duplicated.
307 define void @test_no_unswitch_non_dup_code(i1* %ptr, i1 %cond) {
308 ; CHECK-LABEL: @test_no_unswitch_non_dup_code(
309 entry:
310   br label %loop_begin
311 ; CHECK-NEXT:  entry:
312 ; CHECK-NEXT:    br label %loop_begin
314 ; We shouldn't have unswitched into any other block either.
315 ; CHECK-NOT:     br i1 %cond
317 loop_begin:
318   call void @x()
319   br i1 %cond, label %loop_a, label %loop_b
320 ; CHECK:       loop_begin:
321 ; CHECK-NEXT:    call void @x()
322 ; CHECK-NEXT:    br i1 %cond, label %loop_a, label %loop_b
324 loop_a:
325   %v1 = load i1, i1* %ptr
326   br i1 %v1, label %loop_a_a, label %loop_a_b
328 loop_a_a:
329   call void @a()
330   br label %loop_latch
332 loop_a_b:
333   call void @a()
334   br label %loop_latch
336 loop_b:
337   %v2 = load i1, i1* %ptr
338   br i1 %v2, label %loop_b_a, label %loop_b_b
340 loop_b_a:
341   call void @b()
342   br label %loop_latch
344 loop_b_b:
345   call void @b()
346   br label %loop_latch
348 loop_latch:
349   call void @x()
350   call void @x()
351   %v = load i1, i1* %ptr
352   br i1 %v, label %loop_begin, label %loop_exit
354 loop_exit:
355   ret void
358 ; Check that we still unswitch when the exit block contains lots of code, even
359 ; though we do clone the exit block as part of unswitching. This should work
360 ; because we should split the exit block before anything inside it.
361 define void @test_unswitch_large_exit(i1* %ptr, i1 %cond) {
362 ; CHECK-LABEL: @test_unswitch_large_exit(
363 entry:
364   br label %loop_begin
365 ; CHECK-NEXT:  entry:
366 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
368 loop_begin:
369   call void @x()
370   br i1 %cond, label %loop_a, label %loop_b
372 loop_a:
373   call void @a()
374   br label %loop_latch
375 ; The 'loop_a' unswitched loop.
377 ; CHECK:       entry.split.us:
378 ; CHECK-NEXT:    br label %loop_begin.us
380 ; CHECK:       loop_begin.us:
381 ; CHECK-NEXT:    call void @x()
382 ; CHECK-NEXT:    br label %loop_a.us
384 ; CHECK:       loop_a.us:
385 ; CHECK-NEXT:    call void @a()
386 ; CHECK-NEXT:    br label %loop_latch.us
388 ; CHECK:       loop_latch.us:
389 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
390 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
392 ; CHECK:       loop_exit.split.us:
393 ; CHECK-NEXT:    br label %loop_exit
395 loop_b:
396   call void @b()
397   br label %loop_latch
398 ; The 'loop_b' unswitched loop.
400 ; CHECK:       entry.split:
401 ; CHECK-NEXT:    br label %loop_begin
403 ; CHECK:       loop_begin:
404 ; CHECK-NEXT:    call void @x()
405 ; CHECK-NEXT:    br label %loop_b
407 ; CHECK:       loop_b:
408 ; CHECK-NEXT:    call void @b()
409 ; CHECK-NEXT:    br label %loop_latch
411 ; CHECK:       loop_latch:
412 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
413 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin, label %loop_exit.split
415 ; CHECK:       loop_exit.split:
416 ; CHECK-NEXT:    br label %loop_exit
418 loop_latch:
419   %v = load i1, i1* %ptr
420   br i1 %v, label %loop_begin, label %loop_exit
422 loop_exit:
423   call void @x()
424   call void @x()
425   call void @x()
426   call void @x()
427   ret void
428 ; CHECK:       loop_exit:
429 ; CHECK-NEXT:    call void @x()
430 ; CHECK-NEXT:    call void @x()
431 ; CHECK-NEXT:    call void @x()
432 ; CHECK-NEXT:    call void @x()
433 ; CHECK-NEXT:    ret void
436 ; Check that we handle a dedicated exit edge unswitch which is still
437 ; non-trivial and has lots of code in the exit.
438 define void @test_unswitch_dedicated_exiting(i1* %ptr, i1 %cond) {
439 ; CHECK-LABEL: @test_unswitch_dedicated_exiting(
440 entry:
441   br label %loop_begin
442 ; CHECK-NEXT:  entry:
443 ; CHECK-NEXT:    br i1 %cond, label %entry.split.us, label %entry.split
445 loop_begin:
446   call void @x()
447   br i1 %cond, label %loop_a, label %loop_b_exit
449 loop_a:
450   call void @a()
451   br label %loop_latch
452 ; The 'loop_a' unswitched loop.
454 ; CHECK:       entry.split.us:
455 ; CHECK-NEXT:    br label %loop_begin.us
457 ; CHECK:       loop_begin.us:
458 ; CHECK-NEXT:    call void @x()
459 ; CHECK-NEXT:    br label %loop_a.us
461 ; CHECK:       loop_a.us:
462 ; CHECK-NEXT:    call void @a()
463 ; CHECK-NEXT:    br label %loop_latch.us
465 ; CHECK:       loop_latch.us:
466 ; CHECK-NEXT:    %[[V:.*]] = load i1, i1* %ptr
467 ; CHECK-NEXT:    br i1 %[[V]], label %loop_begin.us, label %loop_exit.split.us
469 ; CHECK:       loop_exit.split.us:
470 ; CHECK-NEXT:    br label %loop_exit
472 loop_b_exit:
473   call void @b()
474   call void @b()
475   call void @b()
476   call void @b()
477   ret void
478 ; The 'loop_b_exit' unswitched exit path.
480 ; CHECK:       entry.split:
481 ; CHECK-NEXT:    br label %loop_begin
483 ; CHECK:       loop_begin:
484 ; CHECK-NEXT:    call void @x()
485 ; CHECK-NEXT:    br label %loop_b_exit
487 ; CHECK:       loop_b_exit:
488 ; CHECK-NEXT:    call void @b()
489 ; CHECK-NEXT:    call void @b()
490 ; CHECK-NEXT:    call void @b()
491 ; CHECK-NEXT:    call void @b()
492 ; CHECK-NEXT:    ret void
494 loop_latch:
495   %v = load i1, i1* %ptr
496   br i1 %v, label %loop_begin, label %loop_exit
498 loop_exit:
499   ret void
500 ; CHECK:       loop_exit:
501 ; CHECK-NEXT:    ret void