From 2e6ef0e80fd9a5489f61b01aac7f51fb269e63f1 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Fri, 25 Apr 2014 09:08:10 +0000 Subject: [LCG] During the incremental re-build of an SCC after removing an edge, remove the nodes in the SCC from the SCC map entirely prior to the DFS walk. This allows the SCC map to represent both the state of not-yet-re-added-to-an-SCC and added-back-to-this-SCC independently. The first is being missing from the SCC map, the second is mapping back to 'this'. In a subsequent commit, I'm going to use this property to simplify the new node list for this SCC. In theory, I think this also makes the contract for orphaning a node from the graph slightly less confusing. Now it is also orphaned from the SCC graph. Still, this isn't quite right either, and so I'm not adding test cases here. I'll add test cases for the behavior of orphaning nodes when the code *actually* supports it. The change here is mostly incidental, my goal is simplifying the algorithm. llvm-svn: 207213 --- llvm/lib/Analysis/LazyCallGraph.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Analysis/LazyCallGraph.cpp') diff --git a/llvm/lib/Analysis/LazyCallGraph.cpp b/llvm/lib/Analysis/LazyCallGraph.cpp index bcefd4f..6fb6270 100644 --- a/llvm/lib/Analysis/LazyCallGraph.cpp +++ b/llvm/lib/Analysis/LazyCallGraph.cpp @@ -191,9 +191,10 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, SmallVector Worklist; Worklist.swap(Nodes); for (Node *N : Worklist) { - // Clear these to 0 while we re-run Tarjan's over the SCC. + // The nodes formerly in this SCC are no longer in any SCC. N->DFSNumber = 0; N->LowLink = 0; + G.SCCMap.erase(N); } // The callee can already reach every node in this SCC (by definition). It is @@ -230,9 +231,8 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, Node &ChildN = *I; // If this child isn't currently in this SCC, no need to process it. // However, we do need to remove this SCC from its SCC's parent set. - SCC &ChildSCC = *G.SCCMap.lookup(&ChildN); - if (&ChildSCC != this) { - ChildSCC.ParentSCCs.erase(this); + if (SCC *ChildSCC = G.SCCMap.lookup(&ChildN)) { + ChildSCC->ParentSCCs.erase(this); continue; } @@ -298,6 +298,7 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, N->DFSNumber = -1; N->LowLink = -1; Nodes.push_back(N); + G.SCCMap.insert(std::make_pair(N, this)); for (Node &ChildN : *N) { if (NewNodes.count(&ChildN)) continue; -- cgit v1.1