@@ -3027,4 +3027,58 @@ TEST(LazyCallGraphTest, AddSplitFunctions5) {
3027
3027
EXPECT_EQ (RC, CG.lookupRefSCC (F2N));
3028
3028
EXPECT_EQ (CG.postorder_ref_scc_end (), I);
3029
3029
}
3030
+
3031
+ TEST (LazyCallGraphTest, AddSplitFunctions6) {
3032
+ LLVMContext Context;
3033
+ std::unique_ptr<Module> M = parseAssembly (Context, " define void @f() {\n "
3034
+ " ret void\n "
3035
+ " }\n " );
3036
+ LazyCallGraph CG = buildCG (*M);
3037
+
3038
+ Function &F = lookupFunction (*M, " f" );
3039
+ LazyCallGraph::Node &FN = CG.get (F);
3040
+
3041
+ // Force the graph to be fully expanded.
3042
+ CG.buildRefSCCs ();
3043
+ auto I = CG.postorder_ref_scc_begin ();
3044
+ LazyCallGraph::RefSCC *ORC = &*I++;
3045
+ EXPECT_EQ (CG.postorder_ref_scc_end (), I);
3046
+
3047
+ auto *G1 = Function::Create (F.getFunctionType (), F.getLinkage (),
3048
+ F.getAddressSpace (), " g1" , F.getParent ());
3049
+ auto *G2 = Function::Create (F.getFunctionType (), F.getLinkage (),
3050
+ F.getAddressSpace (), " g2" , F.getParent ());
3051
+ BasicBlock *G1BB = BasicBlock::Create (Context, " " , G1);
3052
+ BasicBlock *G2BB = BasicBlock::Create (Context, " " , G2);
3053
+ // Create g1 -ref-> g2 and g2 has no references.
3054
+ (void )CastInst::CreatePointerCast (G2, PointerType::getUnqual (Context), " " ,
3055
+ G1BB);
3056
+ (void )ReturnInst::Create (Context, G1BB);
3057
+ (void )ReturnInst::Create (Context, G2BB);
3058
+
3059
+ // Create f -ref-> g1 and f -ref-> g2.
3060
+ (void )CastInst::CreatePointerCast (G1, PointerType::getUnqual (Context), " " ,
3061
+ F.getEntryBlock ().begin ());
3062
+ (void )CastInst::CreatePointerCast (G2, PointerType::getUnqual (Context), " " ,
3063
+ F.getEntryBlock ().begin ());
3064
+
3065
+ EXPECT_FALSE (verifyModule (*M, &errs ()));
3066
+
3067
+ CG.addSplitRefRecursiveFunctions (F, SmallVector<Function *, 1 >({G1, G2}));
3068
+
3069
+ LazyCallGraph::Node *G1N = CG.lookup (*G1);
3070
+ EXPECT_TRUE (G1N);
3071
+ LazyCallGraph::Node *G2N = CG.lookup (*G2);
3072
+ EXPECT_TRUE (G2N);
3073
+
3074
+ I = CG.postorder_ref_scc_begin ();
3075
+ LazyCallGraph::RefSCC *RC1 = &*I++;
3076
+ EXPECT_EQ (2 , RC1->size ());
3077
+ EXPECT_EQ (RC1, CG.lookupRefSCC (*G1N));
3078
+ EXPECT_EQ (RC1, CG.lookupRefSCC (*G2N));
3079
+ LazyCallGraph::RefSCC *RC2 = &*I++;
3080
+ EXPECT_EQ (RC2, ORC);
3081
+ EXPECT_EQ (RC2, CG.lookupRefSCC (FN));
3082
+ EXPECT_EQ (CG.postorder_ref_scc_end (), I);
3083
+ }
3030
3084
}
0 commit comments