; 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}