[LCG] Implement Tarjan's algorithm correctly this time. We have to walk

up the stack finishing the exploration of each entries children before
we're finished in addition to accounting for their low-links. Added
a unittest that really hammers home the need for this with interlocking
cycles that would each appear distinct otherwise and crash or compute
the wrong result. As part of this, nuke a stale fixme and bring the rest
of the implementation still more closely in line with the original
algorithm.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206966 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth
2014-04-23 10:31:17 +00:00
parent 57683b8aba
commit b9619110af
3 changed files with 100 additions and 34 deletions

View File

@@ -381,7 +381,8 @@ private:
/// \brief Helper to form a new SCC out of the top of a DFSStack-like
/// structure.
SCC *formSCCFromDFSStack(
SmallVectorImpl<std::pair<Node *, Node::iterator>> &DFSStack);
SmallVectorImpl<std::pair<Node *, Node::iterator>> &DFSStack,
SmallVectorImpl<std::pair<Node *, Node::iterator>>::iterator SCCBegin);
/// \brief Retrieve the next node in the post-order SCC walk of the call graph.
SCC *getNextSCCInPostOrder();