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