Skip to content

Commit

Permalink
Add support to dump dot graph block layout after MBP
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D29141

llvm-svn: 293408
  • Loading branch information
david-xl committed Jan 29, 2017
1 parent 9d8f6f8 commit fd3f645
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 8 deletions.
7 changes: 5 additions & 2 deletions llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
Expand Up @@ -1291,11 +1291,14 @@ struct BFIDOTGraphTraitsBase : public DefaultDOTGraphTraits {
}

std::string getNodeLabel(NodeRef Node, const BlockFrequencyInfoT *Graph,
GVDAGType GType) {
GVDAGType GType, int layout_order = -1) {
std::string Result;
raw_string_ostream OS(Result);

OS << Node->getName().str() << " : ";
if (layout_order != -1)
OS << Node->getName() << "[" << layout_order << "] : ";
else
OS << Node->getName() << " : ";
switch (GType) {
case GVDT_Fraction:
Graph->printBlockFreq(OS, Node);
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h
Expand Up @@ -56,7 +56,7 @@ class MachineBlockFrequencyInfo : public MachineFunctionPass {

const MachineFunction *getFunction() const;
const MachineBranchProbabilityInfo *getMBPI() const;
void view() const;
void view(bool isSimple = true) const;

// Print the block frequency Freq to OS using the current functions entry
// frequency to convert freq into a relative decimal form.
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/BranchFolding.cpp
Expand Up @@ -498,6 +498,8 @@ BranchFolder::MBFIWrapper::printBlockFreq(raw_ostream &OS,
return MBFI.printBlockFreq(OS, Freq);
}

void BranchFolder::MBFIWrapper::view(bool isSimple) { MBFI.view(isSimple); }

/// CountTerminators - Count the number of terminators in the given
/// block and set I to the position of the first non-terminator, if there
/// is one, or MBB->end() otherwise.
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/CodeGen/BranchFolding.h
Expand Up @@ -122,6 +122,7 @@ namespace llvm {
const MachineBasicBlock *MBB) const;
raw_ostream &printBlockFreq(raw_ostream &OS,
const BlockFrequency Freq) const;
void view(bool isSimple = true);

private:
const MachineBlockFrequencyInfo &MBFI;
Expand Down
53 changes: 48 additions & 5 deletions llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp
Expand Up @@ -43,10 +43,33 @@ static cl::opt<GVDAGType> ViewMachineBlockFreqPropagationDAG(
"integer fractional block frequency representation."),
clEnumValN(GVDT_Count, "count", "display a graph using the real "
"profile count if available.")));
// Similar option above, but used to control BFI display only after MBP pass
cl::opt<GVDAGType> ViewBlockLayoutWithBFI(
"view-block-layout-with-bfi", cl::Hidden,
cl::desc(
"Pop up a window to show a dag displaying MBP layout and associated "
"block frequencies of the CFG."),
cl::values(clEnumValN(GVDT_None, "none", "do not display graphs."),
clEnumValN(GVDT_Fraction, "fraction",
"display a graph using the "
"fractional block frequency representation."),
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.")));

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

static GVDAGType getGVDT() {
if (ViewBlockLayoutWithBFI != GVDT_None)
return ViewBlockLayoutWithBFI;

return ViewMachineBlockFreqPropagationDAG;
}

namespace llvm {

template <> struct GraphTraits<MachineBlockFrequencyInfo *> {
Expand Down Expand Up @@ -80,12 +103,32 @@ template <>
struct DOTGraphTraits<MachineBlockFrequencyInfo *>
: public MBFIDOTGraphTraitsBase {
explicit DOTGraphTraits(bool isSimple = false)
: MBFIDOTGraphTraitsBase(isSimple) {}
: MBFIDOTGraphTraitsBase(isSimple), CurFunc(nullptr), LayoutOrderMap() {}

const MachineFunction *CurFunc;
DenseMap<const MachineBasicBlock *, int> LayoutOrderMap;

std::string getNodeLabel(const MachineBasicBlock *Node,
const MachineBlockFrequencyInfo *Graph) {
return MBFIDOTGraphTraitsBase::getNodeLabel(
Node, Graph, ViewMachineBlockFreqPropagationDAG);

int layout_order = -1;
// Attach additional ordering information if 'isSimple' is false.
if (!isSimple()) {
const MachineFunction *F = Node->getParent();
if (!CurFunc || F != CurFunc) {
if (CurFunc)
LayoutOrderMap.clear();

CurFunc = F;
int O = 0;
for (auto MBI = F->begin(); MBI != F->end(); ++MBI, ++O) {
LayoutOrderMap[&*MBI] = O;
}
}
layout_order = LayoutOrderMap[Node];
}
return MBFIDOTGraphTraitsBase::getNodeLabel(Node, Graph, getGVDT(),
layout_order);
}

std::string getNodeAttributes(const MachineBasicBlock *Node,
Expand Down Expand Up @@ -148,11 +191,11 @@ void MachineBlockFrequencyInfo::releaseMemory() { MBFI.reset(); }

/// Pop up a ghostview window with the current block frequency propagation
/// rendered using dot.
void MachineBlockFrequencyInfo::view() const {
void MachineBlockFrequencyInfo::view(bool isSimple) const {
// This code is only for debugging.
#ifndef NDEBUG
ViewGraph(const_cast<MachineBlockFrequencyInfo *>(this),
"MachineBlockFrequencyDAGs");
"MachineBlockFrequencyDAGs", isSimple);
#else
errs() << "MachineBlockFrequencyInfo::view is only available in debug builds "
"on systems with Graphviz or gv!\n";
Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/CodeGen/MachineBlockPlacement.cpp
Expand Up @@ -32,6 +32,7 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/BlockFrequencyInfoImpl.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
Expand Down Expand Up @@ -146,6 +147,11 @@ static cl::opt<unsigned> TailDuplicatePlacementThreshold(
extern cl::opt<unsigned> StaticLikelyProb;
extern cl::opt<unsigned> ProfileLikelyProb;

#ifndef NDEBUG
extern cl::opt<GVDAGType> ViewBlockLayoutWithBFI;
extern cl::opt<std::string> ViewBlockFreqFuncName;
#endif

namespace {
class BlockChain;
/// \brief Type for our function-wide basic block -> block chain mapping.
Expand Down Expand Up @@ -2067,6 +2073,14 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
MBI->setAlignment(AlignAllNonFallThruBlocks);
}
}
#ifndef NDEBUG
if (ViewBlockLayoutWithBFI != GVDT_None &&
(ViewBlockFreqFuncName.empty() ||
F->getFunction()->getName().equals(ViewBlockFreqFuncName))) {
MBFI->view(false);
}
#endif


// We always return true as we have no way to track whether the final order
// differs from the original order.
Expand Down

0 comments on commit fd3f645

Please sign in to comment.