From: Chandler Carruth Date: Sat, 26 Apr 2014 03:36:37 +0000 (+0000) Subject: [LCG] Special case the removal of self edges. These don't impact the SCC X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0c8f0bfce2edbd1f22604c5243b7ae016067a2ad;p=oota-llvm.git [LCG] Special case the removal of self edges. These don't impact the SCC graph in any way because we don't track edges in the SCC graph, just nodes. This also lets us add a nice assert about the invariant that we're working on at least a certain number of nodes within the SCC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207305 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/LazyCallGraph.cpp b/lib/Analysis/LazyCallGraph.cpp index f7f10101ad9..26212880ad3 100644 --- a/lib/Analysis/LazyCallGraph.cpp +++ b/lib/Analysis/LazyCallGraph.cpp @@ -188,6 +188,10 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, SmallVector ResultSCCs; ResultSCCs.push_back(this); + // Direct recursion doesn't impact the SCC graph at all. + if (&Caller == &Callee) + return ResultSCCs; + // We're going to do a full mini-Tarjan's walk using a local stack here. int NextDFSNumber; SmallVector, 4> DFSStack; @@ -202,6 +206,8 @@ LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, N->LowLink = 0; G.SCCMap.erase(N); } + assert(Worklist.size() > 1 && "We have to have at least two nodes to have an " + "edge between them that is within the SCC."); // The callee can already reach every node in this SCC (by definition). It is // the only node we know will stay inside this SCC. Everything which