forked from OSchip/llvm-project
53 lines
1.4 KiB
LLVM
53 lines
1.4 KiB
LLVM
; RUN: opt < %s -loop-unswitch -loop-unswitch-with-block-frequency -S 2>&1 | FileCheck %s
|
|
|
|
;; trivial condition should be unswithed regardless of coldness.
|
|
define i32 @test1(i1 %cond1, i1 %cond2) !prof !1 {
|
|
br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0
|
|
|
|
loop_begin:
|
|
; CHECK: br i1 true, label %continue, label %loop_exit.loopexit
|
|
br i1 %cond2, label %continue, label %loop_exit ; trivial condition
|
|
|
|
continue:
|
|
call void @some_func1() noreturn nounwind
|
|
br label %loop_begin
|
|
|
|
loop_exit:
|
|
ret i32 0
|
|
}
|
|
|
|
;; cold non-trivial condition should not be unswitched.
|
|
define i32 @test2(i32* %var, i1 %cond1, i1 %cond2) !prof !1 {
|
|
br i1 %cond1, label %loop_begin, label %loop_exit, !prof !0
|
|
|
|
loop_begin:
|
|
store i32 1, i32* %var
|
|
; CHECK: br i1 %cond2, label %continue1, label %continue2
|
|
br i1 %cond2, label %continue1, label %continue2 ; non-trivial condition
|
|
|
|
continue1:
|
|
call void @some_func1() noreturn nounwind
|
|
br label %joint
|
|
|
|
continue2:
|
|
call void @some_func2() noreturn nounwind
|
|
br label %joint
|
|
|
|
joint:
|
|
;; unswitching will duplicate these calls.
|
|
call void @some_func3() noreturn nounwind
|
|
call void @some_func4() noreturn nounwind
|
|
br label %loop_begin
|
|
|
|
loop_exit:
|
|
ret i32 0
|
|
}
|
|
|
|
declare void @some_func1() noreturn
|
|
declare void @some_func2() noreturn
|
|
declare void @some_func3() noreturn
|
|
declare void @some_func4() noreturn
|
|
|
|
!0 = !{!"branch_weights", i32 1, i32 100000000}
|
|
!1 = !{!"function_entry_count", i64 100}
|