[BPI] Fix two potential divide-by-zero operations that are introduced in r256263.
authorCong Hou <congh@google.com>
Tue, 22 Dec 2015 23:45:55 +0000 (23:45 +0000)
committerCong Hou <congh@google.com>
Tue, 22 Dec 2015 23:45:55 +0000 (23:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256303 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BranchProbabilityInfo.cpp
lib/Transforms/Scalar/JumpThreading.cpp

index c7c2f436e8c43ed87551748ce4d8332b8d9ea1ab..cf0cc8da6ef80597191696d31fc2f04ef906e90b 100644 (file)
@@ -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<uint32_t>(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<uint32_t>(WeightSum)});
+  }
 
   assert(WeightSum <= UINT32_MAX &&
          "Expected weights to scale down to 32 bits");
index d30c336be2125e6bdf73167f4b26b93d3218959c..5c16b2c5de0ca53af5960702b119661951b091d0 100644 (file)
@@ -1647,14 +1647,19 @@ void JumpThreading::UpdateBlockFreqAndEdgeWeight(BasicBlock *PredBB,
 
   uint64_t MaxBBSuccFreq =
       *std::max_element(BBSuccFreq.begin(), BBSuccFreq.end());
-  SmallVector<BranchProbability, 4> 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<BranchProbability, 4> BBSuccProbs;
+  if (MaxBBSuccFreq == 0)
+    BBSuccProbs.assign(BBSuccFreq.size(),
+                       {1, static_cast<unsigned>(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++)