Make ProfileEstimator more robust on general CFGs.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81450 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/ProfileVerifierPass.cpp b/lib/Analysis/ProfileVerifierPass.cpp
index 1692522..0be4de4 100644
--- a/lib/Analysis/ProfileVerifierPass.cpp
+++ b/lib/Analysis/ProfileVerifierPass.cpp
@@ -223,17 +223,28 @@
   DI.BB = BB;
   DI.outCount = DI.inCount = DI.inWeight = DI.outWeight = 0;
   std::set<const BasicBlock*> ProcessedPreds;
-  for (pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
-       bbi != bbe; ++bbi) {
-    if (ProcessedPreds.insert(*bbi).second) {
-      DI.inWeight += ReadOrAssert(PI->getEdge(*bbi,BB));
+  pred_const_iterator bpi = pred_begin(BB), bpe = pred_end(BB);
+  if (bpi == bpe) {
+    DI.inWeight += ReadOrAssert(PI->getEdge(0,BB));
+    DI.inCount++;
+  }
+  for (;bpi != bpe; ++bpi) {
+    if (ProcessedPreds.insert(*bpi).second) {
+      DI.inWeight += ReadOrAssert(PI->getEdge(*bpi,BB));
       DI.inCount++;
     }
   }
 
   std::set<const BasicBlock*> ProcessedSuccs;
-  for (succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
-       bbi != bbe; ++bbi) {
+  succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
+  if (bbi == bbe) {
+    double w = PI->getEdgeWeight(PI->getEdge(BB,0));
+    if (w != ProfileInfo::MissingValue) {
+      DI.outWeight += w;
+      DI.outCount++;
+    }
+  }
+  for (;bbi != bbe; ++bbi) {
     if (ProcessedSuccs.insert(*bbi).second) {
       DI.outWeight += ReadOrAssert(PI->getEdge(BB,*bbi));
       DI.outCount++;