Chen Li | 9f27fc0 | 2015-09-29 05:03:32 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -loop-unswitch -loop-unswitch-with-block-frequency -S 2>&1 | FileCheck %s |
| 2 | |
| 3 | ;; trivial condition should be unswithed regardless of coldness. |
| 4 | define i32 @test1(i1 %cond1, i1 %cond2) !prof !1 { |
| 5 | br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0 |
| 6 | |
| 7 | loop_begin: |
| 8 | ; CHECK: br i1 true, label %continue, label %loop_exit.loopexit |
| 9 | br i1 %cond2, label %continue, label %loop_exit ; trivial condition |
| 10 | |
| 11 | continue: |
| 12 | call void @some_func1() noreturn nounwind |
| 13 | br label %loop_begin |
| 14 | |
| 15 | loop_exit: |
| 16 | ret i32 0 |
| 17 | } |
| 18 | |
| 19 | ;; cold non-trivial condition should not be unswitched. |
| 20 | define i32 @test2(i32* %var, i1 %cond1, i1 %cond2) !prof !1 { |
| 21 | br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0 |
| 22 | |
| 23 | loop_begin: |
| 24 | store i32 1, i32* %var |
| 25 | ; CHECK: br i1 %cond2, label %continue1, label %continue2 |
| 26 | br i1 %cond2, label %continue1, label %continue2 ; non-trivial condition |
| 27 | |
| 28 | continue1: |
| 29 | call void @some_func1() noreturn nounwind |
| 30 | br label %joint |
| 31 | |
| 32 | continue2: |
| 33 | call void @some_func2() noreturn nounwind |
| 34 | br label %joint |
| 35 | |
| 36 | joint: |
| 37 | ;; unswitching will duplicate these calls. |
| 38 | call void @some_func3() noreturn nounwind |
| 39 | call void @some_func4() noreturn nounwind |
| 40 | br label %loop_begin |
| 41 | |
| 42 | loop_exit: |
| 43 | ret i32 0 |
| 44 | } |
| 45 | |
| 46 | declare void @some_func1() noreturn |
| 47 | declare void @some_func2() noreturn |
| 48 | declare void @some_func3() noreturn |
| 49 | declare void @some_func4() noreturn |
| 50 | |
| 51 | !0 = !{!"branch_weights", i32 1, i32 100000000} |
| 52 | !1 = !{!"function_entry_count", i64 100} |