summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2014-03-09 14:42:55 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2014-03-09 14:42:55 +0000
commit4b484628f452dcd119ad855f114ca29d26829d90 (patch)
tree929880ca761b7712dd5a3f0493ad9cb6208a98fb
parentc52fffeb1737fef4bc21c2068c3c6ac2c60a4e19 (diff)
downloadllvm-4b484628f452dcd119ad855f114ca29d26829d90.tar.gz
llvm-4b484628f452dcd119ad855f114ca29d26829d90.tar.bz2
llvm-4b484628f452dcd119ad855f114ca29d26829d90.tar.xz
SimplifyCFG: Simplify the weight scaling algorithm.
No change in functionality. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203413 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp21
1 files changed, 6 insertions, 15 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
index 80f122ab83..5b3bdbe4be 100644
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -732,8 +732,7 @@ static void GetBranchWeights(TerminatorInst *TI,
MDNode* MD = TI->getMetadata(LLVMContext::MD_prof);
assert(MD);
for (unsigned i = 1, e = MD->getNumOperands(); i < e; ++i) {
- ConstantInt* CI = dyn_cast<ConstantInt>(MD->getOperand(i));
- assert(CI);
+ ConstantInt *CI = cast<ConstantInt>(MD->getOperand(i));
Weights.push_back(CI->getValue().getZExtValue());
}
@@ -750,19 +749,11 @@ static void GetBranchWeights(TerminatorInst *TI,
/// Keep halving the weights until all can fit in uint32_t.
static void FitWeights(MutableArrayRef<uint64_t> Weights) {
- while (true) {
- bool Halve = false;
- for (unsigned i = 0; i < Weights.size(); ++i)
- if (Weights[i] > UINT_MAX) {
- Halve = true;
- break;
- }
-
- if (! Halve)
- return;
-
- for (unsigned i = 0; i < Weights.size(); ++i)
- Weights[i] /= 2;
+ uint64_t Max = *std::max_element(Weights.begin(), Weights.end());
+ if (Max > UINT_MAX) {
+ unsigned Offset = 32 - countLeadingZeros(Max);
+ for (uint64_t &I : Weights)
+ I >>= Offset;
}
}