From: David Greene Date: Tue, 19 Jan 2010 20:37:34 +0000 (+0000) Subject: Add some new debugging APIs to print out "raw" SelectionDAGs to make X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ce6715faa37b2e44edcf400084aa808ae30d7085;p=oota-llvm.git Add some new debugging APIs to print out "raw" SelectionDAGs to make understanding CannotYTetSelect and other errors easier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93901 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 964b4989152..6a53155f1b9 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -1285,37 +1285,55 @@ 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." + + /// printrFull - Print a SelectionDAG node and all children down to + /// the leaves. The given SelectionDAG allows target-specific nodes + /// to be printed in human-readable form. Unlike printr, this will + /// print the whole DAG, including children that appear multiple + /// times. /// - 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 printrFull(raw_ostream &O, const SelectionDAG *G = 0) const; + + /// printrWithDepth - Print a SelectionDAG node and children up to + /// depth "depth." The given SelectionDAG allows target-specific + /// nodes to be printed in human-readable form. Unlike printr, this + /// will print children that appear multiple times wherever they are + /// used. /// - void printWithFullDepth(raw_ostream &O, const SelectionDAG *G = 0, - unsigned indent = 0) const; + void printrWithDepth(raw_ostream &O, const SelectionDAG *G = 0, + unsigned depth = 100) const; + + /// dump - Dump this node, for debugging. void dump() const; + /// dumpr - Dump (recursively) this node and its use-def subgraph. void dumpr() const; + /// dump - Dump this node, for debugging. /// The given SelectionDAG allows target-specific nodes to be printed /// in human-readable form. void dump(const SelectionDAG *G) const; + /// dumpr - Dump (recursively) this node and its use-def subgraph. /// The given SelectionDAG allows target-specific nodes to be printed /// in human-readable form. void dumpr(const SelectionDAG *G) const; - /// dumpWithDepth - printWithDepth to dbgs(). + + /// dumprFull - printrFull to dbgs(). The given SelectionDAG allows + /// target-specific nodes to be printed in human-readable form. + /// Unlike dumpr, this will print the whole DAG, including children + /// that appear multiple times. /// - void dumpWithDepth(const SelectionDAG *G = 0, unsigned depth = 1, - unsigned indent = 0, bool limit = false) const; - /// dumpWithFullDepth - printWithFullDepth to dbgs(). + void dumprFull(const SelectionDAG *G = 0) const; + + /// dumprWithDepth - printrWithDepth to dbgs(). The given + /// SelectionDAG allows target-specific nodes to be printed in + /// human-readable form. Unlike dumpr, this will print children + /// that appear multiple times wherever they are used. /// - void dumpWithFullDepth(const SelectionDAG *G = 0, unsigned indent = 0) const; + void dumprWithDepth(const SelectionDAG *G = 0, unsigned depth = 100) const; + static bool classof(const SDNode *) { return true; } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index b8ac005952a..49b08bba790 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5893,47 +5893,43 @@ 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 << "*** - Cycle? ***\n"; +static void printrWithDepthHelper(raw_ostream &OS, const SDNode *N, + const SelectionDAG *G, unsigned depth, + unsigned indent) +{ + if (depth == 0) return; - } - int myindent = indent; + OS.indent(indent); - while (myindent--) { - OS << ' '; - } + N->print(OS, G); - print(OS, G); + if (depth < 1) + return; - 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); - } + for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { + OS << '\n'; + printrWithDepthHelper(OS, N->getOperand(i).getNode(), G, depth-1, indent+2); } +} + +void SDNode::printrWithDepth(raw_ostream &OS, const SelectionDAG *G, + unsigned depth) const { + printrWithDepthHelper(OS, this, G, depth, 0); } -void SDNode::printWithFullDepth(raw_ostream &OS, const SelectionDAG *G, - unsigned indent) const { +void SDNode::printrFull(raw_ostream &OS, const SelectionDAG *G) const { // Don't print impossibly deep things. - printWithDepth(OS, G, 100, indent, true); -} + printrWithDepth(OS, G, 100); +} -void SDNode::dumpWithDepth(const SelectionDAG *G, unsigned depth, - unsigned indent, bool limit) const { - printWithDepth(dbgs(), G, depth, indent, limit); +void SDNode::dumprWithDepth(const SelectionDAG *G, unsigned depth) const { + printrWithDepth(dbgs(), G, depth); } -void SDNode::dumpWithFullDepth(const SelectionDAG *G, unsigned indent) const { +void SDNode::dumprFull(const SelectionDAG *G) const { // Don't print impossibly deep things. - dumpWithDepth(G, 100, indent, true); + dumprWithDepth(G, 100); } static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index e53966426c6..d0fc02d0edd 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1426,7 +1426,7 @@ void SelectionDAGISel::CannotYetSelect(SDNode *N) { std::string msg; raw_string_ostream Msg(msg); Msg << "Cannot yet select: "; - N->printWithFullDepth(Msg, CurDAG); + N->printrFull(Msg, CurDAG); llvm_report_error(Msg.str()); }