forked from OSchip/llvm-project
[PBQP] Provide more information in the debug prints
Based on a patch by Jonas Paulsson llvm-svn: 228068
This commit is contained in:
parent
250b1b8902
commit
10797c5707
|
@ -672,69 +672,6 @@ namespace PBQP {
|
|||
Edges.clear();
|
||||
FreeEdgeIds.clear();
|
||||
}
|
||||
|
||||
/// @brief Dump a graph to an output stream.
|
||||
template <typename OStream>
|
||||
void dumpToStream(OStream &OS) {
|
||||
OS << nodeIds().size() << " " << edgeIds().size() << "\n";
|
||||
|
||||
for (auto NId : nodeIds()) {
|
||||
const Vector& V = getNodeCosts(NId);
|
||||
OS << "\n" << V.getLength() << "\n";
|
||||
assert(V.getLength() != 0 && "Empty vector in graph.");
|
||||
OS << V[0];
|
||||
for (unsigned i = 1; i < V.getLength(); ++i) {
|
||||
OS << " " << V[i];
|
||||
}
|
||||
OS << "\n";
|
||||
}
|
||||
|
||||
for (auto EId : edgeIds()) {
|
||||
NodeId N1Id = getEdgeNode1Id(EId);
|
||||
NodeId N2Id = getEdgeNode2Id(EId);
|
||||
assert(N1Id != N2Id && "PBQP graphs shound not have self-edges.");
|
||||
const Matrix& M = getEdgeCosts(EId);
|
||||
OS << "\n" << N1Id << " " << N2Id << "\n"
|
||||
<< M.getRows() << " " << M.getCols() << "\n";
|
||||
assert(M.getRows() != 0 && "No rows in matrix.");
|
||||
assert(M.getCols() != 0 && "No cols in matrix.");
|
||||
for (unsigned i = 0; i < M.getRows(); ++i) {
|
||||
OS << M[i][0];
|
||||
for (unsigned j = 1; j < M.getCols(); ++j) {
|
||||
OS << " " << M[i][j];
|
||||
}
|
||||
OS << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief Dump this graph to dbgs().
|
||||
void dump() {
|
||||
dumpToStream(dbgs());
|
||||
}
|
||||
|
||||
/// @brief Print a representation of this graph in DOT format.
|
||||
/// @param OS Output stream to print on.
|
||||
template <typename OStream>
|
||||
void printDot(OStream &OS) {
|
||||
OS << "graph {\n";
|
||||
for (auto NId : nodeIds()) {
|
||||
OS << " node" << NId << " [ label=\""
|
||||
<< NId << ": " << getNodeCosts(NId) << "\" ]\n";
|
||||
}
|
||||
OS << " edge [ len=" << nodeIds().size() << " ]\n";
|
||||
for (auto EId : edgeIds()) {
|
||||
OS << " node" << getEdgeNode1Id(EId)
|
||||
<< " -- node" << getEdgeNode2Id(EId)
|
||||
<< " [ label=\"";
|
||||
const Matrix &EdgeCosts = getEdgeCosts(EId);
|
||||
for (unsigned i = 0; i < EdgeCosts.getRows(); ++i) {
|
||||
OS << EdgeCosts.getRowAsVector(i) << "\\n";
|
||||
}
|
||||
OS << "\" ]\n";
|
||||
}
|
||||
OS << "}\n";
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace PBQP
|
||||
|
|
|
@ -23,6 +23,9 @@
|
|||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class raw_ostream;
|
||||
|
||||
namespace PBQP {
|
||||
namespace RegAlloc {
|
||||
|
||||
|
@ -501,6 +504,17 @@ private:
|
|||
typedef PBQP::Graph<RegAllocSolverImpl> BaseT;
|
||||
public:
|
||||
PBQPRAGraph(GraphMetadata Metadata) : BaseT(Metadata) {}
|
||||
|
||||
/// @brief Dump this graph to dbgs().
|
||||
void dump() const;
|
||||
|
||||
/// @brief Dump this graph to an output stream.
|
||||
/// @param OS Output stream to print on.
|
||||
void dump(raw_ostream &OS) const;
|
||||
|
||||
/// @brief Print a representation of this graph in DOT format.
|
||||
/// @param OS Output stream to print on.
|
||||
void printDot(raw_ostream &OS) const;
|
||||
};
|
||||
|
||||
inline Solution solve(PBQPRAGraph& G) {
|
||||
|
|
|
@ -727,7 +727,7 @@ bool RegAllocPBQP::runOnMachineFunction(MachineFunction &MF) {
|
|||
raw_fd_ostream OS(GraphFileName, EC, sys::fs::F_Text);
|
||||
DEBUG(dbgs() << "Dumping graph for round " << Round << " to \""
|
||||
<< GraphFileName << "\"\n");
|
||||
G.dumpToStream(OS);
|
||||
G.dump(OS);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -747,6 +747,79 @@ bool RegAllocPBQP::runOnMachineFunction(MachineFunction &MF) {
|
|||
return true;
|
||||
}
|
||||
|
||||
namespace {
|
||||
// A Helper class for print node and register info in a consistent way
|
||||
class PrintNodeInfo {
|
||||
public:
|
||||
typedef PBQP::RegAlloc::PBQPRAGraph Graph;
|
||||
typedef PBQP::RegAlloc::PBQPRAGraph::NodeId NodeId;
|
||||
|
||||
PrintNodeInfo(NodeId NId, const Graph &G) : G(G), NId(NId) {}
|
||||
|
||||
void print(raw_ostream &OS) const {
|
||||
const MachineRegisterInfo &MRI = G.getMetadata().MF.getRegInfo();
|
||||
const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();
|
||||
unsigned VReg = G.getNodeMetadata(NId).getVReg();
|
||||
const char *RegClassName = TRI->getRegClassName(MRI.getRegClass(VReg));
|
||||
OS << NId << " (" << RegClassName << ':' << PrintReg(VReg, TRI) << ')';
|
||||
}
|
||||
|
||||
private:
|
||||
const Graph &G;
|
||||
NodeId NId;
|
||||
};
|
||||
|
||||
inline raw_ostream &operator<<(raw_ostream &OS, const PrintNodeInfo &PR) {
|
||||
PR.print(OS);
|
||||
return OS;
|
||||
}
|
||||
} // anonymous namespace
|
||||
|
||||
void PBQP::RegAlloc::PBQPRAGraph::dump(raw_ostream &OS) const {
|
||||
for (auto NId : nodeIds()) {
|
||||
const Vector &Costs = getNodeCosts(NId);
|
||||
assert(Costs.getLength() != 0 && "Empty vector in graph.");
|
||||
OS << PrintNodeInfo(NId, *this) << ": " << Costs << '\n';
|
||||
}
|
||||
OS << '\n';
|
||||
|
||||
for (auto EId : edgeIds()) {
|
||||
NodeId N1Id = getEdgeNode1Id(EId);
|
||||
NodeId N2Id = getEdgeNode2Id(EId);
|
||||
assert(N1Id != N2Id && "PBQP graphs should not have self-edges.");
|
||||
const Matrix &M = getEdgeCosts(EId);
|
||||
assert(M.getRows() != 0 && "No rows in matrix.");
|
||||
assert(M.getCols() != 0 && "No cols in matrix.");
|
||||
OS << PrintNodeInfo(N1Id, *this) << ' ' << M.getRows() << " rows / ";
|
||||
OS << PrintNodeInfo(N2Id, *this) << ' ' << M.getCols() << " cols:\n";
|
||||
OS << M << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
void PBQP::RegAlloc::PBQPRAGraph::dump() const { dump(dbgs()); }
|
||||
|
||||
void PBQP::RegAlloc::PBQPRAGraph::printDot(raw_ostream &OS) const {
|
||||
OS << "graph {\n";
|
||||
for (auto NId : nodeIds()) {
|
||||
OS << " node" << NId << " [ label=\""
|
||||
<< PrintNodeInfo(NId, *this) << "\\n"
|
||||
<< getNodeCosts(NId) << "\" ]\n";
|
||||
}
|
||||
|
||||
OS << " edge [ len=" << nodeIds().size() << " ]\n";
|
||||
for (auto EId : edgeIds()) {
|
||||
OS << " node" << getEdgeNode1Id(EId)
|
||||
<< " -- node" << getEdgeNode2Id(EId)
|
||||
<< " [ label=\"";
|
||||
const Matrix &EdgeCosts = getEdgeCosts(EId);
|
||||
for (unsigned i = 0; i < EdgeCosts.getRows(); ++i) {
|
||||
OS << EdgeCosts.getRowAsVector(i) << "\\n";
|
||||
}
|
||||
OS << "\" ]\n";
|
||||
}
|
||||
OS << "}\n";
|
||||
}
|
||||
|
||||
FunctionPass *llvm::createPBQPRegisterAllocator(char *customPassID) {
|
||||
return new RegAllocPBQP(customPassID);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue