mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 00:16:25 +00:00
use "unpredictable" metadata in SelectionDAG when splitting compares
This patch uses the metadata defined in D12341 to avoid creating an unpredictable branch. Differential Revision: http://reviews.llvm.org/D12343 llvm-svn: 246691
This commit is contained in:
parent
9c0479fa99
commit
3f57358b22
@ -1625,11 +1625,12 @@ void SelectionDAGBuilder::visitBr(const BranchInst &I) {
|
||||
// jle foo
|
||||
//
|
||||
if (const BinaryOperator *BOp = dyn_cast<BinaryOperator>(CondVal)) {
|
||||
if (!DAG.getTargetLoweringInfo().isJumpExpensive() &&
|
||||
BOp->hasOneUse() && (BOp->getOpcode() == Instruction::And ||
|
||||
BOp->getOpcode() == Instruction::Or)) {
|
||||
Instruction::BinaryOps Opcode = BOp->getOpcode();
|
||||
if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp->hasOneUse() &&
|
||||
!I.getMetadata(LLVMContext::MD_unpredictable) &&
|
||||
(Opcode == Instruction::And || Opcode == Instruction::Or)) {
|
||||
FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB,
|
||||
BOp->getOpcode(), getEdgeWeight(BrMBB, Succ0MBB),
|
||||
Opcode, getEdgeWeight(BrMBB, Succ0MBB),
|
||||
getEdgeWeight(BrMBB, Succ1MBB));
|
||||
// If the compares in later blocks need to use values not currently
|
||||
// exported from this block, export them now. This block should always
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=0 | FileCheck %s --check-prefix=JUMP2
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=1 | FileCheck %s --check-prefix=JUMP1
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=0 | FileCheck %s --check-prefix=JUMP2 --check-prefix=CHECK
|
||||
; RUN: llc < %s -mtriple=i386-unknown-unknown -jump-is-expensive=1 | FileCheck %s --check-prefix=JUMP1 --check-prefix=CHECK
|
||||
|
||||
define void @foo(i32 %X, i32 %Y, i32 %Z) nounwind {
|
||||
; JUMP2-LABEL: foo:
|
||||
@ -25,4 +25,30 @@ UnifiedReturnBlock:
|
||||
ret void
|
||||
}
|
||||
|
||||
; If the branch is unpredictable, don't add another branch
|
||||
; regardless of whether they are expensive or not.
|
||||
|
||||
define void @unpredictable(i32 %X, i32 %Y, i32 %Z) nounwind {
|
||||
; CHECK-LABEL: unpredictable:
|
||||
; CHECK-DAG: sete
|
||||
; CHECK-DAG: setl
|
||||
; CHECK: orb
|
||||
; CHECK: jne
|
||||
entry:
|
||||
%tmp1 = icmp eq i32 %X, 0
|
||||
%tmp3 = icmp slt i32 %Y, 5
|
||||
%tmp4 = or i1 %tmp3, %tmp1
|
||||
br i1 %tmp4, label %cond_true, label %UnifiedReturnBlock, !unpredictable !0
|
||||
|
||||
cond_true:
|
||||
%tmp5 = tail call i32 (...) @bar( )
|
||||
ret void
|
||||
|
||||
UnifiedReturnBlock:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i32 @bar(...)
|
||||
|
||||
!0 = !{}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user