aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
diff options
context:
space:
mode:
authorXinliang David Li <davidxl@google.com>2016-08-23 15:39:03 +0000
committerXinliang David Li <davidxl@google.com>2016-08-23 15:39:03 +0000
commitdc49140b4429c3eb0966f8169cd533660002ae41 (patch)
tree783ec039399dafbc974ee1c837c178cd23116ca6 /llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
parent298d5462970349ddb9acccad7ebdc5eb3476f7a5 (diff)
downloadllvm-dc49140b4429c3eb0966f8169cd533660002ae41.zip
llvm-dc49140b4429c3eb0966f8169cd533660002ae41.tar.gz
llvm-dc49140b4429c3eb0966f8169cd533660002ae41.tar.bz2
[Profile] refactor meta data copying/swapping code
Differential Revision: http://reviews.llvm.org/D23619 llvm-svn: 279523
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopUnswitch.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopUnswitch.cpp45
1 files changed, 8 insertions, 37 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
index ee8c324..93c10d5 100644
--- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
@@ -742,42 +742,6 @@ static Loop *CloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM,
return &New;
}
-static void copyMetadata(Instruction *DstInst, const Instruction *SrcInst,
- bool Swapped) {
- if (!SrcInst || !SrcInst->hasMetadata())
- return;
-
- SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
- SrcInst->getAllMetadata(MDs);
- for (auto &MD : MDs) {
- switch (MD.first) {
- default:
- break;
- case LLVMContext::MD_prof:
- if (Swapped && MD.second->getNumOperands() == 3 &&
- isa<MDString>(MD.second->getOperand(0))) {
- MDString *MDName = cast<MDString>(MD.second->getOperand(0));
- if (MDName->getString() == "branch_weights") {
- auto *ValT = cast_or_null<ConstantAsMetadata>(
- MD.second->getOperand(1))->getValue();
- auto *ValF = cast_or_null<ConstantAsMetadata>(
- MD.second->getOperand(2))->getValue();
- assert(ValT && ValF && "Invalid Operands of branch_weights");
- auto NewMD =
- MDBuilder(DstInst->getParent()->getContext())
- .createBranchWeights(cast<ConstantInt>(ValF)->getZExtValue(),
- cast<ConstantInt>(ValT)->getZExtValue());
- MD.second = NewMD;
- }
- }
- LLVM_FALLTHROUGH;
- case LLVMContext::MD_make_implicit:
- case LLVMContext::MD_dbg:
- DstInst->setMetadata(MD.first, MD.second);
- }
- }
-}
-
/// Emit a conditional branch on two values if LIC == Val, branch to TrueDst,
/// otherwise branch to FalseDest. Insert the code immediately before InsertPt.
void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,
@@ -800,7 +764,14 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,
// Insert the new branch.
BranchInst *BI = BranchInst::Create(TrueDest, FalseDest, BranchVal, InsertPt);
- copyMetadata(BI, TI, Swapped);
+ if (TI) {
+ // FIXME: check why white list is needed here:
+ ArrayRef<unsigned> WL = {LLVMContext::MD_dbg, LLVMContext::MD_prof,
+ LLVMContext::MD_make_implicit};
+ BI->copyMetadata(*TI, WL);
+ if (Swapped)
+ BI->swapProfMetadata();
+ }
// If either edge is critical, split it. This helps preserve LoopSimplify
// form for enclosing loops.