static void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent, const SelectionDAG *G, VisitedSDNodeSet &once) { if (!once.insert(N)) // If we've been here before, return now. return; // Dump the current SDNode, but don't end the line yet. OS.indent(indent); N->printr(OS, G); // Having printed this SDNode, walk the children: for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { const SDNode *child = N->getOperand(i).getNode(); if (i) OS << ","; OS << " "; if (child->getNumOperands() == 0) { // This child has no grandchildren; print it inline right here. child->printr(OS, G); once.insert(child); } else { // Just the address. FIXME: also print the child's opcode. OS << (void*)child; if (unsigned RN = N->getOperand(i).getResNo()) OS << ":" << RN; } } OS << "\n"; // Dump children that have grandchildren on their own line(s). for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { const SDNode *child = N->getOperand(i).getNode(); DumpNodesr(OS, child, indent+2, G, once); } }
static void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent, const SelectionDAG *G, VisitedSDNodeSet &once) { if (!once.insert(N).second) // If we've been here before, return now. return; // Dump the current SDNode, but don't end the line yet. OS.indent(indent); N->printr(OS, G); // Having printed this SDNode, walk the children: for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { if (i) OS << ","; OS << " "; const SDValue Op = N->getOperand(i); bool printedInline = printOperand(OS, G, Op); if (printedInline) once.insert(Op.getNode()); } OS << "\n"; // Dump children that have grandchildren on their own line(s). for (const SDValue &Op : N->op_values()) DumpNodesr(OS, Op.getNode(), indent+2, G, once); }