diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-24 21:34:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-24 21:34:04 +0000 |
commit | 46ca5efdd5b748ba8aa62168f7753cb46b683bc5 (patch) | |
tree | f2c5d3a7c5079f02cff3dba5e3678ac5b056d7ed /lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | a1461ccfa0f19b2a81afb401c1d772f751edf7ae (diff) |
convert cycle checker to smallptrset, add comments and make it
more elegant.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97059 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 41050211b2..9d36ecec87 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -6343,36 +6343,36 @@ bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) { return true; } +#ifdef XDEBUG static void checkForCyclesHelper(const SDNode *N, - std::set<const SDNode *> &visited, - std::set<const SDNode *> &checked) { - if (checked.find(N) != checked.end()) + SmallPtrSet<const SDNode*, 32> &Visited, + SmallPtrSet<const SDNode*, 32> &Checked) { + // If this node has already been checked, don't check it again. + if (Checked.count(N)) return; - - if (visited.find(N) != visited.end()) { + + // If a node has already been visited on this depth-first walk, reject it as + // a cycle. + if (!Visited.insert(N)) { dbgs() << "Offending node:\n"; N->dumprFull(); - assert(0 && "Detected cycle in SelectionDAG"); - } - - std::set<const SDNode*>::iterator i; - bool inserted; - - tie(i, inserted) = visited.insert(N); - assert(inserted && "Missed cycle"); - - for(unsigned i = 0; i < N->getNumOperands(); ++i) { - checkForCyclesHelper(N->getOperand(i).getNode(), visited, checked); + errs() << "Detected cycle in SelectionDAG\n"; + abort(); } - visited.erase(i); - checked.insert(N); + + for(unsigned i = 0, e = N->getNumOperands(); i != e; ++i) + checkForCyclesHelper(N->getOperand(i).getNode(), Visited, Checked); + + Checked.insert(N); + Visited.erase(N); } +#endif void llvm::checkForCycles(const llvm::SDNode *N) { #ifdef XDEBUG assert(N && "Checking nonexistant SDNode"); - std::set<const SDNode *> visited; - std::set<const SDNode *> checked; + SmallPtrSet<const SDNode*, 32> visited; + SmallPtrSet<const SDNode*, 32> checked; checkForCyclesHelper(N, visited, checked); #endif } |