forked from OSchip/llvm-project
Add a very basic test for MachineBlockPlacement. This is essentially the
canonical example I used when developing it, and is one of the primary motivating real-world use cases for __builtin_expect (when burried under a macro). I'm working on more test cases here, but I'm trying to make sure both that the pass is doing the right thing with the test cases and that they aren't too brittle to changes elsewhere in the code generation pipeline. Feedback and/or suggestions on how to test this are very welcome. Especially feedback on whether testing the block comments is a good strategy; I couldn't find any good examples to steal from but all the other ideas I had were a lot uglier or more fragile. llvm-svn: 142644
This commit is contained in:
parent
7e9a7c4a7f
commit
ddfeaafdfb
|
@ -0,0 +1,75 @@
|
|||
; RUN: llc -march=x86 -enable-block-placement < %s | FileCheck %s
|
||||
|
||||
declare void @error(i32 %i, i32 %a, i32 %b)
|
||||
|
||||
define i32 @test1(i32 %i, i32* %a, i32 %b) {
|
||||
; Test a chain of ifs, where the block guarded by the if is error handling code
|
||||
; that is not expected to run.
|
||||
; CHECK: test1:
|
||||
; CHECK: %entry
|
||||
; CHECK: %else1
|
||||
; CHECK: %else2
|
||||
; CHECK: %else3
|
||||
; CHECK: %else4
|
||||
; CHECK: %exit
|
||||
; CHECK: %then1
|
||||
; CHECK: %then2
|
||||
; CHECK: %then3
|
||||
; CHECK: %then4
|
||||
; CHECK: %then5
|
||||
|
||||
entry:
|
||||
%gep1 = getelementptr i32* %a, i32 1
|
||||
%val1 = load i32* %gep1
|
||||
%cond1 = icmp ugt i32 %val1, 1
|
||||
br i1 %cond1, label %then1, label %else1, !prof !0
|
||||
|
||||
then1:
|
||||
call void @error(i32 %i, i32 1, i32 %b)
|
||||
br label %else1
|
||||
|
||||
else1:
|
||||
%gep2 = getelementptr i32* %a, i32 2
|
||||
%val2 = load i32* %gep2
|
||||
%cond2 = icmp ugt i32 %val2, 2
|
||||
br i1 %cond2, label %then2, label %else2, !prof !0
|
||||
|
||||
then2:
|
||||
call void @error(i32 %i, i32 1, i32 %b)
|
||||
br label %else2
|
||||
|
||||
else2:
|
||||
%gep3 = getelementptr i32* %a, i32 3
|
||||
%val3 = load i32* %gep3
|
||||
%cond3 = icmp ugt i32 %val3, 3
|
||||
br i1 %cond3, label %then3, label %else3, !prof !0
|
||||
|
||||
then3:
|
||||
call void @error(i32 %i, i32 1, i32 %b)
|
||||
br label %else3
|
||||
|
||||
else3:
|
||||
%gep4 = getelementptr i32* %a, i32 4
|
||||
%val4 = load i32* %gep4
|
||||
%cond4 = icmp ugt i32 %val4, 4
|
||||
br i1 %cond4, label %then4, label %else4, !prof !0
|
||||
|
||||
then4:
|
||||
call void @error(i32 %i, i32 1, i32 %b)
|
||||
br label %else4
|
||||
|
||||
else4:
|
||||
%gep5 = getelementptr i32* %a, i32 3
|
||||
%val5 = load i32* %gep5
|
||||
%cond5 = icmp ugt i32 %val5, 3
|
||||
br i1 %cond5, label %then5, label %exit, !prof !0
|
||||
|
||||
then5:
|
||||
call void @error(i32 %i, i32 1, i32 %b)
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
!0 = metadata !{metadata !"branch_weights", i32 4, i32 64}
|
Loading…
Reference in New Issue