[llvm] r207410 - [LCG] Make the return of the IntraSCC removal method actually match its

Chandler Carruth chandlerc at gmail.com
Mon Apr 28 03:49:06 PDT 2014


Author: chandlerc
Date: Mon Apr 28 05:49:06 2014
New Revision: 207410

URL: http://llvm.org/viewvc/llvm-project?rev=207410&view=rev
Log:
[LCG] Make the return of the IntraSCC removal method actually match its
contract (and be much more useful). It now provides exactly the
post-order traversal a caller might need to perform on newly formed
SCCs.

Modified:
    llvm/trunk/lib/Analysis/LazyCallGraph.cpp
    llvm/trunk/unittests/Analysis/LazyCallGraphTest.cpp

Modified: llvm/trunk/lib/Analysis/LazyCallGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyCallGraph.cpp?rev=207410&r1=207409&r2=207410&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LazyCallGraph.cpp (original)
+++ llvm/trunk/lib/Analysis/LazyCallGraph.cpp Mon Apr 28 05:49:06 2014
@@ -284,10 +284,8 @@ LazyCallGraph::SCC::removeIntraSCCEdge(N
   // 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(N
     }
   }
 #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(N
 #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());
 

Modified: llvm/trunk/unittests/Analysis/LazyCallGraphTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/LazyCallGraphTest.cpp?rev=207410&r1=207409&r2=207410&view=diff
==============================================================================
--- llvm/trunk/unittests/Analysis/LazyCallGraphTest.cpp (original)
+++ llvm/trunk/unittests/Analysis/LazyCallGraphTest.cpp Mon Apr 28 05:49:06 2014
@@ -378,18 +378,21 @@ TEST(LazyCallGraphTest, IntraSCCEdgeRemo
 
   // 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]);
 }
 
 }





More information about the llvm-commits mailing list