1 ; RUN: llc -O2 -ppc-reduce-cr-logicals -o - %s | FileCheck \
2 ; RUN: --check-prefix=CHECK --check-prefix=CHECK-O2 %s
3 ; RUN: llc -O3 -ppc-reduce-cr-logicals -o - %s | FileCheck \
4 ; RUN: --check-prefix=CHECK --check-prefix=CHECK-O3 %s
5 target datalayout = "e-m:e-i64:64-n32:64"
6 target triple = "powerpc64le-grtev4-linux-gnu"
9 ; The chain-based outlining produces the layout
19 ; Tail duplication puts test n+1 at the end of optional n
20 ; so optional1 includes a copy of test2 at the end, and branches
21 ; to test3 (at the top) or falls through to optional 2.
22 ; The CHECK statements check for the whole string of tests
23 ; and then check that the correct test has been duplicated into the end of
24 ; the optional blocks and that the optional blocks are in the correct order.
25 ;CHECK-LABEL: straight_test:
26 ; test1 may have been merged with entry
27 ;CHECK: mr [[TAGREG:[0-9]+]], 3
28 ;CHECK: andi. {{[0-9]+}}, [[TAGREG:[0-9]+]], 1
29 ;CHECK-NEXT: bc 12, 1, .[[OPT1LABEL:[_0-9A-Za-z]+]]
31 ;CHECK-NEXT: andi. {{[0-9]+}}, [[TAGREG]], 2
32 ;CHECK-NEXT: bne 0, .[[OPT2LABEL:[_0-9A-Za-z]+]]
33 ;CHECK-NEXT: .[[TEST3LABEL:[_0-9A-Za-z]+]]: # %test3
34 ;CHECK-NEXT: andi. {{[0-9]+}}, [[TAGREG]], 4
35 ;CHECK-NEXT: bne 0, .[[OPT3LABEL:[_0-9A-Za-z]+]]
36 ;CHECK-NEXT: .[[TEST4LABEL:[_0-9A-Za-z]+]]: # %test4
37 ;CHECK-NEXT: andi. {{[0-9]+}}, [[TAGREG]], 8
38 ;CHECK-NEXT: bne 0, .[[OPT4LABEL:[_0-9A-Za-z]+]]
39 ;CHECK-NEXT: .[[EXITLABEL:[_0-9A-Za-z]+]]: # %exit
41 ;CHECK-NEXT: .[[OPT1LABEL]]:
42 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 2
43 ;CHECK-NEXT: beq 0, .[[TEST3LABEL]]
44 ;CHECK-NEXT: .[[OPT2LABEL]]:
45 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 4
46 ;CHECK-NEXT: beq 0, .[[TEST4LABEL]]
47 ;CHECK-NEXT: .[[OPT3LABEL]]:
48 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 8
49 ;CHECK-NEXT: beq 0, .[[EXITLABEL]]
50 ;CHECK-NEXT: .[[OPT4LABEL]]:
51 ;CHECK: b .[[EXITLABEL]]
53 define void @straight_test(i32 %tag) {
57 %tagbit1 = and i32 %tag, 1
58 %tagbit1eq0 = icmp eq i32 %tagbit1, 0
59 br i1 %tagbit1eq0, label %test2, label %optional1, !prof !1
67 %tagbit2 = and i32 %tag, 2
68 %tagbit2eq0 = icmp eq i32 %tagbit2, 0
69 br i1 %tagbit2eq0, label %test3, label %optional2, !prof !1
77 %tagbit3 = and i32 %tag, 4
78 %tagbit3eq0 = icmp eq i32 %tagbit3, 0
79 br i1 %tagbit3eq0, label %test4, label %optional3, !prof !1
87 %tagbit4 = and i32 %tag, 8
88 %tagbit4eq0 = icmp eq i32 %tagbit4, 0
89 br i1 %tagbit4eq0, label %exit, label %optional4, !prof !1
101 ; The chain-of-triangles based duplicating produces the layout
109 ; even for 50/50 branches.
110 ; Tail duplication puts test n+1 at the end of optional n
111 ; so optional1 includes a copy of test2 at the end, and branches
112 ; to test3 (at the top) or falls through to optional 2.
113 ; The CHECK statements check for the whole string of tests
114 ; and then check that the correct test has been duplicated into the end of
115 ; the optional blocks and that the optional blocks are in the correct order.
116 ;CHECK-LABEL: straight_test_50:
117 ; test1 may have been merged with entry
118 ;CHECK: mr [[TAGREG:[0-9]+]], 3
119 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 1
120 ;CHECK-NEXT: bc 12, 1, .[[OPT1LABEL:[_0-9A-Za-z]+]]
121 ;CHECK-NEXT: # %test2
122 ;CHECK-NEXT: andi. {{[0-9]+}}, [[TAGREG]], 2
123 ;CHECK-NEXT: bne 0, .[[OPT2LABEL:[_0-9A-Za-z]+]]
124 ;CHECK-NEXT: .[[TEST3LABEL:[_0-9A-Za-z]+]]: # %test3
125 ;CHECK-NEXT: andi. {{[0-9]+}}, [[TAGREG]], 4
126 ;CHECK-NEXT: bne 0, .[[OPT3LABEL:[_0-9A-Za-z]+]]
127 ;CHECK-NEXT: .[[EXITLABEL:[_0-9A-Za-z]+]]: # %exit
129 ;CHECK-NEXT: .[[OPT1LABEL]]:
130 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 2
131 ;CHECK-NEXT: beq 0, .[[TEST3LABEL]]
132 ;CHECK-NEXT: .[[OPT2LABEL]]:
133 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 4
134 ;CHECK-NEXT: beq 0, .[[EXITLABEL]]
135 ;CHECK-NEXT: .[[OPT3LABEL]]:
136 ;CHECK: b .[[EXITLABEL]]
138 define void @straight_test_50(i32 %tag) {
142 %tagbit1 = and i32 %tag, 1
143 %tagbit1eq0 = icmp eq i32 %tagbit1, 0
144 br i1 %tagbit1eq0, label %test2, label %optional1, !prof !2
149 %tagbit2 = and i32 %tag, 2
150 %tagbit2eq0 = icmp eq i32 %tagbit2, 0
151 br i1 %tagbit2eq0, label %test3, label %optional2, !prof !2
156 %tagbit3 = and i32 %tag, 4
157 %tagbit3eq0 = icmp eq i32 %tagbit3, 0
158 br i1 %tagbit3eq0, label %exit, label %optional3, !prof !1
167 ; The chain-of-triangles based duplicating produces the layout when 3
168 ; instructions are allowed for tail-duplication.
177 ; Otherwise it produces the layout:
186 ;CHECK-LABEL: straight_test_3_instr_test:
187 ; test1 may have been merged with entry
188 ;CHECK: mr [[TAGREG:[0-9]+]], 3
189 ;CHECK: clrlwi {{[0-9]+}}, [[TAGREG]], 30
190 ;CHECK-NEXT: cmplwi {{[0-9]+}}, 2
192 ;CHECK-O3-NEXT: bne 0, .[[OPT1LABEL:[_0-9A-Za-z]+]]
193 ;CHECK-O3-NEXT: # %test2
194 ;CHECK-O3-NEXT: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 28, 29
195 ;CHECK-O3-NEXT: cmplwi {{[0-9]+}}, 8
196 ;CHECK-O3-NEXT: bne 0, .[[OPT2LABEL:[_0-9A-Za-z]+]]
197 ;CHECK-O3-NEXT: .[[TEST3LABEL:[_0-9A-Za-z]+]]: # %test3
198 ;CHECK-O3-NEXT: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 26, 27
199 ;CHECK-O3-NEXT: cmplwi {{[0-9]+}}, 32
200 ;CHECK-O3-NEXT: bne 0, .[[OPT3LABEL:[_0-9A-Za-z]+]]
201 ;CHECK-O3-NEXT: .[[EXITLABEL:[_0-9A-Za-z]+]]: # %exit
203 ;CHECK-O3-NEXT: .[[OPT1LABEL]]:
204 ;CHECK-O3: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 28, 29
205 ;CHECK-O3-NEXT: cmplwi {{[0-9]+}}, 8
206 ;CHECK-O3-NEXT: beq 0, .[[TEST3LABEL]]
207 ;CHECK-O3-NEXT: .[[OPT2LABEL]]:
208 ;CHECK-O3: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 26, 27
209 ;CHECK-O3-NEXT: cmplwi {{[0-9]+}}, 32
210 ;CHECK-O3-NEXT: beq 0, .[[EXITLABEL]]
211 ;CHECK-O3-NEXT: .[[OPT3LABEL]]:
212 ;CHECK-O3: b .[[EXITLABEL]]
214 ;CHECK-O2-NEXT: beq 0, .[[TEST2LABEL:[_0-9A-Za-z]+]]
215 ;CHECK-O2-NEXT: # %optional1
216 ;CHECK-O2: .[[TEST2LABEL]]: # %test2
217 ;CHECK-O2-NEXT: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 28, 29
218 ;CHECK-O2-NEXT: cmplwi {{[0-9]+}}, 8
219 ;CHECK-O2-NEXT: beq 0, .[[TEST3LABEL:[_0-9A-Za-z]+]]
220 ;CHECK-O2-NEXT: # %optional2
221 ;CHECK-O2: .[[TEST3LABEL]]: # %test3
222 ;CHECK-O2-NEXT: rlwinm {{[0-9]+}}, [[TAGREG]], 0, 26, 27
223 ;CHECK-O2-NEXT: cmplwi {{[0-9]+}}, 32
224 ;CHECK-O2-NEXT: beq 0, .[[EXITLABEL:[_0-9A-Za-z]+]]
225 ;CHECK-O2-NEXT: # %optional3
226 ;CHECK-O2: .[[EXITLABEL:[_0-9A-Za-z]+]]: # %exit
230 define void @straight_test_3_instr_test(i32 %tag) {
234 %tagbit1 = and i32 %tag, 3
235 %tagbit1eq0 = icmp eq i32 %tagbit1, 2
236 br i1 %tagbit1eq0, label %test2, label %optional1, !prof !2
241 %tagbit2 = and i32 %tag, 12
242 %tagbit2eq0 = icmp eq i32 %tagbit2, 8
243 br i1 %tagbit2eq0, label %test3, label %optional2, !prof !2
248 %tagbit3 = and i32 %tag, 48
249 %tagbit3eq0 = icmp eq i32 %tagbit3, 32
250 br i1 %tagbit3eq0, label %exit, label %optional3, !prof !1
259 ; The chain-based outlining produces the layout
274 ; The CHECK statements check for the whole string of tests and exit block,
275 ; and then check that the correct test has been duplicated into the end of
276 ; the optional blocks and that the optional blocks are in the correct order.
277 ;CHECK-LABEL: loop_test:
278 ;CHECK: add [[TAGPTRREG:[0-9]+]], 3, 4
279 ;CHECK: .[[LATCHLABEL:[._0-9A-Za-z]+]]: # %for.latch
281 ;CHECK-O2: .[[CHECKLABEL:[._0-9A-Za-z]+]]: # %for.check
282 ;CHECK: lwz [[TAGREG:[0-9]+]], 0([[TAGPTRREG]])
283 ;CHECK-O3: .[[CHECKLABEL:[._0-9A-Za-z]+]]: # %for.check
284 ;CHECK: # %bb.{{[0-9]+}}: # %test1
285 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 1
286 ;CHECK-NEXT: bc 12, 1, .[[OPT1LABEL:[._0-9A-Za-z]+]]
287 ;CHECK-NEXT: # %test2
288 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 2
289 ;CHECK-NEXT: bne 0, .[[OPT2LABEL:[._0-9A-Za-z]+]]
290 ;CHECK-NEXT: .[[TEST3LABEL:[._0-9A-Za-z]+]]: # %test3
291 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 4
292 ;CHECK-NEXT: bne 0, .[[OPT3LABEL:[._0-9A-Za-z]+]]
293 ;CHECK-NEXT: .[[TEST4LABEL:[._0-9A-Za-z]+]]: # %{{(test4|optional3)}}
294 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 8
295 ;CHECK-NEXT: beq 0, .[[LATCHLABEL]]
296 ;CHECK-NEXT: b .[[OPT4LABEL:[._0-9A-Za-z]+]]
297 ;CHECK: [[OPT1LABEL]]
298 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 2
299 ;CHECK-NEXT: beq 0, .[[TEST3LABEL]]
300 ;CHECK-NEXT: .[[OPT2LABEL]]
301 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 4
302 ;CHECK-NEXT: beq 0, .[[TEST4LABEL]]
303 ;CHECK-NEXT: .[[OPT3LABEL]]
304 ;CHECK: andi. {{[0-9]+}}, [[TAGREG]], 8
305 ;CHECK-NEXT: beq 0, .[[LATCHLABEL]]
306 ;CHECK: [[OPT4LABEL]]:
307 ;CHECK: b .[[LATCHLABEL]]
308 define void @loop_test(i32* %tags, i32 %count) {
312 %count.loop = phi i32 [%count, %entry], [%count.sub, %for.latch]
313 %done.count = icmp ugt i32 %count.loop, 0
314 %tag_ptr = getelementptr inbounds i32, i32* %tags, i32 %count
315 %tag = load i32, i32* %tag_ptr
316 %done.tag = icmp eq i32 %tag, 0
317 %done = and i1 %done.count, %done.tag
318 br i1 %done, label %test1, label %exit, !prof !1
320 %tagbit1 = and i32 %tag, 1
321 %tagbit1eq0 = icmp eq i32 %tagbit1, 0
322 br i1 %tagbit1eq0, label %test2, label %optional1, !prof !1
330 %tagbit2 = and i32 %tag, 2
331 %tagbit2eq0 = icmp eq i32 %tagbit2, 0
332 br i1 %tagbit2eq0, label %test3, label %optional2, !prof !1
340 %tagbit3 = and i32 %tag, 4
341 %tagbit3eq0 = icmp eq i32 %tagbit3, 0
342 br i1 %tagbit3eq0, label %test4, label %optional3, !prof !1
350 %tagbit4 = and i32 %tag, 8
351 %tagbit4eq0 = icmp eq i32 %tagbit4, 0
352 br i1 %tagbit4eq0, label %for.latch, label %optional4, !prof !1
360 %count.sub = sub i32 %count.loop, 1
366 ; The block then2 is not unavoidable, meaning it does not dominate the exit.
367 ; But since it can be tail-duplicated, it should be placed as a fallthrough from
368 ; test2 and copied. The purpose here is to make sure that the tail-duplication
369 ; code is independent of the outlining code, which works by choosing the
370 ; "unavoidable" blocks.
371 ; CHECK-LABEL: avoidable_test:
372 ; CHECK: # %bb.{{[0-9]+}}: # %entry
374 ; CHECK: # %bb.{{[0-9]+}}: # %test2
375 ; Make sure then2 falls through from test2
376 ; CHECK-NOT: # %{{[-_a-zA-Z0-9]+}}
377 ; CHECK: # %bb.{{[0-9]+}}: # %then2
378 ; CHECK: andi. {{[0-9]+}}, {{[0-9]+}}, 4
382 ; Make sure then2 was copied into else1
383 ; CHECK: andi. {{[0-9]+}}, {{[0-9]+}}, 4
389 define void @avoidable_test(i32 %tag) {
393 %tagbit1 = and i32 %tag, 1
394 %tagbit1eq0 = icmp eq i32 %tagbit1, 0
395 br i1 %tagbit1eq0, label %test2, label %else1, !prof !1 ; %test2 more likely
401 %tagbit2 = and i32 %tag, 2
402 %tagbit2eq0 = icmp eq i32 %tagbit2, 0
403 br i1 %tagbit2eq0, label %then2, label %else2, !prof !1 ; %then2 more likely
405 %tagbit3 = and i32 %tag, 4
406 %tagbit3eq0 = icmp eq i32 %tagbit3, 0
407 br i1 %tagbit3eq0, label %end2, label %end1, !prof !1 ; %end2 more likely
418 ; CHECK-LABEL: trellis_test
419 ; The number in the block labels is the expected block frequency given the
420 ; probabilities annotated. There is a conflict in the b;c->d;e trellis that
421 ; should be resolved as c->e;b->d.
422 ; The d;e->f;g trellis should be resolved as e->g;d->f.
423 ; The f;g->h;i trellis should be resolved as f->i;g->h.
424 ; The h;i->j;ret trellis contains a triangle edge, and should be resolved as
426 ; CHECK: # %bb.{{[0-9]+}}: # %entry
427 ; CHECK: # %bb.{{[0-9]+}}: # %c10
437 define void @trellis_test(i32 %tag) {
443 %tagbits.a = and i32 %tag, 3
444 %tagbits.a.eq0 = icmp eq i32 %tagbits.a, 0
445 br i1 %tagbits.a.eq0, label %c10, label %b6, !prof !1 ; 10 to 6
449 %tagbits.c = and i32 %tag, 12
450 %tagbits.c.eq0 = icmp eq i32 %tagbits.c, 0
451 ; Both of these edges should be hotter than the other incoming edge
453 br i1 %tagbits.c.eq0, label %e9, label %d7, !prof !3 ; 6 to 4
457 %tagbits.e = and i32 %tag, 48
458 %tagbits.e.eq0 = icmp eq i32 %tagbits.e, 0
459 br i1 %tagbits.e.eq0, label %g10, label %f6, !prof !4 ; 7 to 2
463 %tagbits.g = and i32 %tag, 192
464 %tagbits.g.eq0 = icmp eq i32 %tagbits.g, 0
465 br i1 %tagbits.g.eq0, label %i6, label %h10, !prof !5 ; 2 to 8
469 %tagbits.i = and i32 %tag, 768
470 %tagbits.i.eq0 = icmp eq i32 %tagbits.i, 0
471 br i1 %tagbits.i.eq0, label %ret, label %j8, !prof !2 ; balanced (3 to 3)
475 %tagbits.b = and i32 %tag, 12
476 %tagbits.b.eq1 = icmp eq i32 %tagbits.b, 8
477 br i1 %tagbits.b.eq1, label %e9, label %d7, !prof !2 ; balanced (3 to 3)
481 %tagbits.d = and i32 %tag, 48
482 %tagbits.d.eq1 = icmp eq i32 %tagbits.d, 32
483 br i1 %tagbits.d.eq1, label %g10, label %f6, !prof !6 ; 3 to 4
487 %tagbits.f = and i32 %tag, 192
488 %tagbits.f.eq1 = icmp eq i32 %tagbits.f, 128
489 br i1 %tagbits.f.eq1, label %i6, label %h10, !prof !7 ; 4 to 2
493 %tagbits.h = and i32 %tag, 768
494 %tagbits.h.eq1 = icmp eq i32 %tagbits.h, 512
495 br i1 %tagbits.h.eq1, label %ret, label %j8, !prof !2 ; balanced (5 to 5)
504 ; Verify that we still consider tail-duplication opportunities if we find a
505 ; triangle trellis. Here D->F->G is the triangle, and D;E are both predecessors
506 ; of both F and G. The basic trellis algorithm picks the F->G edge, but after
507 ; checking, it's profitable to duplicate G into F. The weights here are not
508 ; really important. They are there to help make the test stable.
509 ; CHECK-LABEL: trellis_then_dup_test
510 ; CHECK: # %bb.{{[0-9]+}}: # %entry
511 ; CHECK: # %bb.{{[0-9]+}}: # %b
520 define void @trellis_then_dup_test(i32 %tag) {
526 %tagbits.a = and i32 %tag, 3
527 %tagbits.a.eq0 = icmp eq i32 %tagbits.a, 0
528 br i1 %tagbits.a.eq0, label %b, label %c, !prof !1 ; 5 to 3
532 %tagbits.b = and i32 %tag, 12
533 %tagbits.b.eq1 = icmp eq i32 %tagbits.b, 8
534 br i1 %tagbits.b.eq1, label %d, label %e, !prof !1 ; 5 to 3
538 %tagbits.d = and i32 %tag, 48
539 %tagbits.d.eq1 = icmp eq i32 %tagbits.d, 32
540 br i1 %tagbits.d.eq1, label %g, label %f, !prof !1 ; 5 to 3
546 %tagbits.g = and i32 %tag, 192
547 %tagbits.g.eq0 = icmp eq i32 %tagbits.g, 0
548 br i1 %tagbits.g.eq0, label %ret1, label %ret2, !prof !2 ; balanced
552 %tagbits.c = and i32 %tag, 12
553 %tagbits.c.eq0 = icmp eq i32 %tagbits.c, 0
554 br i1 %tagbits.c.eq0, label %d, label %e, !prof !1 ; 5 to 3
558 %tagbits.e = and i32 %tag, 48
559 %tagbits.e.eq0 = icmp eq i32 %tagbits.e, 0
560 br i1 %tagbits.e.eq0, label %g, label %f, !prof !1 ; 5 to 3
571 ; Verify that we did not mis-identify triangle trellises if it is not
573 ; CHECK-LABEL: trellis_no_triangle
574 ; CHECK: # %bb.{{[0-9]+}}: # %entry
575 ; CHECK: # %bb.{{[0-9]+}}: # %b
580 define void @trellis_no_triangle(i32 %tag) {
586 %tagbits.a = and i32 %tag, 3
587 %tagbits.a.eq0 = icmp eq i32 %tagbits.a, 0
588 br i1 %tagbits.a.eq0, label %b, label %c, !prof !8 ; 98 to 2
592 %tagbits.b = and i32 %tag, 12
593 %tagbits.b.eq1 = icmp eq i32 %tagbits.b, 8
594 br i1 %tagbits.b.eq1, label %d, label %e, !prof !9 ; 97 to 1
598 %tagbits.d = and i32 %tag, 48
599 %tagbits.d.eq1 = icmp eq i32 %tagbits.d, 32
600 br i1 %tagbits.d.eq1, label %ret, label %e, !prof !10 ; 96 to 2
604 %tagbits.c = and i32 %tag, 12
605 %tagbits.c.eq0 = icmp eq i32 %tagbits.c, 0
606 br i1 %tagbits.c.eq0, label %d, label %e, !prof !2 ; 1 to 1
627 !1 = !{!"branch_weights", i32 5, i32 3}
628 !2 = !{!"branch_weights", i32 50, i32 50}
629 !3 = !{!"branch_weights", i32 6, i32 4}
630 !4 = !{!"branch_weights", i32 7, i32 2}
631 !5 = !{!"branch_weights", i32 2, i32 8}
632 !6 = !{!"branch_weights", i32 3, i32 4}
633 !7 = !{!"branch_weights", i32 4, i32 2}
634 !8 = !{!"branch_weights", i32 98, i32 2}
635 !9 = !{!"branch_weights", i32 97, i32 1}
636 !10 = !{!"branch_weights", i32 96, i32 2}