From 9e23fedaf0f84d4a020514df4beefe65fe6da50b Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 17 Mar 2016 15:30:52 +0000 Subject: [PATCH] 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 llvm-svn: 263716 --- llvm/include/llvm/IR/IRBuilder.h | 9 ++++++--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 7 +++---- llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll | 6 ++++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index a9c9c81719f2a..d79ac1bf519c9 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -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(C)) if (Constant *TC = dyn_cast(True)) if (Constant *FC = dyn_cast(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); } diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index bf94e2629caaa..7d210e6cb78b0 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -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(); } diff --git a/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll b/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll index 60931fc71aaf6..0ca65286da35a 100644 --- a/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll +++ b/llvm/test/Transforms/SimplifyCFG/PhiEliminate2.ll @@ -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 = !{}