diff options
author | David Greene <greened@obbligato.org> | 2010-02-23 17:37:50 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2010-02-23 17:37:50 +0000 |
commit | d8ecd5e902d17f27edf9d22f7d24105b6f04891d (patch) | |
tree | f5daa3adf370c1314a7fa34d8636217527938b8a /llvm/lib | |
parent | cd4c03e886755031ea06195d0878b9e81ec74f36 (diff) | |
download | bcm5719-llvm-d8ecd5e902d17f27edf9d22f7d24105b6f04891d.tar.gz bcm5719-llvm-d8ecd5e902d17f27edf9d22f7d24105b6f04891d.zip |
Speed up cycle checking significantly by caching results.
llvm-svn: 96956
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 33899a411be..ef21a1592bb 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -6315,7 +6315,11 @@ bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) { } static void checkForCyclesHelper(const SDNode *N, - std::set<const SDNode *> &visited) { + std::set<const SDNode *> &visited, + std::set<const SDNode *> &checked) { + if (checked.find(N) != checked.end()) + return; + if (visited.find(N) != visited.end()) { dbgs() << "Offending node:\n"; N->dumprFull(); @@ -6329,16 +6333,18 @@ static void checkForCyclesHelper(const SDNode *N, assert(inserted && "Missed cycle"); for(unsigned i = 0; i < N->getNumOperands(); ++i) { - checkForCyclesHelper(N->getOperand(i).getNode(), visited); + checkForCyclesHelper(N->getOperand(i).getNode(), visited, checked); } visited.erase(i); + checked.insert(N); } void llvm::checkForCycles(const llvm::SDNode *N) { #ifdef XDEBUG assert(N && "Checking nonexistant SDNode"); std::set<const SDNode *> visited; - checkForCyclesHelper(N, visited); + std::set<const SDNode *> checked; + checkForCyclesHelper(N, visited, checked); #endif } |