mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-16 16:37:30 +00:00
8f2bcca5c7
This branch adds hints for highly biased branches on the PPC architecture. Even in absence of profiling information, LLVM will mark code reaching unreachable terminators and other exceptional control flow constructs as highly unlikely to be reached. Patch by Tom Jablin! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255398 91177308-0d34-0410-b5e6-96231b3b80d8
136 lines
2.4 KiB
LLVM
136 lines
2.4 KiB
LLVM
; RUN: llc < %s -O1 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -ppc-use-branch-hint=false | FileCheck %s
|
|
; RUN: llc < %s -O1 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -ppc-use-branch-hint=true | FileCheck %s -check-prefix=CHECK-HINT
|
|
define void @branch_hint_1(i32 %src) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src, 0
|
|
br i1 %cmp, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
tail call void @foo() #0
|
|
unreachable
|
|
|
|
if.end:
|
|
call void @goo()
|
|
ret void
|
|
|
|
; CHECK-LABEL: branch_hint_1:
|
|
; CHECK: beq
|
|
|
|
; CHECK-HINT-LABEL: branch_hint_1:
|
|
; CHECK-HINT: beq-
|
|
}
|
|
|
|
define void @branch_hint_2(i32 %src) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src, 0
|
|
br i1 %cmp, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
call void @goo()
|
|
ret void
|
|
|
|
if.end:
|
|
tail call void @foo() #0
|
|
unreachable
|
|
|
|
; CHECK-LABEL: @branch_hint_2
|
|
; CHECK: bne
|
|
|
|
; CHECK-HINT-LABEL: @branch_hint_2
|
|
; CHECK-HINT: bne-
|
|
}
|
|
|
|
declare void @foo()
|
|
attributes #0 = { noreturn }
|
|
|
|
define void @branch_hint_3(i32 %src) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src, 0
|
|
br i1 %cmp, label %if.then, label %if.end, !prof !0
|
|
|
|
if.then:
|
|
call void @foo()
|
|
ret void
|
|
|
|
if.end:
|
|
call void @goo()
|
|
ret void
|
|
|
|
; CHECK-LABEL: @branch_hint_3
|
|
; CHECK: bne
|
|
|
|
; CHECK-HINT-LABEL: @branch_hint_3
|
|
; CHECK-HINT: bne
|
|
}
|
|
|
|
!0 = !{!"branch_weights", i32 64, i32 4}
|
|
|
|
define void @branch_hint_4(i32 %src) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src, 0
|
|
br i1 %cmp, label %if.then, label %if.end, !prof !1
|
|
|
|
if.then:
|
|
call void @foo()
|
|
ret void
|
|
|
|
if.end:
|
|
call void @goo()
|
|
ret void
|
|
|
|
; CHECK-HINT-LABEL: branch_hint_4
|
|
; CHECK-HINT: bne
|
|
}
|
|
|
|
!1 = !{!"branch_weights", i32 64, i32 8}
|
|
|
|
define void @branch_hint_5(i32 %src) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src, 0
|
|
br i1 %cmp, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
ret void
|
|
|
|
if.end:
|
|
call void @goo()
|
|
ret void
|
|
|
|
; CHECK-HINT-LABEL: branch_hint_5:
|
|
; CHECK-HINT: beq
|
|
}
|
|
|
|
declare void @goo()
|
|
|
|
define void @branch_hint_6(i32 %src1, i32 %src2, i32 %src3) {
|
|
entry:
|
|
%cmp = icmp eq i32 %src1, 0
|
|
br i1 %cmp, label %if.end.6, label %if.end, !prof !3
|
|
|
|
if.end:
|
|
%cmp1 = icmp eq i32 %src2, 0
|
|
br i1 %cmp1, label %if.end.3, label %if.then.2
|
|
|
|
if.then.2:
|
|
tail call void @foo() #0
|
|
unreachable
|
|
|
|
if.end.3:
|
|
%cmp4 = icmp eq i32 %src3, 1
|
|
br i1 %cmp4, label %if.then.5, label %if.end.6
|
|
|
|
if.then.5:
|
|
tail call void @foo() #0
|
|
unreachable
|
|
|
|
if.end.6:
|
|
ret void
|
|
|
|
; CHECK-HINT-LABEL: branch_hint_6:
|
|
; CHECK-HINT: bne
|
|
; CHECK-HINT: bne-
|
|
; CHECK-HINT: bne+
|
|
}
|
|
|
|
!3 = !{!"branch_weights", i32 64, i32 4}
|