Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 33 additions & 15 deletions llvm/include/llvm/Analysis/CFGPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
#include "llvm/Support/DOTGraphTraits.h"
#include "llvm/Support/FormatVariadic.h"

#include <functional>
#include <sstream>

namespace llvm {
class ModuleSlotTracker;

Expand Down Expand Up @@ -69,13 +72,18 @@ class DOTFuncInfo {
bool ShowHeat;
bool EdgeWeights;
bool RawWeights;
using NodeIdFormatterTy =
std::function<std::optional<std::string>(const BasicBlock *)>;
std::optional<NodeIdFormatterTy> NodeIdFormatter;

public:
DOTFuncInfo(const Function *F) : DOTFuncInfo(F, nullptr, nullptr, 0) {}
LLVM_ABI ~DOTFuncInfo();

LLVM_ABI DOTFuncInfo(const Function *F, const BlockFrequencyInfo *BFI,
const BranchProbabilityInfo *BPI, uint64_t MaxFreq);
LLVM_ABI
DOTFuncInfo(const Function *F, const BlockFrequencyInfo *BFI,
const BranchProbabilityInfo *BPI, uint64_t MaxFreq,
std::optional<NodeIdFormatterTy> NodeIdFormatter = std::nullopt);

const BlockFrequencyInfo *getBFI() const { return BFI; }

Expand All @@ -102,6 +110,10 @@ class DOTFuncInfo {
void setEdgeWeights(bool EdgeWeights) { this->EdgeWeights = EdgeWeights; }

bool showEdgeWeights() { return EdgeWeights; }

std::optional<NodeIdFormatterTy> getNodeIdFormatter() {
return NodeIdFormatter;
}
};

template <>
Expand Down Expand Up @@ -311,21 +323,27 @@ struct DOTGraphTraits<DOTFuncInfo *> : public DefaultDOTGraphTraits {
}

std::string getNodeAttributes(const BasicBlock *Node, DOTFuncInfo *CFGInfo) {
std::stringstream Attrs;

if (auto NodeIdFmt = CFGInfo->getNodeIdFormatter())
if (auto NodeId = (*NodeIdFmt)(Node))
Attrs << "id=\"" << *NodeId << "\"";

if (CFGInfo->showHeatColors()) {
uint64_t Freq = CFGInfo->getFreq(Node);
std::string Color = getHeatColor(Freq, CFGInfo->getMaxFreq());
std::string EdgeColor = (Freq <= (CFGInfo->getMaxFreq() / 2))
? (getHeatColor(0))
: (getHeatColor(1));
if (!Attrs.str().empty())
Attrs << ",";
Attrs << "color=\"" << EdgeColor << "ff\", style=filled, "
<< "fillcolor=\"" << Color << "70\", " << "fontname=\"Courier\"";
}

if (!CFGInfo->showHeatColors())
return "";

uint64_t Freq = CFGInfo->getFreq(Node);
std::string Color = getHeatColor(Freq, CFGInfo->getMaxFreq());
std::string EdgeColor = (Freq <= (CFGInfo->getMaxFreq() / 2))
? (getHeatColor(0))
: (getHeatColor(1));

std::string Attrs = "color=\"" + EdgeColor + "ff\", style=filled," +
" fillcolor=\"" + Color + "70\"" +
" fontname=\"Courier\"";
return Attrs;
return Attrs.str();
}

LLVM_ABI bool isNodeHidden(const BasicBlock *Node,
const DOTFuncInfo *CFGInfo);
LLVM_ABI void computeDeoptOrUnreachablePaths(const Function *F);
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/Analysis/CFGPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ static void viewCFG(Function &F, const BlockFrequencyInfo *BFI,
}

DOTFuncInfo::DOTFuncInfo(const Function *F, const BlockFrequencyInfo *BFI,
const BranchProbabilityInfo *BPI, uint64_t MaxFreq)
: F(F), BFI(BFI), BPI(BPI), MaxFreq(MaxFreq) {
const BranchProbabilityInfo *BPI, uint64_t MaxFreq,
std::optional<NodeIdFormatterTy> NodeIdFormatter)
: F(F), BFI(BFI), BPI(BPI), MaxFreq(MaxFreq),
NodeIdFormatter(NodeIdFormatter) {
ShowHeat = false;
EdgeWeights = !!BPI; // Print EdgeWeights when BPI is available.
RawWeights = !!BFI; // Print RawWeights when BFI is available.
Expand Down