Home | History | Annotate | Download | only in LoopUnswitch
      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}
     53