llvm/test/CodeGen/PowerPC/branch-hint.ll
Hal Finkel 8f2bcca5c7 [PowerPC] Add Branch Hints for Highly-Biased Branches
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
2015-12-12 00:32:00 +00:00

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}