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