diff --git a/lib/Analysis/LazyCallGraph.cpp b/lib/Analysis/LazyCallGraph.cpp index 1ac30769a52..b593069e664 100644 --- a/lib/Analysis/LazyCallGraph.cpp +++ b/lib/Analysis/LazyCallGraph.cpp @@ -284,10 +284,8 @@ LazyCallGraph::SCC::removeIntraSCCEdge(Node &CallerN, // First remove it from the node. CallerN.removeEdgeInternal(CalleeN.getFunction()); - // We return a list of the resulting SCCs, where 'this' is always the first - // element. + // We return a list of the resulting *new* SCCs in postorder. SmallVector ResultSCCs; - ResultSCCs.push_back(this); // Direct recursion doesn't impact the SCC graph at all. if (&CallerN == &CalleeN) @@ -337,7 +335,7 @@ LazyCallGraph::SCC::removeIntraSCCEdge(Node &CallerN, } } #ifndef NDEBUG - if (ResultSCCs.size() > 1) + if (!ResultSCCs.empty()) assert(!IsLeafSCC && "This SCC cannot be a leaf as we have split out new " "SCCs by removing this edge."); if (!std::any_of(G->LeafSCCs.begin(), G->LeafSCCs.end(), @@ -347,7 +345,7 @@ LazyCallGraph::SCC::removeIntraSCCEdge(Node &CallerN, #endif // If this SCC stopped being a leaf through this edge removal, remove it from // the leaf SCC list. - if (!IsLeafSCC && ResultSCCs.size() > 1) + if (!IsLeafSCC && !ResultSCCs.empty()) G->LeafSCCs.erase(std::remove(G->LeafSCCs.begin(), G->LeafSCCs.end(), this), G->LeafSCCs.end()); diff --git a/unittests/Analysis/LazyCallGraphTest.cpp b/unittests/Analysis/LazyCallGraphTest.cpp index dd66c5cf3a8..3fbd3ec20f1 100644 --- a/unittests/Analysis/LazyCallGraphTest.cpp +++ b/unittests/Analysis/LazyCallGraphTest.cpp @@ -378,18 +378,21 @@ TEST(LazyCallGraphTest, IntraSCCEdgeRemoval) { // Remove the edge from b -> a, which should leave the 3 functions still in // a single connected component because of a -> b -> c -> a. - SCC.removeIntraSCCEdge(B, A); + SmallVector NewSCCs = SCC.removeIntraSCCEdge(B, A); + EXPECT_EQ(0u, NewSCCs.size()); EXPECT_EQ(&SCC, CG1.lookupSCC(A)); EXPECT_EQ(&SCC, CG1.lookupSCC(B)); EXPECT_EQ(&SCC, CG1.lookupSCC(C)); // Remove the edge from c -> a, which should leave 'a' in the original SCC // and form a new SCC for 'b' and 'c'. - SCC.removeIntraSCCEdge(C, A); + NewSCCs = SCC.removeIntraSCCEdge(C, A); + EXPECT_EQ(1u, NewSCCs.size()); EXPECT_EQ(&SCC, CG1.lookupSCC(A)); EXPECT_EQ(1, std::distance(SCC.begin(), SCC.end())); LazyCallGraph::SCC *SCC2 = CG1.lookupSCC(B); EXPECT_EQ(SCC2, CG1.lookupSCC(C)); + EXPECT_EQ(SCC2, NewSCCs[0]); } }