Check an additional property specific to the way LLVM
authorDuncan Sands <baldrick@free.fr>
Thu, 28 Jul 2011 14:33:01 +0000 (14:33 +0000)
committerDuncan Sands <baldrick@free.fr>
Thu, 28 Jul 2011 14:33:01 +0000 (14:33 +0000)
iterates over SCC's.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136353 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/ADT/SCCIteratorTest.cpp

index 8146e28f08f6b4a250a0eea3331de558661f69ee..cf0ec014dffb5bbf845af0fb96134b9dac04149a 100644 (file)
@@ -322,6 +322,21 @@ TEST(SCCIteratorTest, AllSmallGraphs) {
       EXPECT_TRUE(NodesInSomeSCC.Meet(NodesInThisSCC).isEmpty());
 
       NodesInSomeSCC = NodesInSomeSCC.Join(NodesInThisSCC);
+
+      // Check a property that is specific to the LLVM SCC iterator and
+      // guaranteed by it: if a node in SCC S1 has an edge to a node in
+      // SCC S2, then S1 is visited *after* S2.  This means that the set
+      // of nodes reachable from this SCC must be contained either in the
+      // union of this SCC and all previously visited SCC's.
+
+      for (unsigned i = 0; i != NUM_NODES; ++i)
+        if (NodesInThisSCC.count(i)) {
+          GT::NodeSubset NodesReachableFromSCC = G.NodesReachableFrom(i);
+          EXPECT_TRUE(NodesReachableFromSCC.isSubsetOf(NodesInSomeSCC));
+          // The result must be the same for all other nodes in this SCC, so
+          // there is no point in checking them.
+          break;
+        }
     }
 
     // Finally, check that the nodes in some SCC are exactly those that are