forked from OSchip/llvm-project
SelectionDAGDumper: Print simple operands inline.
Print simple operands inline instead of their pointer/value number. Simple operands are SDNodes without predecessors like Constant(FP), Register, UNDEF. This unifies the behaviour with dumpr() which was already doing this. Previously: t0: ch = EntryToken t1: i64 = Register %vreg0 t2: i64,ch = CopyFromReg t0, t1 t3: i64 = Constant<1> t4: i64 = add t2, t3 t5: i64 = Constant<2> t6: i64 = add t2, t5 t10: i64 = undef t11: i8,ch = load t0, t2, t10<LD1[%tmp81]> t12: i8,ch = load t0, t4, t10<LD1[%tmp10]> t13: i8,ch = load t0, t6, t10<LD1[%tmp12]> Now: t0: ch = EntryToken t2: i64,ch = CopyFromReg t0, Register:i64 %vreg0 t4: i64 = add t2, Constant:i64<1> t6: i64 = add t2, Constant:i64<2> t11: i8,ch = load<LD1[%tmp81]> t0, t2, undef:i64 t12: i8,ch = load<LD1[%tmp10]> t0, t4, undef:i64 t13: i8,ch = load<LD1[%tmp12]> t0, t6, undef:i64 Differential Revision: http://reviews.llvm.org/D12567 llvm-svn: 248628
This commit is contained in:
parent
e229c0c45e
commit
a3b701f828
|
@ -394,8 +394,6 @@ void SDNode::dump(const SelectionDAG *G) const {
|
|||
}
|
||||
|
||||
void SDNode::print_types(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
OS << PrintNodeId(*this) << ": ";
|
||||
|
||||
for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
|
||||
if (i) OS << ",";
|
||||
if (getValueType(i) == MVT::Other)
|
||||
|
@ -403,7 +401,6 @@ void SDNode::print_types(raw_ostream &OS, const SelectionDAG *G) const {
|
|||
else
|
||||
OS << getValueType(i).getEVTString();
|
||||
}
|
||||
OS << " = " << getOperationName(G);
|
||||
}
|
||||
|
||||
void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
|
@ -582,10 +579,21 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const {
|
|||
}
|
||||
}
|
||||
|
||||
/// Return true if this node is so simple that we should just print it inline
|
||||
/// if it appears as an operand.
|
||||
static bool shouldPrintInline(const SDNode &Node) {
|
||||
if (Node.getOpcode() == ISD::EntryToken)
|
||||
return false;
|
||||
return Node.getNumOperands() == 0;
|
||||
}
|
||||
|
||||
static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
|
||||
for (const SDValue &Op : N->op_values())
|
||||
for (const SDValue &Op : N->op_values()) {
|
||||
if (shouldPrintInline(*Op.getNode()))
|
||||
continue;
|
||||
if (Op.getNode()->hasOneUse())
|
||||
DumpNodes(Op.getNode(), indent+2, G);
|
||||
}
|
||||
|
||||
dbgs().indent(indent);
|
||||
N->dump(G);
|
||||
|
@ -597,7 +605,8 @@ void SelectionDAG::dump() const {
|
|||
for (allnodes_const_iterator I = allnodes_begin(), E = allnodes_end();
|
||||
I != E; ++I) {
|
||||
const SDNode *N = I;
|
||||
if (!N->hasOneUse() && N != getRoot().getNode())
|
||||
if (!N->hasOneUse() && N != getRoot().getNode() &&
|
||||
(!shouldPrintInline(*N) || N->use_empty()))
|
||||
DumpNodes(N, 2, this);
|
||||
}
|
||||
|
||||
|
@ -606,10 +615,27 @@ void SelectionDAG::dump() const {
|
|||
}
|
||||
|
||||
void SDNode::printr(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
OS << PrintNodeId(*this) << ": ";
|
||||
print_types(OS, G);
|
||||
OS << " = " << getOperationName(G);
|
||||
print_details(OS, G);
|
||||
}
|
||||
|
||||
static bool printOperand(raw_ostream &OS, const SelectionDAG *G,
|
||||
const SDValue Value) {
|
||||
if (shouldPrintInline(*Value.getNode())) {
|
||||
OS << Value->getOperationName(G) << ':';
|
||||
Value->print_types(OS, G);
|
||||
Value->print_details(OS, G);
|
||||
return true;
|
||||
} else {
|
||||
OS << PrintNodeId(*Value.getNode());
|
||||
if (unsigned RN = Value.getResNo())
|
||||
OS << ':' << RN;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
typedef SmallPtrSet<const SDNode *, 128> VisitedSDNodeSet;
|
||||
static void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent,
|
||||
const SelectionDAG *G, VisitedSDNodeSet &once) {
|
||||
|
@ -622,20 +648,13 @@ static void DumpNodesr(raw_ostream &OS, const SDNode *N, unsigned indent,
|
|||
|
||||
// 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 << (const void*)child;
|
||||
if (unsigned RN = N->getOperand(i).getResNo())
|
||||
OS << ":" << RN;
|
||||
}
|
||||
const SDValue Op = N->getOperand(i);
|
||||
bool printedInline = printOperand(OS, G, Op);
|
||||
if (printedInline)
|
||||
once.insert(Op.getNode());
|
||||
}
|
||||
|
||||
OS << "\n";
|
||||
|
@ -697,13 +716,9 @@ void SDNode::dumprFull(const SelectionDAG *G) const {
|
|||
}
|
||||
|
||||
void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const {
|
||||
print_types(OS, G);
|
||||
printr(OS, G);
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||
if (i) OS << ", "; else OS << " ";
|
||||
const SDValue Operand = getOperand(i);
|
||||
OS << PrintNodeId(*Operand.getNode());
|
||||
if (unsigned RN = Operand.getResNo())
|
||||
OS << ":" << RN;
|
||||
printOperand(OS, G, getOperand(i));
|
||||
}
|
||||
print_details(OS, G);
|
||||
}
|
||||
|
|
|
@ -15,17 +15,16 @@
|
|||
|
||||
; DBGDAG-LABEL: Optimized lowered selection DAG: BB#0 'merge_store_partial_overlap_load:'
|
||||
; DBGDAG: [[ENTRYTOKEN:t[0-9]+]]: ch = EntryToken
|
||||
; DBGDAG-DAG: [[TWO:t[0-9]+]]: i64 = Constant<2>
|
||||
; DBGDAG-DAG: [[BASEPTR:t[0-9]+]]: i64,ch = CopyFromReg [[ENTRYTOKEN]],
|
||||
; DBGDAG-DAG: [[ADDPTR:t[0-9]+]]: i64 = add [[BASEPTR]], [[TWO]]
|
||||
; DBGDAG-DAG: [[ADDPTR:t[0-9]+]]: i64 = add [[BASEPTR]], Constant:i64<2>
|
||||
|
||||
; DBGDAG-DAG: [[LD2:t[0-9]+]]: i16,ch = load [[ENTRYTOKEN]], [[BASEPTR]], t{{[0-9]+}}<LD2[%tmp81](align=1)>
|
||||
; DBGDAG-DAG: [[LD1:t[0-9]+]]: i8,ch = load [[ENTRYTOKEN]], [[ADDPTR]], t{{[0-9]+}}<LD1[%tmp12]>
|
||||
; DBGDAG-DAG: [[LD2:t[0-9]+]]: i16,ch = load<LD2[%tmp81](align=1)> [[ENTRYTOKEN]], [[BASEPTR]], undef:i64
|
||||
; DBGDAG-DAG: [[LD1:t[0-9]+]]: i8,ch = load<LD1[%tmp12]> [[ENTRYTOKEN]], [[ADDPTR]], undef:i64
|
||||
|
||||
; DBGDAG: [[LOADTOKEN:t[0-9]+]]: ch = TokenFactor [[LD2]]:1, [[LD1]]:1
|
||||
|
||||
; DBGDAG-DAG: [[ST2:t[0-9]+]]: ch = store [[LOADTOKEN]], [[LD2]], t{{[0-9]+}}, t{{[0-9]+}}<ST2[%tmp10](align=1)>
|
||||
; DBGDAG-DAG: [[ST1:t[0-9]+]]: ch = store [[ST2]], [[LD1]], t{{[0-9]+}}, t{{[0-9]+}}<ST1[%tmp14]>
|
||||
; DBGDAG-DAG: [[ST2:t[0-9]+]]: ch = store<ST2[%tmp10](align=1)> [[LOADTOKEN]], [[LD2]], t{{[0-9]+}}, undef:i64
|
||||
; DBGDAG-DAG: [[ST1:t[0-9]+]]: ch = store<ST1[%tmp14]> [[ST2]], [[LD1]], t{{[0-9]+}}, undef:i64
|
||||
; DBGDAG: X86ISD::RET_FLAG [[ST1]],
|
||||
|
||||
; DBGDAG: Type-legalized selection DAG: BB#0 'merge_store_partial_overlap_load:'
|
||||
|
|
Loading…
Reference in New Issue