Skip to content

Commit

Permalink
SelectionDAG: Introduce PersistentID to SDNode for assert builds.
Browse files Browse the repository at this point in the history
This gives us more human readable numbers to identify nodes in debug
dumps.

Before:
  0x7fcbd9700160: ch = EntryToken

  0x7fcbd985c7c8: i64 = Register %RAX

   ...

      0x7fcbd9700160: <multiple use>
    0x7fcbd985c578: i64,ch = MOV64rm 0x7fcbd985c6a0, 0x7fcbd985cc68, 0x7fcbd985c200, 0x7fcbd985cd90, 0x7fcbd985ceb8, 0x7fcbd9700160<Mem:LD8[@foo]> [ORD=2]

  0x7fcbd985c8f0: ch,glue = CopyToReg 0x7fcbd9700160, 0x7fcbd985c7c8, 0x7fcbd985c578 [ORD=3]

    0x7fcbd985c7c8: <multiple use>
    0x7fcbd985c8f0: <multiple use>
    0x7fcbd985c8f0: <multiple use>
  0x7fcbd985ca18: ch = RETQ 0x7fcbd985c7c8, 0x7fcbd985c8f0, 0x7fcbd985c8f0:1 [ORD=3]

Now:
  t0: ch = EntryToken

  t5: i64 = Register %RAX

    ...

      t0: <multiple use>
    t3: i64,ch = MOV64rm t10, t12, t11, t13, t14, t0<Mem:LD8[@foo]> [ORD=2]

  t6: ch,glue = CopyToReg t0, t5, t3 [ORD=3]

    t5: <multiple use>
    t6: <multiple use>
    t6: <multiple use>
  t7: ch = RETQ t5, t6, t6:1 [ORD=3]

Differential Revision: http://reviews.llvm.org/D12564

llvm-svn: 248010
  • Loading branch information
MatzeB committed Sep 18, 2015
1 parent 0824970 commit 0b7d6c1
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 10 deletions.
4 changes: 4 additions & 0 deletions llvm/include/llvm/CodeGen/SelectionDAG.h
Expand Up @@ -215,6 +215,10 @@ class SelectionDAG {
/// Tracks dbg_value information through SDISel.
SDDbgInfo *DbgInfo;

#ifndef NDEBUG
uint16_t NextPersistentId;
#endif

public:
/// Clients of various APIs that cause global effects on
/// the DAG can optionally implement this interface. This allows the clients
Expand Down
6 changes: 6 additions & 0 deletions llvm/include/llvm/CodeGen/SelectionDAGNodes.h
Expand Up @@ -431,6 +431,12 @@ class SDNode : public FoldingSetNode, public ilist_node<SDNode> {
friend struct ilist_traits<SDNode>;

public:
#ifndef NDEBUG
/// Unique and persistent id per SDNode in the DAG.
/// Used for debug printing.
uint16_t PersistentId;
#endif

//===--------------------------------------------------------------------===//
// Accessors
//
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Expand Up @@ -763,6 +763,7 @@ static void VerifySDNode(SDNode *N) {
void SelectionDAG::InsertNode(SDNode *N) {
AllNodes.push_back(N);
#ifndef NDEBUG
N->PersistentId = NextPersistentId++;
VerifySDNode(N);
#endif
}
Expand Down Expand Up @@ -948,6 +949,9 @@ void SelectionDAG::allnodes_clear() {
AllNodes.remove(AllNodes.begin());
while (!AllNodes.empty())
DeallocateNode(AllNodes.begin());
#ifndef NDEBUG
NextPersistentId = 0;
#endif
}

BinarySDNode *SelectionDAG::GetBinarySDNode(unsigned Opcode, SDLoc DL,
Expand Down
30 changes: 26 additions & 4 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
Expand Up @@ -361,14 +361,35 @@ const char *SDNode::getIndexedModeName(ISD::MemIndexedMode AM) {
}
}

namespace {
class PrintNodeId {
const SDNode &Node;
public:
explicit PrintNodeId(const SDNode &Node)
: Node(Node) {}
void print(raw_ostream &OS) const {
#ifndef NDEBUG
OS << 't' << Node.PersistentId;
#else
OS << (const void*)&Node;
#endif
}
};

static inline raw_ostream &operator<<(raw_ostream &OS, const PrintNodeId &P) {
P.print(OS);
return OS;
}
}

void SDNode::dump() const { dump(nullptr); }
void SDNode::dump(const SelectionDAG *G) const {
print(dbgs(), G);
dbgs() << '\n';
}

void SDNode::print_types(raw_ostream &OS, const SelectionDAG *G) const {
OS << (const void*)this << ": ";
OS << PrintNodeId(*this) << ": ";

for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
if (i) OS << ",";
Expand Down Expand Up @@ -560,7 +581,7 @@ static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) {
DumpNodes(Op.getNode(), indent+2, G);
else
dbgs() << "\n" << std::string(indent+2, ' ')
<< (void*)Op.getNode() << ": <multiple use>";
<< PrintNodeId(*Op.getNode()) << ": <multiple use>";

dbgs() << '\n';
dbgs().indent(indent);
Expand Down Expand Up @@ -676,8 +697,9 @@ void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const {
print_types(OS, G);
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
if (i) OS << ", "; else OS << " ";
OS << (void*)getOperand(i).getNode();
if (unsigned RN = getOperand(i).getResNo())
const SDValue Operand = getOperand(i);
OS << PrintNodeId(*Operand.getNode());
if (unsigned RN = Operand.getResNo())
OS << ":" << RN;
}
print_details(OS, G);
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/CodeGen/PowerPC/ppc64-icbt-pwr7.ll
Expand Up @@ -10,10 +10,10 @@ entry:
ret void

; FIXME: Crashing is not really the correct behavior here, we really should just emit nothing
; CHECK: Cannot select: 0x{{[0-9,a-f]+}}: ch = Prefetch
; CHECK: 0x{{[0-9,a-f]+}}: i32 = Constant<0>
; CHECK-NEXT: 0x{{[0-9,a-f]+}}: i32 = Constant<3>
; CHECK-NEXT: 0x{{[0-9,a-f]+}}: i32 = Constant<0>
; CHECK: Cannot select: {{0x[0-9,a-f]+|t[0-9]+}}: ch = Prefetch
; CHECK: {{0x[0-9,a-f]+|t[0-9]+}}: i32 = Constant<0>
; CHECK-NEXT: {{0x[0-9,a-f]+|t[0-9]+}}: i32 = Constant<3>
; CHECK-NEXT: {{0x[0-9,a-f]+|t[0-9]+}}: i32 = Constant<0>

}

@@ -1,7 +1,7 @@
; RUN: llc -debug < %s 2>&1 | FileCheck %s
; REQUIRES: asserts

; CHECK: 0x{{[0-9,a-f]+}}: i32 = Constant<-1>test.c:4:5
; CHECK: t{{[0-9]+}}: i32 = Constant<-1>test.c:4:5

define i32 @main() {
entry:
Expand Down
@@ -1,7 +1,7 @@
; RUN: llc -debug < %s 2>&1 | FileCheck %s
; REQUIRES: asserts

; CHECK: 0x{{[0-9,a-f]+}}: f64 = ConstantFP<1.500000e+00>test.c:3:5
; CHECK: t{{[0-9]+}}: f64 = ConstantFP<1.500000e+00>test.c:3:5

define double @f() {
entry:
Expand Down

0 comments on commit 0b7d6c1

Please sign in to comment.