Check the case that the numerator and denominator are both zeros when getting edge...
authorCong Hou <congh@google.com>
Mon, 26 Oct 2015 18:00:17 +0000 (18:00 +0000)
committerCong Hou <congh@google.com>
Mon, 26 Oct 2015 18:00:17 +0000 (18:00 +0000)
This issue is triggered in PGO mode when bootstrapping LLVM. It seems that it is not guaranteed that edge weights are always greater than zero which are read from profile data.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251317 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BranchProbabilityInfo.cpp

index 9ab357b62cffeaffa142aec5d02e0dcfc04f9072..f483946986992c212a2e5ab58c48232a00f248ad 100644 (file)
@@ -623,6 +623,11 @@ getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const {
   uint32_t N = getEdgeWeight(Src, IndexInSuccessors);
   uint32_t D = getSumForBlock(Src);
 
+  // It is possible that the edge weight on the only successor edge of Src is
+  // zero, in which case we return 100%.
+  if (N == 0 && D == 0)
+    return BranchProbability::getOne();
+
   return BranchProbability(N, D);
 }
 
@@ -634,6 +639,11 @@ getEdgeProbability(const BasicBlock *Src, const BasicBlock *Dst) const {
   uint32_t N = getEdgeWeight(Src, Dst);
   uint32_t D = getSumForBlock(Src);
 
+  // It is possible that the edge weight on the only successor edge of Src is
+  // zero, in which case we return 100%.
+  if (N == 0 && D == 0)
+    return BranchProbability::getOne();
+
   return BranchProbability(N, D);
 }