Skip to content

Commit

Permalink
propagate 'unpredictable' metadata on select instructions
Browse files Browse the repository at this point in the history
This is similar to D18133 where we allowed profile weights on select instructions. 
This extends that change to also allow the 'unpredictable' attribute of branches to apply to selects.

A test to check that 'unpredictable' metadata is preserved when cloning instructions was checked in at:
http://reviews.llvm.org/rL263648

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

llvm-svn: 263716
  • Loading branch information
rotateright committed Mar 17, 2016
1 parent 071a099 commit 9e23fed
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 9 deletions.
9 changes: 6 additions & 3 deletions llvm/include/llvm/IR/IRBuilder.h
Expand Up @@ -1569,15 +1569,18 @@ class IRBuilder : public IRBuilderBase, public Inserter {
}

Value *CreateSelect(Value *C, Value *True, Value *False,
const Twine &Name = "", MDNode *ProfWeights = nullptr) {
const Twine &Name = "", Instruction *MDFrom = nullptr) {
if (Constant *CC = dyn_cast<Constant>(C))
if (Constant *TC = dyn_cast<Constant>(True))
if (Constant *FC = dyn_cast<Constant>(False))
return Insert(Folder.CreateSelect(CC, TC, FC), Name);

SelectInst *Sel = SelectInst::Create(C, True, False);
// TODO: "unpredictable" metadata can apply to a select too.
Sel->setMetadata(LLVMContext::MD_prof, ProfWeights);
if (MDFrom) {
MDNode *Prof = MDFrom->getMetadata(LLVMContext::MD_prof);
MDNode *Unpred = MDFrom->getMetadata(LLVMContext::MD_unpredictable);
Sel = addBranchMetadata(Sel, Prof, Unpred);
}
return Insert(Sel, Name);
}

Expand Down
7 changes: 3 additions & 4 deletions llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Expand Up @@ -1935,10 +1935,9 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
Value *TrueVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfFalse);
Value *FalseVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfTrue);

MDNode *MDN = InsertPt->getMetadata(LLVMContext::MD_prof);
Value *Select = Builder.CreateSelect(IfCond, TrueVal, FalseVal, "", MDN);
PN->replaceAllUsesWith(Select);
Select->takeName(PN);
Value *Sel = Builder.CreateSelect(IfCond, TrueVal, FalseVal, "", InsertPt);
PN->replaceAllUsesWith(Sel);
Sel->takeName(PN);
PN->eraseFromParent();
}

Expand Down
6 changes: 4 additions & 2 deletions llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll
Expand Up @@ -5,7 +5,7 @@

define i32 @FoldTwoEntryPHINode(i1 %C, i32 %V1, i32 %V2, i16 %V3) {
entry:
br i1 %C, label %then, label %else, !prof !0
br i1 %C, label %then, label %else, !prof !0, !unpredictable !1
then:
%V4 = or i32 %V2, %V1
br label %Cont
Expand All @@ -21,12 +21,14 @@ Cont:
; CHECK-NEXT: entry:
; CHECK-NEXT: %V5 = sext i16 %V3 to i32
; CHECK-NEXT: %V4 = or i32 %V2, %V1
; CHECK-NEXT: %V6 = select i1 %C, i32 %V4, i32 %V5, !prof !0
; CHECK-NEXT: %V6 = select i1 %C, i32 %V4, i32 %V5, !prof !0, !unpredictable !1
; CHECK-NEXT: %0 = call i32 @FoldTwoEntryPHINode(i1 false, i32 0, i32 0, i16 0)
; CHECK-NEXT: ret i32 %V1
}

!0 = !{!"branch_weights", i32 3, i32 5}
!1 = !{}

; CHECK: !0 = !{!"branch_weights", i32 3, i32 5}
; CHECK: !1 = !{}

0 comments on commit 9e23fed

Please sign in to comment.