aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-04-17 07:17:19 +0000
committerChris Lattner <sabre@nondot.org>2010-04-17 07:17:19 +0000
commitca5e4f8e19f32c9ee6e93bc05c37095fb4cedb26 (patch)
tree39993d69eabd5ac7d467ddb40dc623a245cb9b0a
parent94d1d9c2190b93feeb01934dbf1f2b828ceb82dc (diff)
reenable r101565, removing a problematic assertion.
CGSCC can delete nodes in regions of the callgraph that have already been visited. If new CG nodes are allocated to the same pointer, we shouldn't abort, just handle it correctly by assigning a new number. This should restore stability by removing invalidated pointers that *will* be reused from the densemap in the iterator. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101628 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/SCCIterator.h5
-rw-r--r--lib/Analysis/IPA/CallGraphSCCPass.cpp2
2 files changed, 2 insertions, 5 deletions
diff --git a/include/llvm/ADT/SCCIterator.h b/include/llvm/ADT/SCCIterator.h
index 80eb8c55b2..c49d599cf3 100644
--- a/include/llvm/ADT/SCCIterator.h
+++ b/include/llvm/ADT/SCCIterator.h
@@ -66,7 +66,7 @@ class scc_iterator
std::vector<unsigned> MinVisitNumStack;
// A single "visit" within the non-recursive DFS traversal.
- void DFSVisitOne(NodeType* N) {
+ void DFSVisitOne(NodeType *N) {
++visitNum; // Global counter for the visit order
nodeVisitNumbers[N] = visitNum;
SCCNodeStack.push_back(N);
@@ -83,7 +83,7 @@ class scc_iterator
// TOS has at least one more child so continue DFS
NodeType *childN = *VisitStack.back().second++;
if (!nodeVisitNumbers.count(childN)) {
- // this node has never been seen
+ // this node has never been seen.
DFSVisitOne(childN);
continue;
}
@@ -187,7 +187,6 @@ public:
/// ReplaceNode - This informs the scc_iterator that the specified Old node
/// has been deleted, and New is to be used in its place.
void ReplaceNode(NodeType *Old, NodeType *New) {
- assert(!nodeVisitNumbers.count(New) && "New already in scc_iterator?");
assert(nodeVisitNumbers.count(Old) && "Old not in scc_iterator?");
nodeVisitNumbers[New] = nodeVisitNumbers[Old];
nodeVisitNumbers.erase(Old);
diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp
index cf4c0d2549..7b73c5dffc 100644
--- a/lib/Analysis/IPA/CallGraphSCCPass.cpp
+++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp
@@ -420,10 +420,8 @@ void CallGraphSCC::ReplaceNode(CallGraphNode *Old, CallGraphNode *New) {
// Update the active scc_iterator so that it doesn't contain dangling
// pointers to the old CallGraphNode.
-#if 0
scc_iterator<CallGraph*> *CGI = (scc_iterator<CallGraph*>*)Context;
CGI->ReplaceNode(Old, New);
-#endif
}