Add some debug routines to SelectionDAG to dump full DAGs.

print/dumpWithDepth allows one to dump a DAG up to N levels deep.
dump/printWithFullDepth prints the whole DAG, subject to a depth limit
on 100 in the default case (to prevent infinite recursion).

Have CannotYetSelect to a dumpWithFullDepth so it is clearer exactly
what the non-matching DAG looks like.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93538 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2010-01-15 19:43:23 +00:00
parent 54482b472a
commit ac931c011f
3 changed files with 63 additions and 1 deletions

View File

@ -1285,10 +1285,29 @@ public:
void print_details(raw_ostream &OS, const SelectionDAG *G) const;
void print(raw_ostream &OS, const SelectionDAG *G = 0) const;
void printr(raw_ostream &OS, const SelectionDAG *G = 0) const;
/// printWithDepth - Print a SelectionDAG node and children up to
/// depth "depth." "limit" controls whether a message should be
/// printed if we hit depth "depth."
///
void printWithDepth(raw_ostream &O, const SelectionDAG *G = 0,
unsigned depth = -1, unsigned indent = 0,
bool limit = false) const;
/// printWithFullDepth - Print a SelectionDAG node and all children
/// down to the leaves.
///
void printWithFullDepth(raw_ostream &O, const SelectionDAG *G = 0,
unsigned indent = 0) const;
void dump() const;
void dumpr() const;
void dump(const SelectionDAG *G) const;
void dumpr(const SelectionDAG *G) const;
/// dumpWithDepth - printWithDepth to dbgs().
///
void dumpWithDepth(const SelectionDAG *G = 0, unsigned depth = 1,
unsigned indent = 0, bool limit = false) const;
/// dumpWithFullDepth - printWithFullDepth to dbgs().
///
void dumpWithFullDepth(const SelectionDAG *G = 0, unsigned indent = 0) const;
static bool classof(const SDNode *) { return true; }

View File

@ -5893,6 +5893,49 @@ void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const {
print_details(OS, G);
}
void SDNode::printWithDepth(raw_ostream &OS, const SelectionDAG *G,
unsigned depth, unsigned indent,
bool limit) const {
if (depth == 0) {
if (limit)
OS << "*** <max depth> - Cycle? ***\n";
return;
}
int myindent = indent;
while (myindent--) {
OS << ' ';
}
print(OS, G);
if (depth > 1) {
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
OS << '\n';
getOperand(i).getNode()->printWithDepth(OS, G,
depth > 0 ? depth-1 : depth,
indent+2);
}
}
}
void SDNode::printWithFullDepth(raw_ostream &OS, const SelectionDAG *G,
unsigned indent) const {
// Don't print impossibly deep things.
printWithDepth(OS, G, 100, indent, true);
}
void SDNode::dumpWithDepth(const SelectionDAG *G, unsigned depth,
unsigned indent, bool limit) const {
printWithDepth(dbgs(), G, depth, indent, limit);
}
void SDNode::dumpWithFullDepth(const SelectionDAG *G, unsigned indent) const {
// Don't print impossibly deep things.
dumpWithDepth(G, 100, indent, true);
}
static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
if (N->getOperand(i).getNode()->hasOneUse())

View File

@ -1426,7 +1426,7 @@ void SelectionDAGISel::CannotYetSelect(SDNode *N) {
std::string msg;
raw_string_ostream Msg(msg);
Msg << "Cannot yet select: ";
N->print(Msg, CurDAG);
N->printWithFullDepth(Msg, CurDAG);
llvm_report_error(Msg.str());
}