[llvm] r263716 - propagate 'unpredictable' metadata on select instructions
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 17 08:30:53 PDT 2016
Author: spatel
Date: Thu Mar 17 10:30:52 2016
New Revision: 263716
URL: http://llvm.org/viewvc/llvm-project?rev=263716&view=rev
Log:
propagate 'unpredictable' metadata on select instructions
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
Modified:
llvm/trunk/include/llvm/IR/IRBuilder.h
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll
Modified: llvm/trunk/include/llvm/IR/IRBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IRBuilder.h?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/IRBuilder.h (original)
+++ llvm/trunk/include/llvm/IR/IRBuilder.h Thu Mar 17 10:30:52 2016
@@ -1569,15 +1569,18 @@ public:
}
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);
}
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Thu Mar 17 10:30:52 2016
@@ -1935,10 +1935,9 @@ static bool FoldTwoEntryPHINode(PHINode
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();
}
Modified: llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll Thu Mar 17 10:30:52 2016
@@ -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
@@ -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 = !{}
More information about the llvm-commits
mailing list