Skip to content

Commit

Permalink
[BFI/MBFI]: cfg graph view with color scheme
Browse files Browse the repository at this point in the history
This patch enhances dot graph viewer to show hot regions
with hot bbs/edges displayed in red. The ratio of the bb
freq to the max freq of the function needs to be no less
than the value specified by view-hot-freq-percent option.
The default value is 10 (i.e. 10%).




git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273996 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
david-xl committed Jun 28, 2016
1 parent 514f9dc commit cc075cf
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 4 deletions.
47 changes: 46 additions & 1 deletion include/llvm/Analysis/BlockFrequencyInfoImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1249,10 +1249,42 @@ struct BFIDOTGraphTraitsBase : public DefaultDOTGraphTraits {
typedef typename GTraits::ChildIteratorType EdgeIter;
typedef typename GTraits::nodes_iterator NodeIter;

uint64_t MaxFrequency = 0;
static std::string getGraphName(const BlockFrequencyInfoT *G) {
return G->getFunction()->getName();
}

std::string getNodeAttributes(const NodeType *Node,
const BlockFrequencyInfoT *Graph,
unsigned HotPercentThreshold = 0) {
std::string Result;
if (!HotPercentThreshold)
return Result;

// Compute MaxFrequency on the fly:
if (!MaxFrequency) {
for (NodeIter I = GTraits::nodes_begin(Graph),
E = GTraits::nodes_end(Graph);
I != E; ++I) {
NodeType &N = *I;
MaxFrequency =
std::max(MaxFrequency, Graph->getBlockFreq(&N).getFrequency());
}
}
BlockFrequency Freq = Graph->getBlockFreq(Node);
BlockFrequency HotFreq =
(BlockFrequency(MaxFrequency) *
BranchProbability::getBranchProbability(HotPercentThreshold, 100));

if (Freq < HotFreq)
return Result;

raw_string_ostream OS(Result);
OS << "color=\"red\"";
OS.flush();
return Result;
}

std::string getNodeLabel(const NodeType *Node,
const BlockFrequencyInfoT *Graph, GVDAGType GType) {
std::string Result;
Expand Down Expand Up @@ -1282,7 +1314,9 @@ struct BFIDOTGraphTraitsBase : public DefaultDOTGraphTraits {
}

std::string getEdgeAttributes(const NodeType *Node, EdgeIter EI,
const BranchProbabilityInfoT *BPI) {
const BlockFrequencyInfoT *BFI,
const BranchProbabilityInfoT *BPI,
unsigned HotPercentThreshold = 0) {
std::string Str;
if (!BPI)
return Str;
Expand All @@ -1293,6 +1327,17 @@ struct BFIDOTGraphTraitsBase : public DefaultDOTGraphTraits {
double Percent = 100.0 * N / D;
raw_string_ostream OS(Str);
OS << format("label=\"%.1f%%\"", Percent);

if (HotPercentThreshold) {
BlockFrequency EFreq = BFI->getBlockFreq(Node) * BP;
BlockFrequency HotFreq = BlockFrequency(MaxFrequency) *
BranchProbability(HotPercentThreshold, 100);

if (EFreq >= HotFreq) {
OS << ",color=\"red\"";
}
}

OS.flush();
return Str;
}
Expand Down
23 changes: 21 additions & 2 deletions lib/Analysis/BlockFrequencyInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,19 @@ static cl::opt<GVDAGType> ViewBlockFreqPropagationDAG(
"profile count if available."),
clEnumValEnd));

cl::opt<std::string> ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden);
cl::opt<std::string>
ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden,
cl::desc("The option to specify "
"the name of the function "
"whose CFG will be displayed."));

cl::opt<unsigned>
ViewHotFreqPercent("view-hot-freq-percent", cl::init(10), cl::Hidden,
cl::desc("An integer in percent used to specify "
"the hot blocks/edges to be displayed "
"in red: a block or edge whose frequency "
"is no less than the max frequency of the "
"function multiplied by this percent."));

namespace llvm {

Expand Down Expand Up @@ -84,9 +96,16 @@ struct DOTGraphTraits<BlockFrequencyInfo *> : public BFIDOTGTraitsBase {
ViewBlockFreqPropagationDAG);
}

std::string getNodeAttributes(const BasicBlock *Node,
const BlockFrequencyInfo *Graph) {
return BFIDOTGTraitsBase::getNodeAttributes(Node, Graph,
ViewHotFreqPercent);
}

std::string getEdgeAttributes(const BasicBlock *Node, EdgeIter EI,
const BlockFrequencyInfo *BFI) {
return BFIDOTGTraitsBase::getEdgeAttributes(Node, EI, BFI->getBPI());
return BFIDOTGTraitsBase::getEdgeAttributes(Node, EI, BFI, BFI->getBPI(),
ViewHotFreqPercent);
}
};

Expand Down
10 changes: 9 additions & 1 deletion lib/CodeGen/MachineBlockFrequencyInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ static cl::opt<GVDAGType> ViewMachineBlockFreqPropagationDAG(
clEnumValEnd));

extern cl::opt<std::string> ViewBlockFreqFuncName;
extern cl::opt<uint64_t> ViewHotFreqPercent;

namespace llvm {

Expand Down Expand Up @@ -92,9 +93,16 @@ struct DOTGraphTraits<MachineBlockFrequencyInfo *>
Node, Graph, ViewMachineBlockFreqPropagationDAG);
}

std::string getNodeAttributes(const MachineBasicBlock *Node,
const MachineBlockFrequencyInfo *Graph) {
return MBFIDOTGraphTraitsBase::getNodeAttributes(Node, Graph,
ViewHotFreqPercent);
}

std::string getEdgeAttributes(const MachineBasicBlock *Node, EdgeIter EI,
const MachineBlockFrequencyInfo *MBFI) {
return MBFIDOTGraphTraitsBase::getEdgeAttributes(Node, EI, MBFI->getMBPI());
return MBFIDOTGraphTraitsBase::getEdgeAttributes(
Node, EI, MBFI, MBFI->getMBPI(), ViewHotFreqPercent);
}
};

Expand Down

0 comments on commit cc075cf

Please sign in to comment.