llvm-cov: Added -u option for unconditional branch info.
[oota-llvm.git] / lib / IR / GCOV.cpp
index 78ff26251602a408901ecdf87e36d6f57095726f..929a5d45ca6c8ceebf6a6210cdf990048a4f2e66 100644 (file)
@@ -481,8 +481,13 @@ void FileInfo::print(StringRef GCNOFile, StringRef GCDAFile) const {
             continue;
           if (Options.AllBlocks)
             printBlockInfo(OS, *Block, LineIndex, BlockNo);
-          if (Options.BranchProb)
-            printBranchInfo(OS, *Block, LineIndex, EdgeNo);
+          if (Options.BranchProb) {
+            size_t NumEdges = Block->getNumDstEdges();
+            if (NumEdges > 1)
+              printBranchInfo(OS, *Block, EdgeNo);
+            else if (Options.UncondBranch && NumEdges == 1)
+              printUncondBranchInfo(OS, EdgeNo, (*Block->dst_begin())->Count);
+          }
         }
       }
     }
@@ -521,13 +526,9 @@ void FileInfo::printBlockInfo(raw_fd_ostream &OS, const GCOVBlock &Block,
   OS << format("%5u-block %2u\n", LineIndex+1, BlockNo++);
 }
 
-/// printBranchInfo - Print branch probabilities for blocks that have
-/// conditional branches.
+/// printBranchInfo - Print conditional branch probabilities.
 void FileInfo::printBranchInfo(raw_fd_ostream &OS, const GCOVBlock &Block,
-                               uint32_t LineIndex, uint32_t &EdgeNo) const {
-  if (Block.getNumDstEdges() < 2)
-    return;
-
+                               uint32_t &EdgeNo) const {
   SmallVector<uint64_t, 16> BranchCounts;
   uint64_t TotalCounts = 0;
   for (GCOVBlock::EdgeIterator I = Block.dst_begin(), E = Block.dst_end();
@@ -546,3 +547,12 @@ void FileInfo::printBranchInfo(raw_fd_ostream &OS, const GCOVBlock &Block,
       OS << format("branch %2u never executed\n", EdgeNo++);
   }
 }
+
+/// printUncondBranchInfo - Print unconditional branch probabilities.
+void FileInfo::printUncondBranchInfo(raw_fd_ostream &OS, uint32_t &EdgeNo,
+                                     uint64_t Count) const {
+  if (Count)
+    OS << format("unconditional %2u taken 100%%\n", EdgeNo++);
+  else
+    OS << format("unconditional %2u never executed\n", EdgeNo++);
+}