| ; RUN: split-file %s %t | |
| ; RUN: cat %t/main.ll %t/probable-or.prof > %t/probable-or.ll | |
| ; RUN: cat %t/main.ll %t/probable-and.prof > %t/probable-and.ll | |
| ; RUN: opt -passes='loop(simple-loop-unswitch<nontrivial>)' -S %t/probable-or.ll -o -| FileCheck %t/probable-or.prof | |
| ; RUN: opt -passes='loop(simple-loop-unswitch<nontrivial>)' -S %t/probable-and.ll -o -| FileCheck %t/probable-and.prof | |
| ;--- main.ll | |
| declare i32 @a() | |
| declare i32 @b() | |
| define i32 @or(ptr %ptr, i1 %cond) !prof !0 { | |
| entry: | |
| br label %loop_begin | |
| loop_begin: | |
| %v1 = load i1, ptr %ptr | |
| %cond_or = or i1 %v1, %cond | |
| br i1 %cond_or, label %loop_a, label %loop_b, !prof !1 | |
| loop_a: | |
| call i32 @a() | |
| br label %latch | |
| loop_b: | |
| call i32 @b() | |
| br label %latch | |
| latch: | |
| %v2 = load i1, ptr %ptr | |
| br i1 %v2, label %loop_begin, label %loop_exit, !prof !2 | |
| loop_exit: | |
| ret i32 0 | |
| } | |
| define i32 @and(ptr %ptr, i1 %cond) !prof !0 { | |
| entry: | |
| br label %loop_begin | |
| loop_begin: | |
| %v1 = load i1, ptr %ptr | |
| %cond_and = and i1 %v1, %cond | |
| br i1 %cond_and, label %loop_a, label %loop_b, !prof !1 | |
| loop_a: | |
| call i32 @a() | |
| br label %latch | |
| loop_b: | |
| call i32 @b() | |
| br label %latch | |
| latch: | |
| %v2 = load i1, ptr %ptr | |
| br i1 %v2, label %loop_begin, label %loop_exit, !prof !2 | |
| loop_exit: | |
| ret i32 0 | |
| } | |
| ;--- probable-or.prof | |
| !0 = !{!"function_entry_count", i32 10} | |
| !1 = !{!"branch_weights", i32 1, i32 1000} | |
| !2 = !{!"branch_weights", i32 5, i32 7} | |
| ; CHECK-LABEL: @or | |
| ; CHECK-LABEL: entry: | |
| ; CHECK-NEXT: %cond.fr = freeze i1 %cond | |
| ; CHECK-NEXT: br i1 %cond.fr, label %entry.split.us, label %entry.split, !prof !1 | |
| ; CHECK-LABEL: @and | |
| ; CHECK-LABEL: entry: | |
| ; CHECK-NEXT: %cond.fr = freeze i1 %cond | |
| ; CHECK-NEXT: br i1 %cond.fr, label %entry.split, label %entry.split.us, !prof !3 | |
| ; CHECK: !1 = !{!"branch_weights", i32 1, i32 1000} | |
| ; CHECK: !3 = !{!"unknown", !"simple-loop-unswitch"} | |
| ;--- probable-and.prof | |
| !0 = !{!"function_entry_count", i32 10} | |
| !1 = !{!"branch_weights", i32 1000, i32 1} | |
| !2 = !{!"branch_weights", i32 5, i32 7} | |
| ; CHECK-LABEL: @or | |
| ; CHECK-LABEL: entry: | |
| ; CHECK-NEXT: %cond.fr = freeze i1 %cond | |
| ; CHECK-NEXT: br i1 %cond.fr, label %entry.split.us, label %entry.split, !prof !1 | |
| ; CHECK-LABEL: @and | |
| ; CHECK-LABEL: entry: | |
| ; CHECK-NEXT: %cond.fr = freeze i1 %cond | |
| ; CHECK-NEXT: br i1 %cond.fr, label %entry.split, label %entry.split.us, !prof !3 | |
| ; CHECK: !1 = !{!"unknown", !"simple-loop-unswitch"} | |
| ; CHECK: !3 = !{!"branch_weights", i32 1000, i32 1} |