diff options
author | Sanjay Patel <spatel@rotateright.com> | 2016-03-17 15:30:52 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2016-03-17 15:30:52 +0000 |
commit | 9e23fedaf0f84d4a020514df4beefe65fe6da50b (patch) | |
tree | 420dd16d18265ca8093bee18ef4d625e3d3d4f3e | |
parent | 071a099102a4183309dbc80d52fc2454a9222f1e (diff) | |
download | bcm5719-llvm-9e23fedaf0f84d4a020514df4beefe65fe6da50b.tar.gz bcm5719-llvm-9e23fedaf0f84d4a020514df4beefe65fe6da50b.zip |
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
-rw-r--r-- | llvm/include/llvm/IR/IRBuilder.h | 9 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 7 | ||||
-rw-r--r-- | 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 a9c9c81719f..d79ac1bf519 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -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); } diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index bf94e2629ca..7d210e6cb78 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 60931fc71aa..0ca65286da3 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 = !{} |