diff options
author | David Greene <greened@obbligato.org> | 2010-01-20 00:59:23 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2010-01-20 00:59:23 +0000 |
commit | 3b2a68ceb8b83c5bd5dd07723a1fef9cac3f027b (patch) | |
tree | 9e56fb3778023cc7ad82085020bae91bdfd51a91 /llvm/lib | |
parent | ad371258aaafe17b1d1459458cb70cd1332cd064 (diff) | |
download | bcm5719-llvm-3b2a68ceb8b83c5bd5dd07723a1fef9cac3f027b.tar.gz bcm5719-llvm-3b2a68ceb8b83c5bd5dd07723a1fef9cac3f027b.zip |
Add some asserts to check SelectionDAG problems earlier.
llvm-svn: 93960
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 49b08bba790..ad0e862c6b9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5179,6 +5179,7 @@ unsigned SelectionDAG::AssignTopologicalOrder() { allnodes_iterator Q = N; if (Q != SortedPos) SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q)); + assert(SortedPos != AllNodes.end() && "Overran node list"); ++SortedPos; } else { // Temporarily use the Node Id as scratch space for the degree count. @@ -5190,22 +5191,33 @@ unsigned SelectionDAG::AssignTopologicalOrder() { // such that by the time the end is reached all nodes will be sorted. for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I) { SDNode *N = I; + // N is in sorted position, so all its uses have one less operand + // that needs to be sorted. for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end(); UI != UE; ++UI) { SDNode *P = *UI; unsigned Degree = P->getNodeId(); + assert(Degree != 0 && "Invalid node degree"); --Degree; if (Degree == 0) { // All of P's operands are sorted, so P may sorted now. P->setNodeId(DAGSize++); if (P != SortedPos) SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P)); + assert(SortedPos != AllNodes.end() && "Overran node list"); ++SortedPos; } else { // Update P's outstanding operand count. P->setNodeId(Degree); } } + if (I == SortedPos) { + allnodes_iterator J = I; + SDNode *S = ++J; + dbgs() << "Offending node:\n"; + S->dumprFull(); + assert(I != SortedPos && "Overran sorted position"); + } } assert(SortedPos == AllNodes.end() && |