summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Analysis/LazyCallGraph.cpp8
-rw-r--r--unittests/Analysis/LazyCallGraphTest.cpp7
2 files changed, 8 insertions, 7 deletions
diff --git a/lib/Analysis/LazyCallGraph.cpp b/lib/Analysis/LazyCallGraph.cpp
index 1ac30769a5..b593069e66 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<SCC *, 1> 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 dd66c5cf3a..3fbd3ec20f 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<LazyCallGraph::SCC *, 1> 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]);
}
}