Skip to content

Commit

Permalink
[Profile] preserve branch metadata lowering select in CGP
Browse files Browse the repository at this point in the history
CGP currently drops select's MD_prof profile data when
generating conditional branch which can lead to bad
code layout. The patch fixes the issue.

Differential Revision: http://reviews.llvm.org/D24169

llvm-svn: 280600
  • Loading branch information
david-xl committed Sep 3, 2016
1 parent ebb3434 commit 241e6c7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 8 deletions.
13 changes: 13 additions & 0 deletions llvm/include/llvm/IR/IRBuilder.h
Expand Up @@ -703,6 +703,19 @@ class IRBuilder : public IRBuilderBase, public Inserter {
BranchWeights, Unpredictable));
}

/// \brief Create a conditional 'br Cond, TrueDest, FalseDest'
/// instruction. Copy branch meta data if available.
BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False,
Instruction *MDSrc) {
BranchInst *Br = BranchInst::Create(True, False, Cond);
if (MDSrc) {
unsigned WL[4] = {LLVMContext::MD_prof, LLVMContext::MD_unpredictable,
LLVMContext::MD_make_implicit, LLVMContext::MD_dbg};
Br->copyMetadata(*MDSrc, makeArrayRef(&WL[0], 4));
}
return Insert(Br);
}

/// \brief Create a switch instruction with the specified value, default dest,
/// and with a hint for the number of cases that will be added (for efficient
/// allocation).
Expand Down
11 changes: 8 additions & 3 deletions llvm/lib/CodeGen/CodeGenPrepare.cpp
Expand Up @@ -4676,15 +4676,20 @@ bool CodeGenPrepare::optimizeSelectInst(SelectInst *SI) {
// of the condition, it means that side of the branch goes to the end block
// directly and the path originates from the start block from the point of
// view of the new PHI.
BasicBlock *TT, *FT;
if (TrueBlock == nullptr) {
BranchInst::Create(EndBlock, FalseBlock, SI->getCondition(), SI);
TT = EndBlock;
FT = FalseBlock;
TrueBlock = StartBlock;
} else if (FalseBlock == nullptr) {
BranchInst::Create(TrueBlock, EndBlock, SI->getCondition(), SI);
TT = TrueBlock;
FT = EndBlock;
FalseBlock = StartBlock;
} else {
BranchInst::Create(TrueBlock, FalseBlock, SI->getCondition(), SI);
TT = TrueBlock;
FT = FalseBlock;
}
IRBuilder<>(SI).CreateCondBr(SI->getCondition(), TT, FT, SI);

// The select itself is replaced with a PHI Node.
PHINode *PN = PHINode::Create(SI->getType(), 2, "", &EndBlock->front());
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/CodeGen/X86/cmov-into-branch.ll
Expand Up @@ -103,11 +103,11 @@ define i32 @weighted_select3(i32 %a, i32 %b) {
; CHECK-LABEL: weighted_select3:
; CHECK: # BB#0:
; CHECK-NEXT: testl %edi, %edi
; CHECK-NEXT: jne [[LABEL_BB6:.*]]
; CHECK: movl %esi, %edi
; CHECK-NEXT: [[LABEL_BB6]]
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: retq
; CHECK-NEXT: je [[LABEL_BB6:.*]]
; CHECK: movl %edi, %eax
; CHECK: [[LABEL_BB6]]
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: jmp
;
%cmp = icmp ne i32 %a, 0
%sel = select i1 %cmp, i32 %a, i32 %b, !prof !2
Expand Down
16 changes: 16 additions & 0 deletions llvm/test/CodeGen/X86/select_meta.ll
@@ -0,0 +1,16 @@
; RUN: llc -mtriple=x86_64-unknown-unknown -print-after-all < %s 2>&1 | FileCheck %s

; Function Attrs: norecurse nounwind readnone uwtable
define i32 @foo(i32, i32, i32) {
%4 = and i32 %0, 3
%5 = icmp eq i32 %4, 1
%6 = select i1 %5, i32 %1, i32 %2, !prof !1
; CHECK: br {{.*}}label{{.*}}, label{{.*}}, !prof ![[WT:.*]]
ret i32 %6
}

!llvm.ident = !{!0}

!0 = !{!"clang version 4.0.0 (trunk 279683)"}
!1 = !{!"branch_weights", i32 1000, i32 1 }
; CHECK ![[WT]] = !{!"branch_weights", i32 1000, i32 1 }

0 comments on commit 241e6c7

Please sign in to comment.