From 12ba7a90641e4cc008ef0a97c7aadd87b04c9537 Mon Sep 17 00:00:00 2001 From: Cong Hou Date: Tue, 22 Dec 2015 23:45:55 +0000 Subject: [PATCH 1/1] [BPI] Fix two potential divide-by-zero operations that are introduced in r256263. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256303 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BranchProbabilityInfo.cpp | 10 ++++++++-- lib/Transforms/Scalar/JumpThreading.cpp | 19 ++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/Analysis/BranchProbabilityInfo.cpp b/lib/Analysis/BranchProbabilityInfo.cpp index c7c2f436e8c..cf0cc8da6ef 100644 --- a/lib/Analysis/BranchProbabilityInfo.cpp +++ b/lib/Analysis/BranchProbabilityInfo.cpp @@ -221,8 +221,14 @@ bool BranchProbabilityInfo::calcMetadataWeights(BasicBlock *BB) { Weights[i] /= ScalingFactor; WeightSum += Weights[i]; } - for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) - setEdgeProbability(BB, i, {Weights[i], static_cast(WeightSum)}); + + if (WeightSum == 0) { + for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) + setEdgeProbability(BB, i, {1, e}); + } else { + for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) + setEdgeProbability(BB, i, {Weights[i], static_cast(WeightSum)}); + } assert(WeightSum <= UINT32_MAX && "Expected weights to scale down to 32 bits"); diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index d30c336be21..5c16b2c5de0 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -1647,14 +1647,19 @@ void JumpThreading::UpdateBlockFreqAndEdgeWeight(BasicBlock *PredBB, uint64_t MaxBBSuccFreq = *std::max_element(BBSuccFreq.begin(), BBSuccFreq.end()); - SmallVector BBSuccProbs; - for (uint64_t Freq : BBSuccFreq) - BBSuccProbs.push_back( - BranchProbability::getBranchProbability(Freq, MaxBBSuccFreq)); - // Normalize edge probabilities so that they sum up to one. - BranchProbability::normalizeProbabilities(BBSuccProbs.begin(), - BBSuccProbs.end()); + SmallVector BBSuccProbs; + if (MaxBBSuccFreq == 0) + BBSuccProbs.assign(BBSuccFreq.size(), + {1, static_cast(BBSuccFreq.size())}); + else { + for (uint64_t Freq : BBSuccFreq) + BBSuccProbs.push_back( + BranchProbability::getBranchProbability(Freq, MaxBBSuccFreq)); + // Normalize edge probabilities so that they sum up to one. + BranchProbability::normalizeProbabilities(BBSuccProbs.begin(), + BBSuccProbs.end()); + } // Update edge probabilities in BPI. for (int I = 0, E = BBSuccProbs.size(); I < E; I++) -- 2.34.1