xref: /aosp_15_r20/external/llvm/unittests/Analysis/CGSCCPassManagerTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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