mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 06:29:05 +00:00
[LCG] Reorder the tests to be a bit more logical: inter-SCC mutation
before intra-SCC mutation, insertion before removal. No functionality changed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207934 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -373,6 +373,59 @@ TEST(LazyCallGraphTest, MultiArmSCC) {
|
|||||||
EXPECT_EQ(&SCC, CG.lookupSCC(E));
|
EXPECT_EQ(&SCC, CG.lookupSCC(E));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(LazyCallGraphTest, OutgoingSCCEdgeInsertion) {
|
||||||
|
std::unique_ptr<Module> M = parseAssembly(
|
||||||
|
"define void @a() {\n"
|
||||||
|
"entry:\n"
|
||||||
|
" call void @b()\n"
|
||||||
|
" call void @c()\n"
|
||||||
|
" ret void\n"
|
||||||
|
"}\n"
|
||||||
|
"define void @b() {\n"
|
||||||
|
"entry:\n"
|
||||||
|
" call void @d()\n"
|
||||||
|
" ret void\n"
|
||||||
|
"}\n"
|
||||||
|
"define void @c() {\n"
|
||||||
|
"entry:\n"
|
||||||
|
" call void @d()\n"
|
||||||
|
" ret void\n"
|
||||||
|
"}\n"
|
||||||
|
"define void @d() {\n"
|
||||||
|
"entry:\n"
|
||||||
|
" ret void\n"
|
||||||
|
"}\n");
|
||||||
|
LazyCallGraph CG(*M);
|
||||||
|
|
||||||
|
// Force the graph to be fully expanded.
|
||||||
|
for (LazyCallGraph::SCC &C : CG.postorder_sccs())
|
||||||
|
(void)C;
|
||||||
|
|
||||||
|
LazyCallGraph::Node &A = *CG.lookup(lookupFunction(*M, "a"));
|
||||||
|
LazyCallGraph::Node &B = *CG.lookup(lookupFunction(*M, "b"));
|
||||||
|
LazyCallGraph::Node &C = *CG.lookup(lookupFunction(*M, "c"));
|
||||||
|
LazyCallGraph::Node &D = *CG.lookup(lookupFunction(*M, "d"));
|
||||||
|
LazyCallGraph::SCC &AC = *CG.lookupSCC(A);
|
||||||
|
LazyCallGraph::SCC &BC = *CG.lookupSCC(B);
|
||||||
|
LazyCallGraph::SCC &CC = *CG.lookupSCC(C);
|
||||||
|
LazyCallGraph::SCC &DC = *CG.lookupSCC(D);
|
||||||
|
EXPECT_TRUE(AC.isAncestorOf(BC));
|
||||||
|
EXPECT_TRUE(AC.isAncestorOf(CC));
|
||||||
|
EXPECT_TRUE(AC.isAncestorOf(DC));
|
||||||
|
EXPECT_TRUE(DC.isDescendantOf(AC));
|
||||||
|
EXPECT_TRUE(DC.isDescendantOf(BC));
|
||||||
|
EXPECT_TRUE(DC.isDescendantOf(CC));
|
||||||
|
|
||||||
|
EXPECT_EQ(2, std::distance(A.begin(), A.end()));
|
||||||
|
AC.insertOutgoingEdge(A, D);
|
||||||
|
EXPECT_EQ(3, std::distance(A.begin(), A.end()));
|
||||||
|
EXPECT_TRUE(AC.isParentOf(DC));
|
||||||
|
EXPECT_EQ(&AC, CG.lookupSCC(A));
|
||||||
|
EXPECT_EQ(&BC, CG.lookupSCC(B));
|
||||||
|
EXPECT_EQ(&CC, CG.lookupSCC(C));
|
||||||
|
EXPECT_EQ(&DC, CG.lookupSCC(D));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(LazyCallGraphTest, InterSCCEdgeRemoval) {
|
TEST(LazyCallGraphTest, InterSCCEdgeRemoval) {
|
||||||
std::unique_ptr<Module> M = parseAssembly(
|
std::unique_ptr<Module> M = parseAssembly(
|
||||||
"define void @a() {\n"
|
"define void @a() {\n"
|
||||||
@@ -452,59 +505,6 @@ TEST(LazyCallGraphTest, IntraSCCEdgeInsertion) {
|
|||||||
EXPECT_EQ(&SCC, CG1.lookupSCC(C));
|
EXPECT_EQ(&SCC, CG1.lookupSCC(C));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(LazyCallGraphTest, OutgoingSCCEdgeInsertion) {
|
|
||||||
std::unique_ptr<Module> M = parseAssembly(
|
|
||||||
"define void @a() {\n"
|
|
||||||
"entry:\n"
|
|
||||||
" call void @b()\n"
|
|
||||||
" call void @c()\n"
|
|
||||||
" ret void\n"
|
|
||||||
"}\n"
|
|
||||||
"define void @b() {\n"
|
|
||||||
"entry:\n"
|
|
||||||
" call void @d()\n"
|
|
||||||
" ret void\n"
|
|
||||||
"}\n"
|
|
||||||
"define void @c() {\n"
|
|
||||||
"entry:\n"
|
|
||||||
" call void @d()\n"
|
|
||||||
" ret void\n"
|
|
||||||
"}\n"
|
|
||||||
"define void @d() {\n"
|
|
||||||
"entry:\n"
|
|
||||||
" ret void\n"
|
|
||||||
"}\n");
|
|
||||||
LazyCallGraph CG(*M);
|
|
||||||
|
|
||||||
// Force the graph to be fully expanded.
|
|
||||||
for (LazyCallGraph::SCC &C : CG.postorder_sccs())
|
|
||||||
(void)C;
|
|
||||||
|
|
||||||
LazyCallGraph::Node &A = *CG.lookup(lookupFunction(*M, "a"));
|
|
||||||
LazyCallGraph::Node &B = *CG.lookup(lookupFunction(*M, "b"));
|
|
||||||
LazyCallGraph::Node &C = *CG.lookup(lookupFunction(*M, "c"));
|
|
||||||
LazyCallGraph::Node &D = *CG.lookup(lookupFunction(*M, "d"));
|
|
||||||
LazyCallGraph::SCC &AC = *CG.lookupSCC(A);
|
|
||||||
LazyCallGraph::SCC &BC = *CG.lookupSCC(B);
|
|
||||||
LazyCallGraph::SCC &CC = *CG.lookupSCC(C);
|
|
||||||
LazyCallGraph::SCC &DC = *CG.lookupSCC(D);
|
|
||||||
EXPECT_TRUE(AC.isAncestorOf(BC));
|
|
||||||
EXPECT_TRUE(AC.isAncestorOf(CC));
|
|
||||||
EXPECT_TRUE(AC.isAncestorOf(DC));
|
|
||||||
EXPECT_TRUE(DC.isDescendantOf(AC));
|
|
||||||
EXPECT_TRUE(DC.isDescendantOf(BC));
|
|
||||||
EXPECT_TRUE(DC.isDescendantOf(CC));
|
|
||||||
|
|
||||||
EXPECT_EQ(2, std::distance(A.begin(), A.end()));
|
|
||||||
AC.insertOutgoingEdge(A, D);
|
|
||||||
EXPECT_EQ(3, std::distance(A.begin(), A.end()));
|
|
||||||
EXPECT_TRUE(AC.isParentOf(DC));
|
|
||||||
EXPECT_EQ(&AC, CG.lookupSCC(A));
|
|
||||||
EXPECT_EQ(&BC, CG.lookupSCC(B));
|
|
||||||
EXPECT_EQ(&CC, CG.lookupSCC(C));
|
|
||||||
EXPECT_EQ(&DC, CG.lookupSCC(D));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(LazyCallGraphTest, IntraSCCEdgeRemoval) {
|
TEST(LazyCallGraphTest, IntraSCCEdgeRemoval) {
|
||||||
// A nice fully connected (including self-edges) SCC.
|
// A nice fully connected (including self-edges) SCC.
|
||||||
std::unique_ptr<Module> M1 = parseAssembly(
|
std::unique_ptr<Module> M1 = parseAssembly(
|
||||||
|
Reference in New Issue
Block a user