OSDN Git Service

[MBFI]: Add a new suboption for graph viewer
authorXinliang David Li <davidxl@google.com>
Wed, 22 Jun 2016 19:26:44 +0000 (19:26 +0000)
committerXinliang David Li <davidxl@google.com>
Wed, 22 Jun 2016 19:26:44 +0000 (19:26 +0000)
 -view-machine-block-freq-propagation-dags currently
support integer and fraction as the suboptions. This
patch adds the 'count' suboption to display actual
profile count if available.

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

include/llvm/CodeGen/MachineBlockFrequencyInfo.h
lib/CodeGen/MachineBlockFrequencyInfo.cpp

index feb394e..4a881ee 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H
 #define LLVM_CODEGEN_MACHINEBLOCKFREQUENCYINFO_H
 
+#include "llvm/ADT/Optional.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/Support/BlockFrequency.h"
 #include <climits>
@@ -50,6 +51,8 @@ public:
   ///
   BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const;
 
+  Optional<uint64_t> getBlockProfileCount(const MachineBasicBlock *MBB) const;
+
   const MachineFunction *getFunction() const;
   void view() const;
 
index f83e7ff..689deb8 100644 (file)
@@ -29,7 +29,7 @@ using namespace llvm;
 #define DEBUG_TYPE "block-freq"
 
 #ifndef NDEBUG
-enum GVDAGType { GVDT_None, GVDT_Fraction, GVDT_Integer };
+enum GVDAGType { GVDT_None, GVDT_Fraction, GVDT_Integer, GVDT_Count };
 
 static cl::opt<GVDAGType> ViewMachineBlockFreqPropagationDAG(
     "view-machine-block-freq-propagation-dags", cl::Hidden,
@@ -42,6 +42,9 @@ static cl::opt<GVDAGType> ViewMachineBlockFreqPropagationDAG(
                clEnumValN(GVDT_Integer, "integer",
                           "display a graph using the raw "
                           "integer fractional block frequency representation."),
+               clEnumValN(GVDT_Count, "count", "display a graph using the real "
+                                               "profile count if available."),
+
                clEnumValEnd));
 
 static cl::opt<std::string> ViewMachineBlockFreqFuncName("view-mbfi-func-name",
@@ -92,7 +95,7 @@ struct DOTGraphTraits<MachineBlockFrequencyInfo *>
     std::string Result;
     raw_string_ostream OS(Result);
 
-    OS << Node->getName().str() << ":";
+    OS << Node->getName().str() << " : ";
     switch (ViewMachineBlockFreqPropagationDAG) {
     case GVDT_Fraction:
       Graph->printBlockFreq(OS, Node);
@@ -100,11 +103,18 @@ struct DOTGraphTraits<MachineBlockFrequencyInfo *>
     case GVDT_Integer:
       OS << Graph->getBlockFreq(Node).getFrequency();
       break;
+    case GVDT_Count: {
+      auto Count = Graph->getBlockProfileCount(Node);
+      if (Count)
+        OS << Count.getValue();
+      else
+        OS << "Unknown";
+      break;
+    }
     case GVDT_None:
       llvm_unreachable("If we are not supposed to render a graph we should "
                        "never reach this point.");
     }
-
     return Result;
   }
   static std::string getEdgeAttributes(const MachineBasicBlock *Node,
@@ -187,6 +197,12 @@ MachineBlockFrequencyInfo::getBlockFreq(const MachineBasicBlock *MBB) const {
   return MBFI ? MBFI->getBlockFreq(MBB) : 0;
 }
 
+Optional<uint64_t> MachineBlockFrequencyInfo::getBlockProfileCount(
+    const MachineBasicBlock *MBB) const {
+  const Function *F = MBFI->getFunction()->getFunction();
+  return MBFI ? MBFI->getBlockProfileCount(*F, MBB) : None;
+}
+
 const MachineFunction *MachineBlockFrequencyInfo::getFunction() const {
   return MBFI ? MBFI->getFunction() : nullptr;
 }