1*9880d681SAndroid Build Coastguard Worker //===- CGSCCPassManagerTest.cpp -------------------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/CGSCCPassManager.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LazyCallGraph.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/InstIterator.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PassManager.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
19*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker namespace {
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker class TestModuleAnalysis {
26*9880d681SAndroid Build Coastguard Worker public:
27*9880d681SAndroid Build Coastguard Worker struct Result {
Result__anoneaa833cc0111::TestModuleAnalysis::Result28*9880d681SAndroid Build Coastguard Worker Result(int Count) : FunctionCount(Count) {}
29*9880d681SAndroid Build Coastguard Worker int FunctionCount;
30*9880d681SAndroid Build Coastguard Worker };
31*9880d681SAndroid Build Coastguard Worker
ID()32*9880d681SAndroid Build Coastguard Worker static void *ID() { return (void *)&PassID; }
name()33*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestModuleAnalysis"; }
34*9880d681SAndroid Build Coastguard Worker
TestModuleAnalysis(int & Runs)35*9880d681SAndroid Build Coastguard Worker TestModuleAnalysis(int &Runs) : Runs(Runs) {}
36*9880d681SAndroid Build Coastguard Worker
run(Module & M,ModuleAnalysisManager & AM)37*9880d681SAndroid Build Coastguard Worker Result run(Module &M, ModuleAnalysisManager &AM) {
38*9880d681SAndroid Build Coastguard Worker ++Runs;
39*9880d681SAndroid Build Coastguard Worker return Result(M.size());
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker private:
43*9880d681SAndroid Build Coastguard Worker static char PassID;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker int &Runs;
46*9880d681SAndroid Build Coastguard Worker };
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker char TestModuleAnalysis::PassID;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker class TestSCCAnalysis {
51*9880d681SAndroid Build Coastguard Worker public:
52*9880d681SAndroid Build Coastguard Worker struct Result {
Result__anoneaa833cc0111::TestSCCAnalysis::Result53*9880d681SAndroid Build Coastguard Worker Result(int Count) : FunctionCount(Count) {}
54*9880d681SAndroid Build Coastguard Worker int FunctionCount;
55*9880d681SAndroid Build Coastguard Worker };
56*9880d681SAndroid Build Coastguard Worker
ID()57*9880d681SAndroid Build Coastguard Worker static void *ID() { return (void *)&PassID; }
name()58*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestSCCAnalysis"; }
59*9880d681SAndroid Build Coastguard Worker
TestSCCAnalysis(int & Runs)60*9880d681SAndroid Build Coastguard Worker TestSCCAnalysis(int &Runs) : Runs(Runs) {}
61*9880d681SAndroid Build Coastguard Worker
run(LazyCallGraph::SCC & C,CGSCCAnalysisManager & AM)62*9880d681SAndroid Build Coastguard Worker Result run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM) {
63*9880d681SAndroid Build Coastguard Worker ++Runs;
64*9880d681SAndroid Build Coastguard Worker return Result(C.size());
65*9880d681SAndroid Build Coastguard Worker }
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker private:
68*9880d681SAndroid Build Coastguard Worker static char PassID;
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker int &Runs;
71*9880d681SAndroid Build Coastguard Worker };
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker char TestSCCAnalysis::PassID;
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker class TestFunctionAnalysis {
76*9880d681SAndroid Build Coastguard Worker public:
77*9880d681SAndroid Build Coastguard Worker struct Result {
Result__anoneaa833cc0111::TestFunctionAnalysis::Result78*9880d681SAndroid Build Coastguard Worker Result(int Count) : InstructionCount(Count) {}
79*9880d681SAndroid Build Coastguard Worker int InstructionCount;
80*9880d681SAndroid Build Coastguard Worker };
81*9880d681SAndroid Build Coastguard Worker
ID()82*9880d681SAndroid Build Coastguard Worker static void *ID() { return (void *)&PassID; }
name()83*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestFunctionAnalysis"; }
84*9880d681SAndroid Build Coastguard Worker
TestFunctionAnalysis(int & Runs)85*9880d681SAndroid Build Coastguard Worker TestFunctionAnalysis(int &Runs) : Runs(Runs) {}
86*9880d681SAndroid Build Coastguard Worker
run(Function & F,FunctionAnalysisManager & AM)87*9880d681SAndroid Build Coastguard Worker Result run(Function &F, FunctionAnalysisManager &AM) {
88*9880d681SAndroid Build Coastguard Worker ++Runs;
89*9880d681SAndroid Build Coastguard Worker int Count = 0;
90*9880d681SAndroid Build Coastguard Worker for (Instruction &I : instructions(F)) {
91*9880d681SAndroid Build Coastguard Worker (void)I;
92*9880d681SAndroid Build Coastguard Worker ++Count;
93*9880d681SAndroid Build Coastguard Worker }
94*9880d681SAndroid Build Coastguard Worker return Result(Count);
95*9880d681SAndroid Build Coastguard Worker }
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker private:
98*9880d681SAndroid Build Coastguard Worker static char PassID;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker int &Runs;
101*9880d681SAndroid Build Coastguard Worker };
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker char TestFunctionAnalysis::PassID;
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker class TestImmutableFunctionAnalysis {
106*9880d681SAndroid Build Coastguard Worker public:
107*9880d681SAndroid Build Coastguard Worker struct Result {
invalidate__anoneaa833cc0111::TestImmutableFunctionAnalysis::Result108*9880d681SAndroid Build Coastguard Worker bool invalidate(Function &, const PreservedAnalyses &) { return false; }
109*9880d681SAndroid Build Coastguard Worker };
110*9880d681SAndroid Build Coastguard Worker
ID()111*9880d681SAndroid Build Coastguard Worker static void *ID() { return (void *)&PassID; }
name()112*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestImmutableFunctionAnalysis"; }
113*9880d681SAndroid Build Coastguard Worker
TestImmutableFunctionAnalysis(int & Runs)114*9880d681SAndroid Build Coastguard Worker TestImmutableFunctionAnalysis(int &Runs) : Runs(Runs) {}
115*9880d681SAndroid Build Coastguard Worker
run(Function & F,FunctionAnalysisManager & AM)116*9880d681SAndroid Build Coastguard Worker Result run(Function &F, FunctionAnalysisManager &AM) {
117*9880d681SAndroid Build Coastguard Worker ++Runs;
118*9880d681SAndroid Build Coastguard Worker return Result();
119*9880d681SAndroid Build Coastguard Worker }
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker private:
122*9880d681SAndroid Build Coastguard Worker static char PassID;
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker int &Runs;
125*9880d681SAndroid Build Coastguard Worker };
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker char TestImmutableFunctionAnalysis::PassID;
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker struct TestModulePass {
TestModulePass__anoneaa833cc0111::TestModulePass130*9880d681SAndroid Build Coastguard Worker TestModulePass(int &RunCount) : RunCount(RunCount) {}
131*9880d681SAndroid Build Coastguard Worker
run__anoneaa833cc0111::TestModulePass132*9880d681SAndroid Build Coastguard Worker PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) {
133*9880d681SAndroid Build Coastguard Worker ++RunCount;
134*9880d681SAndroid Build Coastguard Worker (void)AM.getResult<TestModuleAnalysis>(M);
135*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
136*9880d681SAndroid Build Coastguard Worker }
137*9880d681SAndroid Build Coastguard Worker
name__anoneaa833cc0111::TestModulePass138*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestModulePass"; }
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker int &RunCount;
141*9880d681SAndroid Build Coastguard Worker };
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker struct TestSCCPass {
TestSCCPass__anoneaa833cc0111::TestSCCPass144*9880d681SAndroid Build Coastguard Worker TestSCCPass(int &RunCount, int &AnalyzedInstrCount,
145*9880d681SAndroid Build Coastguard Worker int &AnalyzedSCCFunctionCount, int &AnalyzedModuleFunctionCount,
146*9880d681SAndroid Build Coastguard Worker bool OnlyUseCachedResults = false)
147*9880d681SAndroid Build Coastguard Worker : RunCount(RunCount), AnalyzedInstrCount(AnalyzedInstrCount),
148*9880d681SAndroid Build Coastguard Worker AnalyzedSCCFunctionCount(AnalyzedSCCFunctionCount),
149*9880d681SAndroid Build Coastguard Worker AnalyzedModuleFunctionCount(AnalyzedModuleFunctionCount),
150*9880d681SAndroid Build Coastguard Worker OnlyUseCachedResults(OnlyUseCachedResults) {}
151*9880d681SAndroid Build Coastguard Worker
run__anoneaa833cc0111::TestSCCPass152*9880d681SAndroid Build Coastguard Worker PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM) {
153*9880d681SAndroid Build Coastguard Worker ++RunCount;
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker const ModuleAnalysisManager &MAM =
156*9880d681SAndroid Build Coastguard Worker AM.getResult<ModuleAnalysisManagerCGSCCProxy>(C).getManager();
157*9880d681SAndroid Build Coastguard Worker FunctionAnalysisManager &FAM =
158*9880d681SAndroid Build Coastguard Worker AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C).getManager();
159*9880d681SAndroid Build Coastguard Worker if (TestModuleAnalysis::Result *TMA =
160*9880d681SAndroid Build Coastguard Worker MAM.getCachedResult<TestModuleAnalysis>(
161*9880d681SAndroid Build Coastguard Worker *C.begin()->getFunction().getParent()))
162*9880d681SAndroid Build Coastguard Worker AnalyzedModuleFunctionCount += TMA->FunctionCount;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker if (OnlyUseCachedResults) {
165*9880d681SAndroid Build Coastguard Worker // Hack to force the use of the cached interface.
166*9880d681SAndroid Build Coastguard Worker if (TestSCCAnalysis::Result *AR = AM.getCachedResult<TestSCCAnalysis>(C))
167*9880d681SAndroid Build Coastguard Worker AnalyzedSCCFunctionCount += AR->FunctionCount;
168*9880d681SAndroid Build Coastguard Worker for (LazyCallGraph::Node &N : C)
169*9880d681SAndroid Build Coastguard Worker if (TestFunctionAnalysis::Result *FAR =
170*9880d681SAndroid Build Coastguard Worker FAM.getCachedResult<TestFunctionAnalysis>(N.getFunction()))
171*9880d681SAndroid Build Coastguard Worker AnalyzedInstrCount += FAR->InstructionCount;
172*9880d681SAndroid Build Coastguard Worker } else {
173*9880d681SAndroid Build Coastguard Worker // Typical path just runs the analysis as needed.
174*9880d681SAndroid Build Coastguard Worker TestSCCAnalysis::Result &AR = AM.getResult<TestSCCAnalysis>(C);
175*9880d681SAndroid Build Coastguard Worker AnalyzedSCCFunctionCount += AR.FunctionCount;
176*9880d681SAndroid Build Coastguard Worker for (LazyCallGraph::Node &N : C) {
177*9880d681SAndroid Build Coastguard Worker TestFunctionAnalysis::Result &FAR =
178*9880d681SAndroid Build Coastguard Worker FAM.getResult<TestFunctionAnalysis>(N.getFunction());
179*9880d681SAndroid Build Coastguard Worker AnalyzedInstrCount += FAR.InstructionCount;
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker // Just ensure we get the immutable results.
182*9880d681SAndroid Build Coastguard Worker (void)FAM.getResult<TestImmutableFunctionAnalysis>(N.getFunction());
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker }
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
187*9880d681SAndroid Build Coastguard Worker }
188*9880d681SAndroid Build Coastguard Worker
name__anoneaa833cc0111::TestSCCPass189*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestSCCPass"; }
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker int &RunCount;
192*9880d681SAndroid Build Coastguard Worker int &AnalyzedInstrCount;
193*9880d681SAndroid Build Coastguard Worker int &AnalyzedSCCFunctionCount;
194*9880d681SAndroid Build Coastguard Worker int &AnalyzedModuleFunctionCount;
195*9880d681SAndroid Build Coastguard Worker bool OnlyUseCachedResults;
196*9880d681SAndroid Build Coastguard Worker };
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker struct TestFunctionPass {
TestFunctionPass__anoneaa833cc0111::TestFunctionPass199*9880d681SAndroid Build Coastguard Worker TestFunctionPass(int &RunCount) : RunCount(RunCount) {}
200*9880d681SAndroid Build Coastguard Worker
run__anoneaa833cc0111::TestFunctionPass201*9880d681SAndroid Build Coastguard Worker PreservedAnalyses run(Function &F, AnalysisManager<Function> &) {
202*9880d681SAndroid Build Coastguard Worker ++RunCount;
203*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::none();
204*9880d681SAndroid Build Coastguard Worker }
205*9880d681SAndroid Build Coastguard Worker
name__anoneaa833cc0111::TestFunctionPass206*9880d681SAndroid Build Coastguard Worker static StringRef name() { return "TestFunctionPass"; }
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker int &RunCount;
209*9880d681SAndroid Build Coastguard Worker };
210*9880d681SAndroid Build Coastguard Worker
parseIR(const char * IR)211*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> parseIR(const char *IR) {
212*9880d681SAndroid Build Coastguard Worker // We just use a static context here. This is never called from multiple
213*9880d681SAndroid Build Coastguard Worker // threads so it is harmless no matter how it is implemented. We just need
214*9880d681SAndroid Build Coastguard Worker // the context to outlive the module which it does.
215*9880d681SAndroid Build Coastguard Worker static LLVMContext C;
216*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
217*9880d681SAndroid Build Coastguard Worker return parseAssemblyString(IR, Err, C);
218*9880d681SAndroid Build Coastguard Worker }
219*9880d681SAndroid Build Coastguard Worker
TEST(CGSCCPassManagerTest,Basic)220*9880d681SAndroid Build Coastguard Worker TEST(CGSCCPassManagerTest, Basic) {
221*9880d681SAndroid Build Coastguard Worker auto M = parseIR("define void @f() {\n"
222*9880d681SAndroid Build Coastguard Worker "entry:\n"
223*9880d681SAndroid Build Coastguard Worker " call void @g()\n"
224*9880d681SAndroid Build Coastguard Worker " call void @h1()\n"
225*9880d681SAndroid Build Coastguard Worker " ret void\n"
226*9880d681SAndroid Build Coastguard Worker "}\n"
227*9880d681SAndroid Build Coastguard Worker "define void @g() {\n"
228*9880d681SAndroid Build Coastguard Worker "entry:\n"
229*9880d681SAndroid Build Coastguard Worker " call void @g()\n"
230*9880d681SAndroid Build Coastguard Worker " call void @x()\n"
231*9880d681SAndroid Build Coastguard Worker " ret void\n"
232*9880d681SAndroid Build Coastguard Worker "}\n"
233*9880d681SAndroid Build Coastguard Worker "define void @h1() {\n"
234*9880d681SAndroid Build Coastguard Worker "entry:\n"
235*9880d681SAndroid Build Coastguard Worker " call void @h2()\n"
236*9880d681SAndroid Build Coastguard Worker " ret void\n"
237*9880d681SAndroid Build Coastguard Worker "}\n"
238*9880d681SAndroid Build Coastguard Worker "define void @h2() {\n"
239*9880d681SAndroid Build Coastguard Worker "entry:\n"
240*9880d681SAndroid Build Coastguard Worker " call void @h3()\n"
241*9880d681SAndroid Build Coastguard Worker " call void @x()\n"
242*9880d681SAndroid Build Coastguard Worker " ret void\n"
243*9880d681SAndroid Build Coastguard Worker "}\n"
244*9880d681SAndroid Build Coastguard Worker "define void @h3() {\n"
245*9880d681SAndroid Build Coastguard Worker "entry:\n"
246*9880d681SAndroid Build Coastguard Worker " call void @h1()\n"
247*9880d681SAndroid Build Coastguard Worker " ret void\n"
248*9880d681SAndroid Build Coastguard Worker "}\n"
249*9880d681SAndroid Build Coastguard Worker "define void @x() {\n"
250*9880d681SAndroid Build Coastguard Worker "entry:\n"
251*9880d681SAndroid Build Coastguard Worker " ret void\n"
252*9880d681SAndroid Build Coastguard Worker "}\n");
253*9880d681SAndroid Build Coastguard Worker FunctionAnalysisManager FAM(/*DebugLogging*/ true);
254*9880d681SAndroid Build Coastguard Worker int FunctionAnalysisRuns = 0;
255*9880d681SAndroid Build Coastguard Worker FAM.registerPass([&] { return TestFunctionAnalysis(FunctionAnalysisRuns); });
256*9880d681SAndroid Build Coastguard Worker int ImmutableFunctionAnalysisRuns = 0;
257*9880d681SAndroid Build Coastguard Worker FAM.registerPass([&] {
258*9880d681SAndroid Build Coastguard Worker return TestImmutableFunctionAnalysis(ImmutableFunctionAnalysisRuns);
259*9880d681SAndroid Build Coastguard Worker });
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker CGSCCAnalysisManager CGAM(/*DebugLogging*/ true);
262*9880d681SAndroid Build Coastguard Worker int SCCAnalysisRuns = 0;
263*9880d681SAndroid Build Coastguard Worker CGAM.registerPass([&] { return TestSCCAnalysis(SCCAnalysisRuns); });
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker ModuleAnalysisManager MAM(/*DebugLogging*/ true);
266*9880d681SAndroid Build Coastguard Worker int ModuleAnalysisRuns = 0;
267*9880d681SAndroid Build Coastguard Worker MAM.registerPass([&] { return LazyCallGraphAnalysis(); });
268*9880d681SAndroid Build Coastguard Worker MAM.registerPass([&] { return TestModuleAnalysis(ModuleAnalysisRuns); });
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });
271*9880d681SAndroid Build Coastguard Worker MAM.registerPass([&] { return CGSCCAnalysisManagerModuleProxy(CGAM); });
272*9880d681SAndroid Build Coastguard Worker CGAM.registerPass([&] { return FunctionAnalysisManagerCGSCCProxy(FAM); });
273*9880d681SAndroid Build Coastguard Worker CGAM.registerPass([&] { return ModuleAnalysisManagerCGSCCProxy(MAM); });
274*9880d681SAndroid Build Coastguard Worker FAM.registerPass([&] { return CGSCCAnalysisManagerFunctionProxy(CGAM); });
275*9880d681SAndroid Build Coastguard Worker FAM.registerPass([&] { return ModuleAnalysisManagerFunctionProxy(MAM); });
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker ModulePassManager MPM(/*DebugLogging*/ true);
278*9880d681SAndroid Build Coastguard Worker int ModulePassRunCount1 = 0;
279*9880d681SAndroid Build Coastguard Worker MPM.addPass(TestModulePass(ModulePassRunCount1));
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker CGSCCPassManager CGPM1(/*DebugLogging*/ true);
282*9880d681SAndroid Build Coastguard Worker int SCCPassRunCount1 = 0;
283*9880d681SAndroid Build Coastguard Worker int AnalyzedInstrCount1 = 0;
284*9880d681SAndroid Build Coastguard Worker int AnalyzedSCCFunctionCount1 = 0;
285*9880d681SAndroid Build Coastguard Worker int AnalyzedModuleFunctionCount1 = 0;
286*9880d681SAndroid Build Coastguard Worker CGPM1.addPass(TestSCCPass(SCCPassRunCount1, AnalyzedInstrCount1,
287*9880d681SAndroid Build Coastguard Worker AnalyzedSCCFunctionCount1,
288*9880d681SAndroid Build Coastguard Worker AnalyzedModuleFunctionCount1));
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker FunctionPassManager FPM1(/*DebugLogging*/ true);
291*9880d681SAndroid Build Coastguard Worker int FunctionPassRunCount1 = 0;
292*9880d681SAndroid Build Coastguard Worker FPM1.addPass(TestFunctionPass(FunctionPassRunCount1));
293*9880d681SAndroid Build Coastguard Worker CGPM1.addPass(createCGSCCToFunctionPassAdaptor(std::move(FPM1)));
294*9880d681SAndroid Build Coastguard Worker MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM1)));
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker MPM.run(*M, MAM);
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, ModulePassRunCount1);
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, ModuleAnalysisRuns);
301*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, SCCAnalysisRuns);
302*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6, FunctionAnalysisRuns);
303*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6, ImmutableFunctionAnalysisRuns);
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, SCCPassRunCount1);
306*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(14, AnalyzedInstrCount1);
307*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(6, AnalyzedSCCFunctionCount1);
308*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4 * 6, AnalyzedModuleFunctionCount1);
309*9880d681SAndroid Build Coastguard Worker }
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker }
312