mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-05 03:46:27 +00:00
SelectionDAG: Introduce PersistentID to SDNode for assert builds.
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248010 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f8d6e92d57
commit
6c76d11db8
@ -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
|
||||
|
@ -431,6 +431,12 @@ private:
|
||||
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
|
||||
//
|
||||
|
@ -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
|
||||
}
|
||||
@ -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,
|
||||
|
@ -361,6 +361,27 @@ 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);
|
||||
@ -368,7 +389,7 @@ void SDNode::dump(const SelectionDAG *G) const {
|
||||
}
|
||||
|
||||
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 << ",";
|
||||
@ -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);
|
||||
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user