diff options
| author | Manman Ren <mren@apple.com> | 2012-09-12 17:04:11 +0000 |
|---|---|---|
| committer | Manman Ren <mren@apple.com> | 2012-09-12 17:04:11 +0000 |
| commit | 49dbe255e650014a467a3b1aa83d4aa2fb68aadd (patch) | |
| tree | b60e38c3180f44ed904931ed7b197451e003ff86 /llvm/lib/Transforms/Utils/Local.cpp | |
| parent | 342cb7385c3bcb2cf0c2ae716dbc735e0db77d17 (diff) | |
| download | llvm-49dbe255e650014a467a3b1aa83d4aa2fb68aadd.zip llvm-49dbe255e650014a467a3b1aa83d4aa2fb68aadd.tar.gz llvm-49dbe255e650014a467a3b1aa83d4aa2fb68aadd.tar.bz2 | |
PGO: preserve branch-weight metadata when removing a case which jumps
to the default target.
llvm-svn: 163724
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 0601433..dc6b506a 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -23,6 +23,7 @@ #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" #include "llvm/Intrinsics.h" +#include "llvm/MDBuilder.h" #include "llvm/Metadata.h" #include "llvm/Operator.h" #include "llvm/ADT/DenseMap.h" @@ -122,6 +123,27 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions, // Check to see if this branch is going to the same place as the default // dest. If so, eliminate it as an explicit compare. if (i.getCaseSuccessor() == DefaultDest) { + MDNode* MD = SI->getMetadata(LLVMContext::MD_prof); + // MD should have 2 + NumCases operands. + if (MD && MD->getNumOperands() == 2 + SI->getNumCases()) { + // Collect branch weights into a vector. + SmallVector<uint32_t, 8> Weights; + for (unsigned MD_i = 1, MD_e = MD->getNumOperands(); MD_i < MD_e; + ++MD_i) { + ConstantInt* CI = dyn_cast<ConstantInt>(MD->getOperand(MD_i)); + assert(CI); + Weights.push_back(CI->getValue().getZExtValue()); + } + // Merge weight of this case to the default weight. + unsigned idx = i.getCaseIndex(); + Weights[0] += Weights[idx+1]; + // Remove weight for this case. + std::swap(Weights[idx+1], Weights.back()); + Weights.pop_back(); + SI->setMetadata(LLVMContext::MD_prof, + MDBuilder(BB->getContext()). + createBranchWeights(Weights)); + } // Remove this entry. DefaultDest->removePredecessor(SI->getParent()); SI->removeCase(i); |
