xref: /aosp_15_r20/external/llvm/lib/IR/LegacyPassManager.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- LegacyPassManager.cpp - LLVM Pass Infrastructure Implementation ----===//
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 // This file implements the legacy LLVM Pass Manager infrastructure.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRPrintingPasses.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManagers.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassNameParser.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Mutex.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TimeValue.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Timer.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
29*9880d681SAndroid Build Coastguard Worker #include <algorithm>
30*9880d681SAndroid Build Coastguard Worker #include <map>
31*9880d681SAndroid Build Coastguard Worker #include <unordered_set>
32*9880d681SAndroid Build Coastguard Worker using namespace llvm;
33*9880d681SAndroid Build Coastguard Worker using namespace llvm::legacy;
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker // See PassManagers.h for Pass Manager infrastructure overview.
36*9880d681SAndroid Build Coastguard Worker 
37*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
38*9880d681SAndroid Build Coastguard Worker // Pass debugging information.  Often it is useful to find out what pass is
39*9880d681SAndroid Build Coastguard Worker // running when a crash occurs in a utility.  When this library is compiled with
40*9880d681SAndroid Build Coastguard Worker // debugging on, a command line option (--debug-pass) is enabled that causes the
41*9880d681SAndroid Build Coastguard Worker // pass name to be printed before it executes.
42*9880d681SAndroid Build Coastguard Worker //
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker namespace {
45*9880d681SAndroid Build Coastguard Worker // Different debug levels that can be enabled...
46*9880d681SAndroid Build Coastguard Worker enum PassDebugLevel {
47*9880d681SAndroid Build Coastguard Worker   Disabled, Arguments, Structure, Executions, Details
48*9880d681SAndroid Build Coastguard Worker };
49*9880d681SAndroid Build Coastguard Worker }
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker static cl::opt<enum PassDebugLevel>
52*9880d681SAndroid Build Coastguard Worker PassDebugging("debug-pass", cl::Hidden,
53*9880d681SAndroid Build Coastguard Worker                   cl::desc("Print PassManager debugging information"),
54*9880d681SAndroid Build Coastguard Worker                   cl::values(
55*9880d681SAndroid Build Coastguard Worker   clEnumVal(Disabled  , "disable debug output"),
56*9880d681SAndroid Build Coastguard Worker   clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),
57*9880d681SAndroid Build Coastguard Worker   clEnumVal(Structure , "print pass structure before run()"),
58*9880d681SAndroid Build Coastguard Worker   clEnumVal(Executions, "print pass name before it is executed"),
59*9880d681SAndroid Build Coastguard Worker   clEnumVal(Details   , "print pass details when it is executed"),
60*9880d681SAndroid Build Coastguard Worker                              clEnumValEnd));
61*9880d681SAndroid Build Coastguard Worker 
62*9880d681SAndroid Build Coastguard Worker namespace {
63*9880d681SAndroid Build Coastguard Worker typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser>
64*9880d681SAndroid Build Coastguard Worker PassOptionList;
65*9880d681SAndroid Build Coastguard Worker }
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker // Print IR out before/after specified passes.
68*9880d681SAndroid Build Coastguard Worker static PassOptionList
69*9880d681SAndroid Build Coastguard Worker PrintBefore("print-before",
70*9880d681SAndroid Build Coastguard Worker             llvm::cl::desc("Print IR before specified passes"),
71*9880d681SAndroid Build Coastguard Worker             cl::Hidden);
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker static PassOptionList
74*9880d681SAndroid Build Coastguard Worker PrintAfter("print-after",
75*9880d681SAndroid Build Coastguard Worker            llvm::cl::desc("Print IR after specified passes"),
76*9880d681SAndroid Build Coastguard Worker            cl::Hidden);
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
79*9880d681SAndroid Build Coastguard Worker PrintBeforeAll("print-before-all",
80*9880d681SAndroid Build Coastguard Worker                llvm::cl::desc("Print IR before each pass"),
81*9880d681SAndroid Build Coastguard Worker                cl::init(false));
82*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
83*9880d681SAndroid Build Coastguard Worker PrintAfterAll("print-after-all",
84*9880d681SAndroid Build Coastguard Worker               llvm::cl::desc("Print IR after each pass"),
85*9880d681SAndroid Build Coastguard Worker               cl::init(false));
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
88*9880d681SAndroid Build Coastguard Worker     PrintFuncsList("filter-print-funcs", cl::value_desc("function names"),
89*9880d681SAndroid Build Coastguard Worker                    cl::desc("Only print IR for functions whose name "
90*9880d681SAndroid Build Coastguard Worker                             "match this for all print-[before|after][-all] "
91*9880d681SAndroid Build Coastguard Worker                             "options"),
92*9880d681SAndroid Build Coastguard Worker                    cl::CommaSeparated);
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker /// This is a helper to determine whether to print IR before or
95*9880d681SAndroid Build Coastguard Worker /// after a pass.
96*9880d681SAndroid Build Coastguard Worker 
ShouldPrintBeforeOrAfterPass(const PassInfo * PI,PassOptionList & PassesToPrint)97*9880d681SAndroid Build Coastguard Worker static bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI,
98*9880d681SAndroid Build Coastguard Worker                                          PassOptionList &PassesToPrint) {
99*9880d681SAndroid Build Coastguard Worker   for (auto *PassInf : PassesToPrint) {
100*9880d681SAndroid Build Coastguard Worker     if (PassInf)
101*9880d681SAndroid Build Coastguard Worker       if (PassInf->getPassArgument() == PI->getPassArgument()) {
102*9880d681SAndroid Build Coastguard Worker         return true;
103*9880d681SAndroid Build Coastguard Worker       }
104*9880d681SAndroid Build Coastguard Worker   }
105*9880d681SAndroid Build Coastguard Worker   return false;
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker /// This is a utility to check whether a pass should have IR dumped
109*9880d681SAndroid Build Coastguard Worker /// before it.
ShouldPrintBeforePass(const PassInfo * PI)110*9880d681SAndroid Build Coastguard Worker static bool ShouldPrintBeforePass(const PassInfo *PI) {
111*9880d681SAndroid Build Coastguard Worker   return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore);
112*9880d681SAndroid Build Coastguard Worker }
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker /// This is a utility to check whether a pass should have IR dumped
115*9880d681SAndroid Build Coastguard Worker /// after it.
ShouldPrintAfterPass(const PassInfo * PI)116*9880d681SAndroid Build Coastguard Worker static bool ShouldPrintAfterPass(const PassInfo *PI) {
117*9880d681SAndroid Build Coastguard Worker   return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);
118*9880d681SAndroid Build Coastguard Worker }
119*9880d681SAndroid Build Coastguard Worker 
isFunctionInPrintList(StringRef FunctionName)120*9880d681SAndroid Build Coastguard Worker bool llvm::isFunctionInPrintList(StringRef FunctionName) {
121*9880d681SAndroid Build Coastguard Worker   static std::unordered_set<std::string> PrintFuncNames(PrintFuncsList.begin(),
122*9880d681SAndroid Build Coastguard Worker                                                         PrintFuncsList.end());
123*9880d681SAndroid Build Coastguard Worker   return PrintFuncNames.empty() || PrintFuncNames.count(FunctionName);
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
126*9880d681SAndroid Build Coastguard Worker /// or higher is specified.
isPassDebuggingExecutionsOrMore() const127*9880d681SAndroid Build Coastguard Worker bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
128*9880d681SAndroid Build Coastguard Worker   return PassDebugging >= Executions;
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker 
131*9880d681SAndroid Build Coastguard Worker 
132*9880d681SAndroid Build Coastguard Worker 
133*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS) const134*9880d681SAndroid Build Coastguard Worker void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
135*9880d681SAndroid Build Coastguard Worker   if (!V && !M)
136*9880d681SAndroid Build Coastguard Worker     OS << "Releasing pass '";
137*9880d681SAndroid Build Coastguard Worker   else
138*9880d681SAndroid Build Coastguard Worker     OS << "Running pass '";
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker   OS << P->getPassName() << "'";
141*9880d681SAndroid Build Coastguard Worker 
142*9880d681SAndroid Build Coastguard Worker   if (M) {
143*9880d681SAndroid Build Coastguard Worker     OS << " on module '" << M->getModuleIdentifier() << "'.\n";
144*9880d681SAndroid Build Coastguard Worker     return;
145*9880d681SAndroid Build Coastguard Worker   }
146*9880d681SAndroid Build Coastguard Worker   if (!V) {
147*9880d681SAndroid Build Coastguard Worker     OS << '\n';
148*9880d681SAndroid Build Coastguard Worker     return;
149*9880d681SAndroid Build Coastguard Worker   }
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker   OS << " on ";
152*9880d681SAndroid Build Coastguard Worker   if (isa<Function>(V))
153*9880d681SAndroid Build Coastguard Worker     OS << "function";
154*9880d681SAndroid Build Coastguard Worker   else if (isa<BasicBlock>(V))
155*9880d681SAndroid Build Coastguard Worker     OS << "basic block";
156*9880d681SAndroid Build Coastguard Worker   else
157*9880d681SAndroid Build Coastguard Worker     OS << "value";
158*9880d681SAndroid Build Coastguard Worker 
159*9880d681SAndroid Build Coastguard Worker   OS << " '";
160*9880d681SAndroid Build Coastguard Worker   V->printAsOperand(OS, /*PrintTy=*/false, M);
161*9880d681SAndroid Build Coastguard Worker   OS << "'\n";
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker 
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker namespace {
166*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
167*9880d681SAndroid Build Coastguard Worker // BBPassManager
168*9880d681SAndroid Build Coastguard Worker //
169*9880d681SAndroid Build Coastguard Worker /// BBPassManager manages BasicBlockPass. It batches all the
170*9880d681SAndroid Build Coastguard Worker /// pass together and sequence them to process one basic block before
171*9880d681SAndroid Build Coastguard Worker /// processing next basic block.
172*9880d681SAndroid Build Coastguard Worker class BBPassManager : public PMDataManager, public FunctionPass {
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker public:
175*9880d681SAndroid Build Coastguard Worker   static char ID;
BBPassManager()176*9880d681SAndroid Build Coastguard Worker   explicit BBPassManager()
177*9880d681SAndroid Build Coastguard Worker     : PMDataManager(), FunctionPass(ID) {}
178*9880d681SAndroid Build Coastguard Worker 
179*9880d681SAndroid Build Coastguard Worker   /// Execute all of the passes scheduled for execution.  Keep track of
180*9880d681SAndroid Build Coastguard Worker   /// whether any of the passes modifies the function, and if so, return true.
181*9880d681SAndroid Build Coastguard Worker   bool runOnFunction(Function &F) override;
182*9880d681SAndroid Build Coastguard Worker 
183*9880d681SAndroid Build Coastguard Worker   /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const184*9880d681SAndroid Build Coastguard Worker   void getAnalysisUsage(AnalysisUsage &Info) const override {
185*9880d681SAndroid Build Coastguard Worker     Info.setPreservesAll();
186*9880d681SAndroid Build Coastguard Worker   }
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker   bool doInitialization(Module &M) override;
189*9880d681SAndroid Build Coastguard Worker   bool doInitialization(Function &F);
190*9880d681SAndroid Build Coastguard Worker   bool doFinalization(Module &M) override;
191*9880d681SAndroid Build Coastguard Worker   bool doFinalization(Function &F);
192*9880d681SAndroid Build Coastguard Worker 
getAsPMDataManager()193*9880d681SAndroid Build Coastguard Worker   PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()194*9880d681SAndroid Build Coastguard Worker   Pass *getAsPass() override { return this; }
195*9880d681SAndroid Build Coastguard Worker 
getPassName() const196*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
197*9880d681SAndroid Build Coastguard Worker     return "BasicBlock Pass Manager";
198*9880d681SAndroid Build Coastguard Worker   }
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker   // Print passes managed by this manager
dumpPassStructure(unsigned Offset)201*9880d681SAndroid Build Coastguard Worker   void dumpPassStructure(unsigned Offset) override {
202*9880d681SAndroid Build Coastguard Worker     dbgs().indent(Offset*2) << "BasicBlockPass Manager\n";
203*9880d681SAndroid Build Coastguard Worker     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
204*9880d681SAndroid Build Coastguard Worker       BasicBlockPass *BP = getContainedPass(Index);
205*9880d681SAndroid Build Coastguard Worker       BP->dumpPassStructure(Offset + 1);
206*9880d681SAndroid Build Coastguard Worker       dumpLastUses(BP, Offset+1);
207*9880d681SAndroid Build Coastguard Worker     }
208*9880d681SAndroid Build Coastguard Worker   }
209*9880d681SAndroid Build Coastguard Worker 
getContainedPass(unsigned N)210*9880d681SAndroid Build Coastguard Worker   BasicBlockPass *getContainedPass(unsigned N) {
211*9880d681SAndroid Build Coastguard Worker     assert(N < PassVector.size() && "Pass number out of range!");
212*9880d681SAndroid Build Coastguard Worker     BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]);
213*9880d681SAndroid Build Coastguard Worker     return BP;
214*9880d681SAndroid Build Coastguard Worker   }
215*9880d681SAndroid Build Coastguard Worker 
getPassManagerType() const216*9880d681SAndroid Build Coastguard Worker   PassManagerType getPassManagerType() const override {
217*9880d681SAndroid Build Coastguard Worker     return PMT_BasicBlockPassManager;
218*9880d681SAndroid Build Coastguard Worker   }
219*9880d681SAndroid Build Coastguard Worker };
220*9880d681SAndroid Build Coastguard Worker 
221*9880d681SAndroid Build Coastguard Worker char BBPassManager::ID = 0;
222*9880d681SAndroid Build Coastguard Worker } // End anonymous namespace
223*9880d681SAndroid Build Coastguard Worker 
224*9880d681SAndroid Build Coastguard Worker namespace llvm {
225*9880d681SAndroid Build Coastguard Worker namespace legacy {
226*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
227*9880d681SAndroid Build Coastguard Worker // FunctionPassManagerImpl
228*9880d681SAndroid Build Coastguard Worker //
229*9880d681SAndroid Build Coastguard Worker /// FunctionPassManagerImpl manages FPPassManagers
230*9880d681SAndroid Build Coastguard Worker class FunctionPassManagerImpl : public Pass,
231*9880d681SAndroid Build Coastguard Worker                                 public PMDataManager,
232*9880d681SAndroid Build Coastguard Worker                                 public PMTopLevelManager {
233*9880d681SAndroid Build Coastguard Worker   virtual void anchor();
234*9880d681SAndroid Build Coastguard Worker private:
235*9880d681SAndroid Build Coastguard Worker   bool wasRun;
236*9880d681SAndroid Build Coastguard Worker public:
237*9880d681SAndroid Build Coastguard Worker   static char ID;
FunctionPassManagerImpl()238*9880d681SAndroid Build Coastguard Worker   explicit FunctionPassManagerImpl() :
239*9880d681SAndroid Build Coastguard Worker     Pass(PT_PassManager, ID), PMDataManager(),
240*9880d681SAndroid Build Coastguard Worker     PMTopLevelManager(new FPPassManager()), wasRun(false) {}
241*9880d681SAndroid Build Coastguard Worker 
242*9880d681SAndroid Build Coastguard Worker   /// \copydoc FunctionPassManager::add()
add(Pass * P)243*9880d681SAndroid Build Coastguard Worker   void add(Pass *P) {
244*9880d681SAndroid Build Coastguard Worker     schedulePass(P);
245*9880d681SAndroid Build Coastguard Worker   }
246*9880d681SAndroid Build Coastguard Worker 
247*9880d681SAndroid Build Coastguard Worker   /// createPrinterPass - Get a function printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const248*9880d681SAndroid Build Coastguard Worker   Pass *createPrinterPass(raw_ostream &O,
249*9880d681SAndroid Build Coastguard Worker                           const std::string &Banner) const override {
250*9880d681SAndroid Build Coastguard Worker     return createPrintFunctionPass(O, Banner);
251*9880d681SAndroid Build Coastguard Worker   }
252*9880d681SAndroid Build Coastguard Worker 
253*9880d681SAndroid Build Coastguard Worker   // Prepare for running an on the fly pass, freeing memory if needed
254*9880d681SAndroid Build Coastguard Worker   // from a previous run.
255*9880d681SAndroid Build Coastguard Worker   void releaseMemoryOnTheFly();
256*9880d681SAndroid Build Coastguard Worker 
257*9880d681SAndroid Build Coastguard Worker   /// run - Execute all of the passes scheduled for execution.  Keep track of
258*9880d681SAndroid Build Coastguard Worker   /// whether any of the passes modifies the module, and if so, return true.
259*9880d681SAndroid Build Coastguard Worker   bool run(Function &F);
260*9880d681SAndroid Build Coastguard Worker 
261*9880d681SAndroid Build Coastguard Worker   /// doInitialization - Run all of the initializers for the function passes.
262*9880d681SAndroid Build Coastguard Worker   ///
263*9880d681SAndroid Build Coastguard Worker   bool doInitialization(Module &M) override;
264*9880d681SAndroid Build Coastguard Worker 
265*9880d681SAndroid Build Coastguard Worker   /// doFinalization - Run all of the finalizers for the function passes.
266*9880d681SAndroid Build Coastguard Worker   ///
267*9880d681SAndroid Build Coastguard Worker   bool doFinalization(Module &M) override;
268*9880d681SAndroid Build Coastguard Worker 
269*9880d681SAndroid Build Coastguard Worker 
getAsPMDataManager()270*9880d681SAndroid Build Coastguard Worker   PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()271*9880d681SAndroid Build Coastguard Worker   Pass *getAsPass() override { return this; }
getTopLevelPassManagerType()272*9880d681SAndroid Build Coastguard Worker   PassManagerType getTopLevelPassManagerType() override {
273*9880d681SAndroid Build Coastguard Worker     return PMT_FunctionPassManager;
274*9880d681SAndroid Build Coastguard Worker   }
275*9880d681SAndroid Build Coastguard Worker 
276*9880d681SAndroid Build Coastguard Worker   /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const277*9880d681SAndroid Build Coastguard Worker   void getAnalysisUsage(AnalysisUsage &Info) const override {
278*9880d681SAndroid Build Coastguard Worker     Info.setPreservesAll();
279*9880d681SAndroid Build Coastguard Worker   }
280*9880d681SAndroid Build Coastguard Worker 
getContainedManager(unsigned N)281*9880d681SAndroid Build Coastguard Worker   FPPassManager *getContainedManager(unsigned N) {
282*9880d681SAndroid Build Coastguard Worker     assert(N < PassManagers.size() && "Pass number out of range!");
283*9880d681SAndroid Build Coastguard Worker     FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
284*9880d681SAndroid Build Coastguard Worker     return FP;
285*9880d681SAndroid Build Coastguard Worker   }
286*9880d681SAndroid Build Coastguard Worker };
287*9880d681SAndroid Build Coastguard Worker 
anchor()288*9880d681SAndroid Build Coastguard Worker void FunctionPassManagerImpl::anchor() {}
289*9880d681SAndroid Build Coastguard Worker 
290*9880d681SAndroid Build Coastguard Worker char FunctionPassManagerImpl::ID = 0;
291*9880d681SAndroid Build Coastguard Worker } // End of legacy namespace
292*9880d681SAndroid Build Coastguard Worker } // End of llvm namespace
293*9880d681SAndroid Build Coastguard Worker 
294*9880d681SAndroid Build Coastguard Worker namespace {
295*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
296*9880d681SAndroid Build Coastguard Worker // MPPassManager
297*9880d681SAndroid Build Coastguard Worker //
298*9880d681SAndroid Build Coastguard Worker /// MPPassManager manages ModulePasses and function pass managers.
299*9880d681SAndroid Build Coastguard Worker /// It batches all Module passes and function pass managers together and
300*9880d681SAndroid Build Coastguard Worker /// sequences them to process one module.
301*9880d681SAndroid Build Coastguard Worker class MPPassManager : public Pass, public PMDataManager {
302*9880d681SAndroid Build Coastguard Worker public:
303*9880d681SAndroid Build Coastguard Worker   static char ID;
MPPassManager()304*9880d681SAndroid Build Coastguard Worker   explicit MPPassManager() :
305*9880d681SAndroid Build Coastguard Worker     Pass(PT_PassManager, ID), PMDataManager() { }
306*9880d681SAndroid Build Coastguard Worker 
307*9880d681SAndroid Build Coastguard Worker   // Delete on the fly managers.
~MPPassManager()308*9880d681SAndroid Build Coastguard Worker   ~MPPassManager() override {
309*9880d681SAndroid Build Coastguard Worker     for (auto &OnTheFlyManager : OnTheFlyManagers) {
310*9880d681SAndroid Build Coastguard Worker       FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
311*9880d681SAndroid Build Coastguard Worker       delete FPP;
312*9880d681SAndroid Build Coastguard Worker     }
313*9880d681SAndroid Build Coastguard Worker   }
314*9880d681SAndroid Build Coastguard Worker 
315*9880d681SAndroid Build Coastguard Worker   /// createPrinterPass - Get a module printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const316*9880d681SAndroid Build Coastguard Worker   Pass *createPrinterPass(raw_ostream &O,
317*9880d681SAndroid Build Coastguard Worker                           const std::string &Banner) const override {
318*9880d681SAndroid Build Coastguard Worker     return createPrintModulePass(O, Banner);
319*9880d681SAndroid Build Coastguard Worker   }
320*9880d681SAndroid Build Coastguard Worker 
321*9880d681SAndroid Build Coastguard Worker   /// run - Execute all of the passes scheduled for execution.  Keep track of
322*9880d681SAndroid Build Coastguard Worker   /// whether any of the passes modifies the module, and if so, return true.
323*9880d681SAndroid Build Coastguard Worker   bool runOnModule(Module &M);
324*9880d681SAndroid Build Coastguard Worker 
325*9880d681SAndroid Build Coastguard Worker   using llvm::Pass::doInitialization;
326*9880d681SAndroid Build Coastguard Worker   using llvm::Pass::doFinalization;
327*9880d681SAndroid Build Coastguard Worker 
328*9880d681SAndroid Build Coastguard Worker   /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const329*9880d681SAndroid Build Coastguard Worker   void getAnalysisUsage(AnalysisUsage &Info) const override {
330*9880d681SAndroid Build Coastguard Worker     Info.setPreservesAll();
331*9880d681SAndroid Build Coastguard Worker   }
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker   /// Add RequiredPass into list of lower level passes required by pass P.
334*9880d681SAndroid Build Coastguard Worker   /// RequiredPass is run on the fly by Pass Manager when P requests it
335*9880d681SAndroid Build Coastguard Worker   /// through getAnalysis interface.
336*9880d681SAndroid Build Coastguard Worker   void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override;
337*9880d681SAndroid Build Coastguard Worker 
338*9880d681SAndroid Build Coastguard Worker   /// Return function pass corresponding to PassInfo PI, that is
339*9880d681SAndroid Build Coastguard Worker   /// required by module pass MP. Instantiate analysis pass, by using
340*9880d681SAndroid Build Coastguard Worker   /// its runOnFunction() for function F.
341*9880d681SAndroid Build Coastguard Worker   Pass* getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F) override;
342*9880d681SAndroid Build Coastguard Worker 
getPassName() const343*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
344*9880d681SAndroid Build Coastguard Worker     return "Module Pass Manager";
345*9880d681SAndroid Build Coastguard Worker   }
346*9880d681SAndroid Build Coastguard Worker 
getAsPMDataManager()347*9880d681SAndroid Build Coastguard Worker   PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()348*9880d681SAndroid Build Coastguard Worker   Pass *getAsPass() override { return this; }
349*9880d681SAndroid Build Coastguard Worker 
350*9880d681SAndroid Build Coastguard Worker   // Print passes managed by this manager
dumpPassStructure(unsigned Offset)351*9880d681SAndroid Build Coastguard Worker   void dumpPassStructure(unsigned Offset) override {
352*9880d681SAndroid Build Coastguard Worker     dbgs().indent(Offset*2) << "ModulePass Manager\n";
353*9880d681SAndroid Build Coastguard Worker     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
354*9880d681SAndroid Build Coastguard Worker       ModulePass *MP = getContainedPass(Index);
355*9880d681SAndroid Build Coastguard Worker       MP->dumpPassStructure(Offset + 1);
356*9880d681SAndroid Build Coastguard Worker       std::map<Pass *, FunctionPassManagerImpl *>::const_iterator I =
357*9880d681SAndroid Build Coastguard Worker         OnTheFlyManagers.find(MP);
358*9880d681SAndroid Build Coastguard Worker       if (I != OnTheFlyManagers.end())
359*9880d681SAndroid Build Coastguard Worker         I->second->dumpPassStructure(Offset + 2);
360*9880d681SAndroid Build Coastguard Worker       dumpLastUses(MP, Offset+1);
361*9880d681SAndroid Build Coastguard Worker     }
362*9880d681SAndroid Build Coastguard Worker   }
363*9880d681SAndroid Build Coastguard Worker 
getContainedPass(unsigned N)364*9880d681SAndroid Build Coastguard Worker   ModulePass *getContainedPass(unsigned N) {
365*9880d681SAndroid Build Coastguard Worker     assert(N < PassVector.size() && "Pass number out of range!");
366*9880d681SAndroid Build Coastguard Worker     return static_cast<ModulePass *>(PassVector[N]);
367*9880d681SAndroid Build Coastguard Worker   }
368*9880d681SAndroid Build Coastguard Worker 
getPassManagerType() const369*9880d681SAndroid Build Coastguard Worker   PassManagerType getPassManagerType() const override {
370*9880d681SAndroid Build Coastguard Worker     return PMT_ModulePassManager;
371*9880d681SAndroid Build Coastguard Worker   }
372*9880d681SAndroid Build Coastguard Worker 
373*9880d681SAndroid Build Coastguard Worker  private:
374*9880d681SAndroid Build Coastguard Worker   /// Collection of on the fly FPPassManagers. These managers manage
375*9880d681SAndroid Build Coastguard Worker   /// function passes that are required by module passes.
376*9880d681SAndroid Build Coastguard Worker   std::map<Pass *, FunctionPassManagerImpl *> OnTheFlyManagers;
377*9880d681SAndroid Build Coastguard Worker };
378*9880d681SAndroid Build Coastguard Worker 
379*9880d681SAndroid Build Coastguard Worker char MPPassManager::ID = 0;
380*9880d681SAndroid Build Coastguard Worker } // End anonymous namespace
381*9880d681SAndroid Build Coastguard Worker 
382*9880d681SAndroid Build Coastguard Worker namespace llvm {
383*9880d681SAndroid Build Coastguard Worker namespace legacy {
384*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
385*9880d681SAndroid Build Coastguard Worker // PassManagerImpl
386*9880d681SAndroid Build Coastguard Worker //
387*9880d681SAndroid Build Coastguard Worker 
388*9880d681SAndroid Build Coastguard Worker /// PassManagerImpl manages MPPassManagers
389*9880d681SAndroid Build Coastguard Worker class PassManagerImpl : public Pass,
390*9880d681SAndroid Build Coastguard Worker                         public PMDataManager,
391*9880d681SAndroid Build Coastguard Worker                         public PMTopLevelManager {
392*9880d681SAndroid Build Coastguard Worker   virtual void anchor();
393*9880d681SAndroid Build Coastguard Worker 
394*9880d681SAndroid Build Coastguard Worker public:
395*9880d681SAndroid Build Coastguard Worker   static char ID;
PassManagerImpl()396*9880d681SAndroid Build Coastguard Worker   explicit PassManagerImpl() :
397*9880d681SAndroid Build Coastguard Worker     Pass(PT_PassManager, ID), PMDataManager(),
398*9880d681SAndroid Build Coastguard Worker                               PMTopLevelManager(new MPPassManager()) {}
399*9880d681SAndroid Build Coastguard Worker 
400*9880d681SAndroid Build Coastguard Worker   /// \copydoc PassManager::add()
add(Pass * P)401*9880d681SAndroid Build Coastguard Worker   void add(Pass *P) {
402*9880d681SAndroid Build Coastguard Worker     schedulePass(P);
403*9880d681SAndroid Build Coastguard Worker   }
404*9880d681SAndroid Build Coastguard Worker 
405*9880d681SAndroid Build Coastguard Worker   /// createPrinterPass - Get a module printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const406*9880d681SAndroid Build Coastguard Worker   Pass *createPrinterPass(raw_ostream &O,
407*9880d681SAndroid Build Coastguard Worker                           const std::string &Banner) const override {
408*9880d681SAndroid Build Coastguard Worker     return createPrintModulePass(O, Banner);
409*9880d681SAndroid Build Coastguard Worker   }
410*9880d681SAndroid Build Coastguard Worker 
411*9880d681SAndroid Build Coastguard Worker   /// run - Execute all of the passes scheduled for execution.  Keep track of
412*9880d681SAndroid Build Coastguard Worker   /// whether any of the passes modifies the module, and if so, return true.
413*9880d681SAndroid Build Coastguard Worker   bool run(Module &M);
414*9880d681SAndroid Build Coastguard Worker 
415*9880d681SAndroid Build Coastguard Worker   using llvm::Pass::doInitialization;
416*9880d681SAndroid Build Coastguard Worker   using llvm::Pass::doFinalization;
417*9880d681SAndroid Build Coastguard Worker 
418*9880d681SAndroid Build Coastguard Worker   /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const419*9880d681SAndroid Build Coastguard Worker   void getAnalysisUsage(AnalysisUsage &Info) const override {
420*9880d681SAndroid Build Coastguard Worker     Info.setPreservesAll();
421*9880d681SAndroid Build Coastguard Worker   }
422*9880d681SAndroid Build Coastguard Worker 
getAsPMDataManager()423*9880d681SAndroid Build Coastguard Worker   PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()424*9880d681SAndroid Build Coastguard Worker   Pass *getAsPass() override { return this; }
getTopLevelPassManagerType()425*9880d681SAndroid Build Coastguard Worker   PassManagerType getTopLevelPassManagerType() override {
426*9880d681SAndroid Build Coastguard Worker     return PMT_ModulePassManager;
427*9880d681SAndroid Build Coastguard Worker   }
428*9880d681SAndroid Build Coastguard Worker 
getContainedManager(unsigned N)429*9880d681SAndroid Build Coastguard Worker   MPPassManager *getContainedManager(unsigned N) {
430*9880d681SAndroid Build Coastguard Worker     assert(N < PassManagers.size() && "Pass number out of range!");
431*9880d681SAndroid Build Coastguard Worker     MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
432*9880d681SAndroid Build Coastguard Worker     return MP;
433*9880d681SAndroid Build Coastguard Worker   }
434*9880d681SAndroid Build Coastguard Worker };
435*9880d681SAndroid Build Coastguard Worker 
anchor()436*9880d681SAndroid Build Coastguard Worker void PassManagerImpl::anchor() {}
437*9880d681SAndroid Build Coastguard Worker 
438*9880d681SAndroid Build Coastguard Worker char PassManagerImpl::ID = 0;
439*9880d681SAndroid Build Coastguard Worker } // End of legacy namespace
440*9880d681SAndroid Build Coastguard Worker } // End of llvm namespace
441*9880d681SAndroid Build Coastguard Worker 
442*9880d681SAndroid Build Coastguard Worker namespace {
443*9880d681SAndroid Build Coastguard Worker 
444*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
445*9880d681SAndroid Build Coastguard Worker /// TimingInfo Class - This class is used to calculate information about the
446*9880d681SAndroid Build Coastguard Worker /// amount of time each pass takes to execute.  This only happens when
447*9880d681SAndroid Build Coastguard Worker /// -time-passes is enabled on the command line.
448*9880d681SAndroid Build Coastguard Worker ///
449*9880d681SAndroid Build Coastguard Worker 
450*9880d681SAndroid Build Coastguard Worker static ManagedStatic<sys::SmartMutex<true> > TimingInfoMutex;
451*9880d681SAndroid Build Coastguard Worker 
452*9880d681SAndroid Build Coastguard Worker class TimingInfo {
453*9880d681SAndroid Build Coastguard Worker   DenseMap<Pass*, Timer*> TimingData;
454*9880d681SAndroid Build Coastguard Worker   TimerGroup TG;
455*9880d681SAndroid Build Coastguard Worker public:
456*9880d681SAndroid Build Coastguard Worker   // Use 'create' member to get this.
TimingInfo()457*9880d681SAndroid Build Coastguard Worker   TimingInfo() : TG("... Pass execution timing report ...") {}
458*9880d681SAndroid Build Coastguard Worker 
459*9880d681SAndroid Build Coastguard Worker   // TimingDtor - Print out information about timing information
~TimingInfo()460*9880d681SAndroid Build Coastguard Worker   ~TimingInfo() {
461*9880d681SAndroid Build Coastguard Worker     // Delete all of the timers, which accumulate their info into the
462*9880d681SAndroid Build Coastguard Worker     // TimerGroup.
463*9880d681SAndroid Build Coastguard Worker     for (auto &I : TimingData)
464*9880d681SAndroid Build Coastguard Worker       delete I.second;
465*9880d681SAndroid Build Coastguard Worker     // TimerGroup is deleted next, printing the report.
466*9880d681SAndroid Build Coastguard Worker   }
467*9880d681SAndroid Build Coastguard Worker 
468*9880d681SAndroid Build Coastguard Worker   // createTheTimeInfo - This method either initializes the TheTimeInfo pointer
469*9880d681SAndroid Build Coastguard Worker   // to a non-null value (if the -time-passes option is enabled) or it leaves it
470*9880d681SAndroid Build Coastguard Worker   // null.  It may be called multiple times.
471*9880d681SAndroid Build Coastguard Worker   static void createTheTimeInfo();
472*9880d681SAndroid Build Coastguard Worker 
473*9880d681SAndroid Build Coastguard Worker   /// getPassTimer - Return the timer for the specified pass if it exists.
getPassTimer(Pass * P)474*9880d681SAndroid Build Coastguard Worker   Timer *getPassTimer(Pass *P) {
475*9880d681SAndroid Build Coastguard Worker     if (P->getAsPMDataManager())
476*9880d681SAndroid Build Coastguard Worker       return nullptr;
477*9880d681SAndroid Build Coastguard Worker 
478*9880d681SAndroid Build Coastguard Worker     sys::SmartScopedLock<true> Lock(*TimingInfoMutex);
479*9880d681SAndroid Build Coastguard Worker     Timer *&T = TimingData[P];
480*9880d681SAndroid Build Coastguard Worker     if (!T)
481*9880d681SAndroid Build Coastguard Worker       T = new Timer(P->getPassName(), TG);
482*9880d681SAndroid Build Coastguard Worker     return T;
483*9880d681SAndroid Build Coastguard Worker   }
484*9880d681SAndroid Build Coastguard Worker };
485*9880d681SAndroid Build Coastguard Worker 
486*9880d681SAndroid Build Coastguard Worker } // End of anon namespace
487*9880d681SAndroid Build Coastguard Worker 
488*9880d681SAndroid Build Coastguard Worker static TimingInfo *TheTimeInfo;
489*9880d681SAndroid Build Coastguard Worker 
490*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
491*9880d681SAndroid Build Coastguard Worker // PMTopLevelManager implementation
492*9880d681SAndroid Build Coastguard Worker 
493*9880d681SAndroid Build Coastguard Worker /// Initialize top level manager. Create first pass manager.
PMTopLevelManager(PMDataManager * PMDM)494*9880d681SAndroid Build Coastguard Worker PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) {
495*9880d681SAndroid Build Coastguard Worker   PMDM->setTopLevelManager(this);
496*9880d681SAndroid Build Coastguard Worker   addPassManager(PMDM);
497*9880d681SAndroid Build Coastguard Worker   activeStack.push(PMDM);
498*9880d681SAndroid Build Coastguard Worker }
499*9880d681SAndroid Build Coastguard Worker 
500*9880d681SAndroid Build Coastguard Worker /// Set pass P as the last user of the given analysis passes.
501*9880d681SAndroid Build Coastguard Worker void
setLastUser(ArrayRef<Pass * > AnalysisPasses,Pass * P)502*9880d681SAndroid Build Coastguard Worker PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) {
503*9880d681SAndroid Build Coastguard Worker   unsigned PDepth = 0;
504*9880d681SAndroid Build Coastguard Worker   if (P->getResolver())
505*9880d681SAndroid Build Coastguard Worker     PDepth = P->getResolver()->getPMDataManager().getDepth();
506*9880d681SAndroid Build Coastguard Worker 
507*9880d681SAndroid Build Coastguard Worker   for (Pass *AP : AnalysisPasses) {
508*9880d681SAndroid Build Coastguard Worker     LastUser[AP] = P;
509*9880d681SAndroid Build Coastguard Worker 
510*9880d681SAndroid Build Coastguard Worker     if (P == AP)
511*9880d681SAndroid Build Coastguard Worker       continue;
512*9880d681SAndroid Build Coastguard Worker 
513*9880d681SAndroid Build Coastguard Worker     // Update the last users of passes that are required transitive by AP.
514*9880d681SAndroid Build Coastguard Worker     AnalysisUsage *AnUsage = findAnalysisUsage(AP);
515*9880d681SAndroid Build Coastguard Worker     const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet();
516*9880d681SAndroid Build Coastguard Worker     SmallVector<Pass *, 12> LastUses;
517*9880d681SAndroid Build Coastguard Worker     SmallVector<Pass *, 12> LastPMUses;
518*9880d681SAndroid Build Coastguard Worker     for (AnalysisID ID : IDs) {
519*9880d681SAndroid Build Coastguard Worker       Pass *AnalysisPass = findAnalysisPass(ID);
520*9880d681SAndroid Build Coastguard Worker       assert(AnalysisPass && "Expected analysis pass to exist.");
521*9880d681SAndroid Build Coastguard Worker       AnalysisResolver *AR = AnalysisPass->getResolver();
522*9880d681SAndroid Build Coastguard Worker       assert(AR && "Expected analysis resolver to exist.");
523*9880d681SAndroid Build Coastguard Worker       unsigned APDepth = AR->getPMDataManager().getDepth();
524*9880d681SAndroid Build Coastguard Worker 
525*9880d681SAndroid Build Coastguard Worker       if (PDepth == APDepth)
526*9880d681SAndroid Build Coastguard Worker         LastUses.push_back(AnalysisPass);
527*9880d681SAndroid Build Coastguard Worker       else if (PDepth > APDepth)
528*9880d681SAndroid Build Coastguard Worker         LastPMUses.push_back(AnalysisPass);
529*9880d681SAndroid Build Coastguard Worker     }
530*9880d681SAndroid Build Coastguard Worker 
531*9880d681SAndroid Build Coastguard Worker     setLastUser(LastUses, P);
532*9880d681SAndroid Build Coastguard Worker 
533*9880d681SAndroid Build Coastguard Worker     // If this pass has a corresponding pass manager, push higher level
534*9880d681SAndroid Build Coastguard Worker     // analysis to this pass manager.
535*9880d681SAndroid Build Coastguard Worker     if (P->getResolver())
536*9880d681SAndroid Build Coastguard Worker       setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass());
537*9880d681SAndroid Build Coastguard Worker 
538*9880d681SAndroid Build Coastguard Worker 
539*9880d681SAndroid Build Coastguard Worker     // If AP is the last user of other passes then make P last user of
540*9880d681SAndroid Build Coastguard Worker     // such passes.
541*9880d681SAndroid Build Coastguard Worker     for (DenseMap<Pass *, Pass *>::iterator LUI = LastUser.begin(),
542*9880d681SAndroid Build Coastguard Worker            LUE = LastUser.end(); LUI != LUE; ++LUI) {
543*9880d681SAndroid Build Coastguard Worker       if (LUI->second == AP)
544*9880d681SAndroid Build Coastguard Worker         // DenseMap iterator is not invalidated here because
545*9880d681SAndroid Build Coastguard Worker         // this is just updating existing entries.
546*9880d681SAndroid Build Coastguard Worker         LastUser[LUI->first] = P;
547*9880d681SAndroid Build Coastguard Worker     }
548*9880d681SAndroid Build Coastguard Worker   }
549*9880d681SAndroid Build Coastguard Worker }
550*9880d681SAndroid Build Coastguard Worker 
551*9880d681SAndroid Build Coastguard Worker /// Collect passes whose last user is P
collectLastUses(SmallVectorImpl<Pass * > & LastUses,Pass * P)552*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses,
553*9880d681SAndroid Build Coastguard Worker                                         Pass *P) {
554*9880d681SAndroid Build Coastguard Worker   DenseMap<Pass *, SmallPtrSet<Pass *, 8> >::iterator DMI =
555*9880d681SAndroid Build Coastguard Worker     InversedLastUser.find(P);
556*9880d681SAndroid Build Coastguard Worker   if (DMI == InversedLastUser.end())
557*9880d681SAndroid Build Coastguard Worker     return;
558*9880d681SAndroid Build Coastguard Worker 
559*9880d681SAndroid Build Coastguard Worker   SmallPtrSet<Pass *, 8> &LU = DMI->second;
560*9880d681SAndroid Build Coastguard Worker   for (Pass *LUP : LU) {
561*9880d681SAndroid Build Coastguard Worker     LastUses.push_back(LUP);
562*9880d681SAndroid Build Coastguard Worker   }
563*9880d681SAndroid Build Coastguard Worker 
564*9880d681SAndroid Build Coastguard Worker }
565*9880d681SAndroid Build Coastguard Worker 
findAnalysisUsage(Pass * P)566*9880d681SAndroid Build Coastguard Worker AnalysisUsage *PMTopLevelManager::findAnalysisUsage(Pass *P) {
567*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = nullptr;
568*9880d681SAndroid Build Coastguard Worker   auto DMI = AnUsageMap.find(P);
569*9880d681SAndroid Build Coastguard Worker   if (DMI != AnUsageMap.end())
570*9880d681SAndroid Build Coastguard Worker     AnUsage = DMI->second;
571*9880d681SAndroid Build Coastguard Worker   else {
572*9880d681SAndroid Build Coastguard Worker     // Look up the analysis usage from the pass instance (different instances
573*9880d681SAndroid Build Coastguard Worker     // of the same pass can produce different results), but unique the
574*9880d681SAndroid Build Coastguard Worker     // resulting object to reduce memory usage.  This helps to greatly reduce
575*9880d681SAndroid Build Coastguard Worker     // memory usage when we have many instances of only a few pass types
576*9880d681SAndroid Build Coastguard Worker     // (e.g. instcombine, simplifycfg, etc...) which tend to share a fixed set
577*9880d681SAndroid Build Coastguard Worker     // of dependencies.
578*9880d681SAndroid Build Coastguard Worker     AnalysisUsage AU;
579*9880d681SAndroid Build Coastguard Worker     P->getAnalysisUsage(AU);
580*9880d681SAndroid Build Coastguard Worker 
581*9880d681SAndroid Build Coastguard Worker     AUFoldingSetNode* Node = nullptr;
582*9880d681SAndroid Build Coastguard Worker     FoldingSetNodeID ID;
583*9880d681SAndroid Build Coastguard Worker     AUFoldingSetNode::Profile(ID, AU);
584*9880d681SAndroid Build Coastguard Worker     void *IP = nullptr;
585*9880d681SAndroid Build Coastguard Worker     if (auto *N = UniqueAnalysisUsages.FindNodeOrInsertPos(ID, IP))
586*9880d681SAndroid Build Coastguard Worker       Node = N;
587*9880d681SAndroid Build Coastguard Worker     else {
588*9880d681SAndroid Build Coastguard Worker       Node = new (AUFoldingSetNodeAllocator.Allocate()) AUFoldingSetNode(AU);
589*9880d681SAndroid Build Coastguard Worker       UniqueAnalysisUsages.InsertNode(Node, IP);
590*9880d681SAndroid Build Coastguard Worker     }
591*9880d681SAndroid Build Coastguard Worker     assert(Node && "cached analysis usage must be non null");
592*9880d681SAndroid Build Coastguard Worker 
593*9880d681SAndroid Build Coastguard Worker     AnUsageMap[P] = &Node->AU;
594*9880d681SAndroid Build Coastguard Worker     AnUsage = &Node->AU;;
595*9880d681SAndroid Build Coastguard Worker   }
596*9880d681SAndroid Build Coastguard Worker   return AnUsage;
597*9880d681SAndroid Build Coastguard Worker }
598*9880d681SAndroid Build Coastguard Worker 
599*9880d681SAndroid Build Coastguard Worker /// Schedule pass P for execution. Make sure that passes required by
600*9880d681SAndroid Build Coastguard Worker /// P are run before P is run. Update analysis info maintained by
601*9880d681SAndroid Build Coastguard Worker /// the manager. Remove dead passes. This is a recursive function.
schedulePass(Pass * P)602*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::schedulePass(Pass *P) {
603*9880d681SAndroid Build Coastguard Worker 
604*9880d681SAndroid Build Coastguard Worker   // TODO : Allocate function manager for this pass, other wise required set
605*9880d681SAndroid Build Coastguard Worker   // may be inserted into previous function manager
606*9880d681SAndroid Build Coastguard Worker 
607*9880d681SAndroid Build Coastguard Worker   // Give pass a chance to prepare the stage.
608*9880d681SAndroid Build Coastguard Worker   P->preparePassManager(activeStack);
609*9880d681SAndroid Build Coastguard Worker 
610*9880d681SAndroid Build Coastguard Worker   // If P is an analysis pass and it is available then do not
611*9880d681SAndroid Build Coastguard Worker   // generate the analysis again. Stale analysis info should not be
612*9880d681SAndroid Build Coastguard Worker   // available at this point.
613*9880d681SAndroid Build Coastguard Worker   const PassInfo *PI = findAnalysisPassInfo(P->getPassID());
614*9880d681SAndroid Build Coastguard Worker   if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) {
615*9880d681SAndroid Build Coastguard Worker     delete P;
616*9880d681SAndroid Build Coastguard Worker     return;
617*9880d681SAndroid Build Coastguard Worker   }
618*9880d681SAndroid Build Coastguard Worker 
619*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = findAnalysisUsage(P);
620*9880d681SAndroid Build Coastguard Worker 
621*9880d681SAndroid Build Coastguard Worker   bool checkAnalysis = true;
622*9880d681SAndroid Build Coastguard Worker   while (checkAnalysis) {
623*9880d681SAndroid Build Coastguard Worker     checkAnalysis = false;
624*9880d681SAndroid Build Coastguard Worker 
625*9880d681SAndroid Build Coastguard Worker     const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet();
626*9880d681SAndroid Build Coastguard Worker     for (AnalysisUsage::VectorType::const_iterator I = RequiredSet.begin(),
627*9880d681SAndroid Build Coastguard Worker            E = RequiredSet.end(); I != E; ++I) {
628*9880d681SAndroid Build Coastguard Worker 
629*9880d681SAndroid Build Coastguard Worker       Pass *AnalysisPass = findAnalysisPass(*I);
630*9880d681SAndroid Build Coastguard Worker       if (!AnalysisPass) {
631*9880d681SAndroid Build Coastguard Worker         const PassInfo *PI = findAnalysisPassInfo(*I);
632*9880d681SAndroid Build Coastguard Worker 
633*9880d681SAndroid Build Coastguard Worker         if (!PI) {
634*9880d681SAndroid Build Coastguard Worker           // Pass P is not in the global PassRegistry
635*9880d681SAndroid Build Coastguard Worker           dbgs() << "Pass '"  << P->getPassName() << "' is not initialized." << "\n";
636*9880d681SAndroid Build Coastguard Worker           dbgs() << "Verify if there is a pass dependency cycle." << "\n";
637*9880d681SAndroid Build Coastguard Worker           dbgs() << "Required Passes:" << "\n";
638*9880d681SAndroid Build Coastguard Worker           for (AnalysisUsage::VectorType::const_iterator I2 = RequiredSet.begin(),
639*9880d681SAndroid Build Coastguard Worker                  E = RequiredSet.end(); I2 != E && I2 != I; ++I2) {
640*9880d681SAndroid Build Coastguard Worker             Pass *AnalysisPass2 = findAnalysisPass(*I2);
641*9880d681SAndroid Build Coastguard Worker             if (AnalysisPass2) {
642*9880d681SAndroid Build Coastguard Worker               dbgs() << "\t" << AnalysisPass2->getPassName() << "\n";
643*9880d681SAndroid Build Coastguard Worker             } else {
644*9880d681SAndroid Build Coastguard Worker               dbgs() << "\t"   << "Error: Required pass not found! Possible causes:"  << "\n";
645*9880d681SAndroid Build Coastguard Worker               dbgs() << "\t\t" << "- Pass misconfiguration (e.g.: missing macros)"    << "\n";
646*9880d681SAndroid Build Coastguard Worker               dbgs() << "\t\t" << "- Corruption of the global PassRegistry"           << "\n";
647*9880d681SAndroid Build Coastguard Worker             }
648*9880d681SAndroid Build Coastguard Worker           }
649*9880d681SAndroid Build Coastguard Worker         }
650*9880d681SAndroid Build Coastguard Worker 
651*9880d681SAndroid Build Coastguard Worker         assert(PI && "Expected required passes to be initialized");
652*9880d681SAndroid Build Coastguard Worker         AnalysisPass = PI->createPass();
653*9880d681SAndroid Build Coastguard Worker         if (P->getPotentialPassManagerType () ==
654*9880d681SAndroid Build Coastguard Worker             AnalysisPass->getPotentialPassManagerType())
655*9880d681SAndroid Build Coastguard Worker           // Schedule analysis pass that is managed by the same pass manager.
656*9880d681SAndroid Build Coastguard Worker           schedulePass(AnalysisPass);
657*9880d681SAndroid Build Coastguard Worker         else if (P->getPotentialPassManagerType () >
658*9880d681SAndroid Build Coastguard Worker                  AnalysisPass->getPotentialPassManagerType()) {
659*9880d681SAndroid Build Coastguard Worker           // Schedule analysis pass that is managed by a new manager.
660*9880d681SAndroid Build Coastguard Worker           schedulePass(AnalysisPass);
661*9880d681SAndroid Build Coastguard Worker           // Recheck analysis passes to ensure that required analyses that
662*9880d681SAndroid Build Coastguard Worker           // are already checked are still available.
663*9880d681SAndroid Build Coastguard Worker           checkAnalysis = true;
664*9880d681SAndroid Build Coastguard Worker         } else
665*9880d681SAndroid Build Coastguard Worker           // Do not schedule this analysis. Lower level analysis
666*9880d681SAndroid Build Coastguard Worker           // passes are run on the fly.
667*9880d681SAndroid Build Coastguard Worker           delete AnalysisPass;
668*9880d681SAndroid Build Coastguard Worker       }
669*9880d681SAndroid Build Coastguard Worker     }
670*9880d681SAndroid Build Coastguard Worker   }
671*9880d681SAndroid Build Coastguard Worker 
672*9880d681SAndroid Build Coastguard Worker   // Now all required passes are available.
673*9880d681SAndroid Build Coastguard Worker   if (ImmutablePass *IP = P->getAsImmutablePass()) {
674*9880d681SAndroid Build Coastguard Worker     // P is a immutable pass and it will be managed by this
675*9880d681SAndroid Build Coastguard Worker     // top level manager. Set up analysis resolver to connect them.
676*9880d681SAndroid Build Coastguard Worker     PMDataManager *DM = getAsPMDataManager();
677*9880d681SAndroid Build Coastguard Worker     AnalysisResolver *AR = new AnalysisResolver(*DM);
678*9880d681SAndroid Build Coastguard Worker     P->setResolver(AR);
679*9880d681SAndroid Build Coastguard Worker     DM->initializeAnalysisImpl(P);
680*9880d681SAndroid Build Coastguard Worker     addImmutablePass(IP);
681*9880d681SAndroid Build Coastguard Worker     DM->recordAvailableAnalysis(IP);
682*9880d681SAndroid Build Coastguard Worker     return;
683*9880d681SAndroid Build Coastguard Worker   }
684*9880d681SAndroid Build Coastguard Worker 
685*9880d681SAndroid Build Coastguard Worker   if (PI && !PI->isAnalysis() && ShouldPrintBeforePass(PI)) {
686*9880d681SAndroid Build Coastguard Worker     Pass *PP = P->createPrinterPass(
687*9880d681SAndroid Build Coastguard Worker       dbgs(), std::string("*** IR Dump Before ") + P->getPassName() + " ***");
688*9880d681SAndroid Build Coastguard Worker     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
689*9880d681SAndroid Build Coastguard Worker   }
690*9880d681SAndroid Build Coastguard Worker 
691*9880d681SAndroid Build Coastguard Worker   // Add the requested pass to the best available pass manager.
692*9880d681SAndroid Build Coastguard Worker   P->assignPassManager(activeStack, getTopLevelPassManagerType());
693*9880d681SAndroid Build Coastguard Worker 
694*9880d681SAndroid Build Coastguard Worker   if (PI && !PI->isAnalysis() && ShouldPrintAfterPass(PI)) {
695*9880d681SAndroid Build Coastguard Worker     Pass *PP = P->createPrinterPass(
696*9880d681SAndroid Build Coastguard Worker       dbgs(), std::string("*** IR Dump After ") + P->getPassName() + " ***");
697*9880d681SAndroid Build Coastguard Worker     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
698*9880d681SAndroid Build Coastguard Worker   }
699*9880d681SAndroid Build Coastguard Worker }
700*9880d681SAndroid Build Coastguard Worker 
701*9880d681SAndroid Build Coastguard Worker /// Find the pass that implements Analysis AID. Search immutable
702*9880d681SAndroid Build Coastguard Worker /// passes and all pass managers. If desired pass is not found
703*9880d681SAndroid Build Coastguard Worker /// then return NULL.
findAnalysisPass(AnalysisID AID)704*9880d681SAndroid Build Coastguard Worker Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
705*9880d681SAndroid Build Coastguard Worker   // For immutable passes we have a direct mapping from ID to pass, so check
706*9880d681SAndroid Build Coastguard Worker   // that first.
707*9880d681SAndroid Build Coastguard Worker   if (Pass *P = ImmutablePassMap.lookup(AID))
708*9880d681SAndroid Build Coastguard Worker     return P;
709*9880d681SAndroid Build Coastguard Worker 
710*9880d681SAndroid Build Coastguard Worker   // Check pass managers
711*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *PassManager : PassManagers)
712*9880d681SAndroid Build Coastguard Worker     if (Pass *P = PassManager->findAnalysisPass(AID, false))
713*9880d681SAndroid Build Coastguard Worker       return P;
714*9880d681SAndroid Build Coastguard Worker 
715*9880d681SAndroid Build Coastguard Worker   // Check other pass managers
716*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *IndirectPassManager : IndirectPassManagers)
717*9880d681SAndroid Build Coastguard Worker     if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
718*9880d681SAndroid Build Coastguard Worker       return P;
719*9880d681SAndroid Build Coastguard Worker 
720*9880d681SAndroid Build Coastguard Worker   return nullptr;
721*9880d681SAndroid Build Coastguard Worker }
722*9880d681SAndroid Build Coastguard Worker 
findAnalysisPassInfo(AnalysisID AID) const723*9880d681SAndroid Build Coastguard Worker const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const {
724*9880d681SAndroid Build Coastguard Worker   const PassInfo *&PI = AnalysisPassInfos[AID];
725*9880d681SAndroid Build Coastguard Worker   if (!PI)
726*9880d681SAndroid Build Coastguard Worker     PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
727*9880d681SAndroid Build Coastguard Worker   else
728*9880d681SAndroid Build Coastguard Worker     assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) &&
729*9880d681SAndroid Build Coastguard Worker            "The pass info pointer changed for an analysis ID!");
730*9880d681SAndroid Build Coastguard Worker 
731*9880d681SAndroid Build Coastguard Worker   return PI;
732*9880d681SAndroid Build Coastguard Worker }
733*9880d681SAndroid Build Coastguard Worker 
addImmutablePass(ImmutablePass * P)734*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
735*9880d681SAndroid Build Coastguard Worker   P->initializePass();
736*9880d681SAndroid Build Coastguard Worker   ImmutablePasses.push_back(P);
737*9880d681SAndroid Build Coastguard Worker 
738*9880d681SAndroid Build Coastguard Worker   // Add this pass to the map from its analysis ID. We clobber any prior runs
739*9880d681SAndroid Build Coastguard Worker   // of the pass in the map so that the last one added is the one found when
740*9880d681SAndroid Build Coastguard Worker   // doing lookups.
741*9880d681SAndroid Build Coastguard Worker   AnalysisID AID = P->getPassID();
742*9880d681SAndroid Build Coastguard Worker   ImmutablePassMap[AID] = P;
743*9880d681SAndroid Build Coastguard Worker 
744*9880d681SAndroid Build Coastguard Worker   // Also add any interfaces implemented by the immutable pass to the map for
745*9880d681SAndroid Build Coastguard Worker   // fast lookup.
746*9880d681SAndroid Build Coastguard Worker   const PassInfo *PassInf = findAnalysisPassInfo(AID);
747*9880d681SAndroid Build Coastguard Worker   assert(PassInf && "Expected all immutable passes to be initialized");
748*9880d681SAndroid Build Coastguard Worker   for (const PassInfo *ImmPI : PassInf->getInterfacesImplemented())
749*9880d681SAndroid Build Coastguard Worker     ImmutablePassMap[ImmPI->getTypeInfo()] = P;
750*9880d681SAndroid Build Coastguard Worker }
751*9880d681SAndroid Build Coastguard Worker 
752*9880d681SAndroid Build Coastguard Worker // Print passes managed by this top level manager.
dumpPasses() const753*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::dumpPasses() const {
754*9880d681SAndroid Build Coastguard Worker 
755*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Structure)
756*9880d681SAndroid Build Coastguard Worker     return;
757*9880d681SAndroid Build Coastguard Worker 
758*9880d681SAndroid Build Coastguard Worker   // Print out the immutable passes
759*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
760*9880d681SAndroid Build Coastguard Worker     ImmutablePasses[i]->dumpPassStructure(0);
761*9880d681SAndroid Build Coastguard Worker   }
762*9880d681SAndroid Build Coastguard Worker 
763*9880d681SAndroid Build Coastguard Worker   // Every class that derives from PMDataManager also derives from Pass
764*9880d681SAndroid Build Coastguard Worker   // (sometimes indirectly), but there's no inheritance relationship
765*9880d681SAndroid Build Coastguard Worker   // between PMDataManager and Pass, so we have to getAsPass to get
766*9880d681SAndroid Build Coastguard Worker   // from a PMDataManager* to a Pass*.
767*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *Manager : PassManagers)
768*9880d681SAndroid Build Coastguard Worker     Manager->getAsPass()->dumpPassStructure(1);
769*9880d681SAndroid Build Coastguard Worker }
770*9880d681SAndroid Build Coastguard Worker 
dumpArguments() const771*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::dumpArguments() const {
772*9880d681SAndroid Build Coastguard Worker 
773*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Arguments)
774*9880d681SAndroid Build Coastguard Worker     return;
775*9880d681SAndroid Build Coastguard Worker 
776*9880d681SAndroid Build Coastguard Worker   dbgs() << "Pass Arguments: ";
777*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *P : ImmutablePasses)
778*9880d681SAndroid Build Coastguard Worker     if (const PassInfo *PI = findAnalysisPassInfo(P->getPassID())) {
779*9880d681SAndroid Build Coastguard Worker       assert(PI && "Expected all immutable passes to be initialized");
780*9880d681SAndroid Build Coastguard Worker       if (!PI->isAnalysisGroup())
781*9880d681SAndroid Build Coastguard Worker         dbgs() << " -" << PI->getPassArgument();
782*9880d681SAndroid Build Coastguard Worker     }
783*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *PM : PassManagers)
784*9880d681SAndroid Build Coastguard Worker     PM->dumpPassArguments();
785*9880d681SAndroid Build Coastguard Worker   dbgs() << "\n";
786*9880d681SAndroid Build Coastguard Worker }
787*9880d681SAndroid Build Coastguard Worker 
initializeAllAnalysisInfo()788*9880d681SAndroid Build Coastguard Worker void PMTopLevelManager::initializeAllAnalysisInfo() {
789*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *PM : PassManagers)
790*9880d681SAndroid Build Coastguard Worker     PM->initializeAnalysisInfo();
791*9880d681SAndroid Build Coastguard Worker 
792*9880d681SAndroid Build Coastguard Worker   // Initailize other pass managers
793*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *IPM : IndirectPassManagers)
794*9880d681SAndroid Build Coastguard Worker     IPM->initializeAnalysisInfo();
795*9880d681SAndroid Build Coastguard Worker 
796*9880d681SAndroid Build Coastguard Worker   for (DenseMap<Pass *, Pass *>::iterator DMI = LastUser.begin(),
797*9880d681SAndroid Build Coastguard Worker         DME = LastUser.end(); DMI != DME; ++DMI) {
798*9880d681SAndroid Build Coastguard Worker     SmallPtrSet<Pass *, 8> &L = InversedLastUser[DMI->second];
799*9880d681SAndroid Build Coastguard Worker     L.insert(DMI->first);
800*9880d681SAndroid Build Coastguard Worker   }
801*9880d681SAndroid Build Coastguard Worker }
802*9880d681SAndroid Build Coastguard Worker 
803*9880d681SAndroid Build Coastguard Worker /// Destructor
~PMTopLevelManager()804*9880d681SAndroid Build Coastguard Worker PMTopLevelManager::~PMTopLevelManager() {
805*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *PM : PassManagers)
806*9880d681SAndroid Build Coastguard Worker     delete PM;
807*9880d681SAndroid Build Coastguard Worker 
808*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *P : ImmutablePasses)
809*9880d681SAndroid Build Coastguard Worker     delete P;
810*9880d681SAndroid Build Coastguard Worker }
811*9880d681SAndroid Build Coastguard Worker 
812*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
813*9880d681SAndroid Build Coastguard Worker // PMDataManager implementation
814*9880d681SAndroid Build Coastguard Worker 
815*9880d681SAndroid Build Coastguard Worker /// Augement AvailableAnalysis by adding analysis made available by pass P.
recordAvailableAnalysis(Pass * P)816*9880d681SAndroid Build Coastguard Worker void PMDataManager::recordAvailableAnalysis(Pass *P) {
817*9880d681SAndroid Build Coastguard Worker   AnalysisID PI = P->getPassID();
818*9880d681SAndroid Build Coastguard Worker 
819*9880d681SAndroid Build Coastguard Worker   AvailableAnalysis[PI] = P;
820*9880d681SAndroid Build Coastguard Worker 
821*9880d681SAndroid Build Coastguard Worker   assert(!AvailableAnalysis.empty());
822*9880d681SAndroid Build Coastguard Worker 
823*9880d681SAndroid Build Coastguard Worker   // This pass is the current implementation of all of the interfaces it
824*9880d681SAndroid Build Coastguard Worker   // implements as well.
825*9880d681SAndroid Build Coastguard Worker   const PassInfo *PInf = TPM->findAnalysisPassInfo(PI);
826*9880d681SAndroid Build Coastguard Worker   if (!PInf) return;
827*9880d681SAndroid Build Coastguard Worker   const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented();
828*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = II.size(); i != e; ++i)
829*9880d681SAndroid Build Coastguard Worker     AvailableAnalysis[II[i]->getTypeInfo()] = P;
830*9880d681SAndroid Build Coastguard Worker }
831*9880d681SAndroid Build Coastguard Worker 
832*9880d681SAndroid Build Coastguard Worker // Return true if P preserves high level analysis used by other
833*9880d681SAndroid Build Coastguard Worker // passes managed by this manager
preserveHigherLevelAnalysis(Pass * P)834*9880d681SAndroid Build Coastguard Worker bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
835*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
836*9880d681SAndroid Build Coastguard Worker   if (AnUsage->getPreservesAll())
837*9880d681SAndroid Build Coastguard Worker     return true;
838*9880d681SAndroid Build Coastguard Worker 
839*9880d681SAndroid Build Coastguard Worker   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
840*9880d681SAndroid Build Coastguard Worker   for (SmallVectorImpl<Pass *>::iterator I = HigherLevelAnalysis.begin(),
841*9880d681SAndroid Build Coastguard Worker          E = HigherLevelAnalysis.end(); I  != E; ++I) {
842*9880d681SAndroid Build Coastguard Worker     Pass *P1 = *I;
843*9880d681SAndroid Build Coastguard Worker     if (P1->getAsImmutablePass() == nullptr &&
844*9880d681SAndroid Build Coastguard Worker         std::find(PreservedSet.begin(), PreservedSet.end(),
845*9880d681SAndroid Build Coastguard Worker                   P1->getPassID()) ==
846*9880d681SAndroid Build Coastguard Worker            PreservedSet.end())
847*9880d681SAndroid Build Coastguard Worker       return false;
848*9880d681SAndroid Build Coastguard Worker   }
849*9880d681SAndroid Build Coastguard Worker 
850*9880d681SAndroid Build Coastguard Worker   return true;
851*9880d681SAndroid Build Coastguard Worker }
852*9880d681SAndroid Build Coastguard Worker 
853*9880d681SAndroid Build Coastguard Worker /// verifyPreservedAnalysis -- Verify analysis preserved by pass P.
verifyPreservedAnalysis(Pass * P)854*9880d681SAndroid Build Coastguard Worker void PMDataManager::verifyPreservedAnalysis(Pass *P) {
855*9880d681SAndroid Build Coastguard Worker   // Don't do this unless assertions are enabled.
856*9880d681SAndroid Build Coastguard Worker #ifdef NDEBUG
857*9880d681SAndroid Build Coastguard Worker   return;
858*9880d681SAndroid Build Coastguard Worker #endif
859*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
860*9880d681SAndroid Build Coastguard Worker   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
861*9880d681SAndroid Build Coastguard Worker 
862*9880d681SAndroid Build Coastguard Worker   // Verify preserved analysis
863*9880d681SAndroid Build Coastguard Worker   for (AnalysisUsage::VectorType::const_iterator I = PreservedSet.begin(),
864*9880d681SAndroid Build Coastguard Worker          E = PreservedSet.end(); I != E; ++I) {
865*9880d681SAndroid Build Coastguard Worker     AnalysisID AID = *I;
866*9880d681SAndroid Build Coastguard Worker     if (Pass *AP = findAnalysisPass(AID, true)) {
867*9880d681SAndroid Build Coastguard Worker       TimeRegion PassTimer(getPassTimer(AP));
868*9880d681SAndroid Build Coastguard Worker       AP->verifyAnalysis();
869*9880d681SAndroid Build Coastguard Worker     }
870*9880d681SAndroid Build Coastguard Worker   }
871*9880d681SAndroid Build Coastguard Worker }
872*9880d681SAndroid Build Coastguard Worker 
873*9880d681SAndroid Build Coastguard Worker /// Remove Analysis not preserved by Pass P
removeNotPreservedAnalysis(Pass * P)874*9880d681SAndroid Build Coastguard Worker void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
875*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
876*9880d681SAndroid Build Coastguard Worker   if (AnUsage->getPreservesAll())
877*9880d681SAndroid Build Coastguard Worker     return;
878*9880d681SAndroid Build Coastguard Worker 
879*9880d681SAndroid Build Coastguard Worker   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
880*9880d681SAndroid Build Coastguard Worker   for (DenseMap<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
881*9880d681SAndroid Build Coastguard Worker          E = AvailableAnalysis.end(); I != E; ) {
882*9880d681SAndroid Build Coastguard Worker     DenseMap<AnalysisID, Pass*>::iterator Info = I++;
883*9880d681SAndroid Build Coastguard Worker     if (Info->second->getAsImmutablePass() == nullptr &&
884*9880d681SAndroid Build Coastguard Worker         std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
885*9880d681SAndroid Build Coastguard Worker         PreservedSet.end()) {
886*9880d681SAndroid Build Coastguard Worker       // Remove this analysis
887*9880d681SAndroid Build Coastguard Worker       if (PassDebugging >= Details) {
888*9880d681SAndroid Build Coastguard Worker         Pass *S = Info->second;
889*9880d681SAndroid Build Coastguard Worker         dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
890*9880d681SAndroid Build Coastguard Worker         dbgs() << S->getPassName() << "'\n";
891*9880d681SAndroid Build Coastguard Worker       }
892*9880d681SAndroid Build Coastguard Worker       AvailableAnalysis.erase(Info);
893*9880d681SAndroid Build Coastguard Worker     }
894*9880d681SAndroid Build Coastguard Worker   }
895*9880d681SAndroid Build Coastguard Worker 
896*9880d681SAndroid Build Coastguard Worker   // Check inherited analysis also. If P is not preserving analysis
897*9880d681SAndroid Build Coastguard Worker   // provided by parent manager then remove it here.
898*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < PMT_Last; ++Index) {
899*9880d681SAndroid Build Coastguard Worker 
900*9880d681SAndroid Build Coastguard Worker     if (!InheritedAnalysis[Index])
901*9880d681SAndroid Build Coastguard Worker       continue;
902*9880d681SAndroid Build Coastguard Worker 
903*9880d681SAndroid Build Coastguard Worker     for (DenseMap<AnalysisID, Pass*>::iterator
904*9880d681SAndroid Build Coastguard Worker            I = InheritedAnalysis[Index]->begin(),
905*9880d681SAndroid Build Coastguard Worker            E = InheritedAnalysis[Index]->end(); I != E; ) {
906*9880d681SAndroid Build Coastguard Worker       DenseMap<AnalysisID, Pass *>::iterator Info = I++;
907*9880d681SAndroid Build Coastguard Worker       if (Info->second->getAsImmutablePass() == nullptr &&
908*9880d681SAndroid Build Coastguard Worker           std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
909*9880d681SAndroid Build Coastguard Worker              PreservedSet.end()) {
910*9880d681SAndroid Build Coastguard Worker         // Remove this analysis
911*9880d681SAndroid Build Coastguard Worker         if (PassDebugging >= Details) {
912*9880d681SAndroid Build Coastguard Worker           Pass *S = Info->second;
913*9880d681SAndroid Build Coastguard Worker           dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
914*9880d681SAndroid Build Coastguard Worker           dbgs() << S->getPassName() << "'\n";
915*9880d681SAndroid Build Coastguard Worker         }
916*9880d681SAndroid Build Coastguard Worker         InheritedAnalysis[Index]->erase(Info);
917*9880d681SAndroid Build Coastguard Worker       }
918*9880d681SAndroid Build Coastguard Worker     }
919*9880d681SAndroid Build Coastguard Worker   }
920*9880d681SAndroid Build Coastguard Worker }
921*9880d681SAndroid Build Coastguard Worker 
922*9880d681SAndroid Build Coastguard Worker /// Remove analysis passes that are not used any longer
removeDeadPasses(Pass * P,StringRef Msg,enum PassDebuggingString DBG_STR)923*9880d681SAndroid Build Coastguard Worker void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
924*9880d681SAndroid Build Coastguard Worker                                      enum PassDebuggingString DBG_STR) {
925*9880d681SAndroid Build Coastguard Worker 
926*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 12> DeadPasses;
927*9880d681SAndroid Build Coastguard Worker 
928*9880d681SAndroid Build Coastguard Worker   // If this is a on the fly manager then it does not have TPM.
929*9880d681SAndroid Build Coastguard Worker   if (!TPM)
930*9880d681SAndroid Build Coastguard Worker     return;
931*9880d681SAndroid Build Coastguard Worker 
932*9880d681SAndroid Build Coastguard Worker   TPM->collectLastUses(DeadPasses, P);
933*9880d681SAndroid Build Coastguard Worker 
934*9880d681SAndroid Build Coastguard Worker   if (PassDebugging >= Details && !DeadPasses.empty()) {
935*9880d681SAndroid Build Coastguard Worker     dbgs() << " -*- '" <<  P->getPassName();
936*9880d681SAndroid Build Coastguard Worker     dbgs() << "' is the last user of following pass instances.";
937*9880d681SAndroid Build Coastguard Worker     dbgs() << " Free these instances\n";
938*9880d681SAndroid Build Coastguard Worker   }
939*9880d681SAndroid Build Coastguard Worker 
940*9880d681SAndroid Build Coastguard Worker   for (SmallVectorImpl<Pass *>::iterator I = DeadPasses.begin(),
941*9880d681SAndroid Build Coastguard Worker          E = DeadPasses.end(); I != E; ++I)
942*9880d681SAndroid Build Coastguard Worker     freePass(*I, Msg, DBG_STR);
943*9880d681SAndroid Build Coastguard Worker }
944*9880d681SAndroid Build Coastguard Worker 
freePass(Pass * P,StringRef Msg,enum PassDebuggingString DBG_STR)945*9880d681SAndroid Build Coastguard Worker void PMDataManager::freePass(Pass *P, StringRef Msg,
946*9880d681SAndroid Build Coastguard Worker                              enum PassDebuggingString DBG_STR) {
947*9880d681SAndroid Build Coastguard Worker   dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
948*9880d681SAndroid Build Coastguard Worker 
949*9880d681SAndroid Build Coastguard Worker   {
950*9880d681SAndroid Build Coastguard Worker     // If the pass crashes releasing memory, remember this.
951*9880d681SAndroid Build Coastguard Worker     PassManagerPrettyStackEntry X(P);
952*9880d681SAndroid Build Coastguard Worker     TimeRegion PassTimer(getPassTimer(P));
953*9880d681SAndroid Build Coastguard Worker 
954*9880d681SAndroid Build Coastguard Worker     P->releaseMemory();
955*9880d681SAndroid Build Coastguard Worker   }
956*9880d681SAndroid Build Coastguard Worker 
957*9880d681SAndroid Build Coastguard Worker   AnalysisID PI = P->getPassID();
958*9880d681SAndroid Build Coastguard Worker   if (const PassInfo *PInf = TPM->findAnalysisPassInfo(PI)) {
959*9880d681SAndroid Build Coastguard Worker     // Remove the pass itself (if it is not already removed).
960*9880d681SAndroid Build Coastguard Worker     AvailableAnalysis.erase(PI);
961*9880d681SAndroid Build Coastguard Worker 
962*9880d681SAndroid Build Coastguard Worker     // Remove all interfaces this pass implements, for which it is also
963*9880d681SAndroid Build Coastguard Worker     // listed as the available implementation.
964*9880d681SAndroid Build Coastguard Worker     const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented();
965*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, e = II.size(); i != e; ++i) {
966*9880d681SAndroid Build Coastguard Worker       DenseMap<AnalysisID, Pass*>::iterator Pos =
967*9880d681SAndroid Build Coastguard Worker         AvailableAnalysis.find(II[i]->getTypeInfo());
968*9880d681SAndroid Build Coastguard Worker       if (Pos != AvailableAnalysis.end() && Pos->second == P)
969*9880d681SAndroid Build Coastguard Worker         AvailableAnalysis.erase(Pos);
970*9880d681SAndroid Build Coastguard Worker     }
971*9880d681SAndroid Build Coastguard Worker   }
972*9880d681SAndroid Build Coastguard Worker }
973*9880d681SAndroid Build Coastguard Worker 
974*9880d681SAndroid Build Coastguard Worker /// Add pass P into the PassVector. Update
975*9880d681SAndroid Build Coastguard Worker /// AvailableAnalysis appropriately if ProcessAnalysis is true.
add(Pass * P,bool ProcessAnalysis)976*9880d681SAndroid Build Coastguard Worker void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
977*9880d681SAndroid Build Coastguard Worker   // This manager is going to manage pass P. Set up analysis resolver
978*9880d681SAndroid Build Coastguard Worker   // to connect them.
979*9880d681SAndroid Build Coastguard Worker   AnalysisResolver *AR = new AnalysisResolver(*this);
980*9880d681SAndroid Build Coastguard Worker   P->setResolver(AR);
981*9880d681SAndroid Build Coastguard Worker 
982*9880d681SAndroid Build Coastguard Worker   // If a FunctionPass F is the last user of ModulePass info M
983*9880d681SAndroid Build Coastguard Worker   // then the F's manager, not F, records itself as a last user of M.
984*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 12> TransferLastUses;
985*9880d681SAndroid Build Coastguard Worker 
986*9880d681SAndroid Build Coastguard Worker   if (!ProcessAnalysis) {
987*9880d681SAndroid Build Coastguard Worker     // Add pass
988*9880d681SAndroid Build Coastguard Worker     PassVector.push_back(P);
989*9880d681SAndroid Build Coastguard Worker     return;
990*9880d681SAndroid Build Coastguard Worker   }
991*9880d681SAndroid Build Coastguard Worker 
992*9880d681SAndroid Build Coastguard Worker   // At the moment, this pass is the last user of all required passes.
993*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 12> LastUses;
994*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 8> UsedPasses;
995*9880d681SAndroid Build Coastguard Worker   SmallVector<AnalysisID, 8> ReqAnalysisNotAvailable;
996*9880d681SAndroid Build Coastguard Worker 
997*9880d681SAndroid Build Coastguard Worker   unsigned PDepth = this->getDepth();
998*9880d681SAndroid Build Coastguard Worker 
999*9880d681SAndroid Build Coastguard Worker   collectRequiredAndUsedAnalyses(UsedPasses, ReqAnalysisNotAvailable, P);
1000*9880d681SAndroid Build Coastguard Worker   for (Pass *PUsed : UsedPasses) {
1001*9880d681SAndroid Build Coastguard Worker     unsigned RDepth = 0;
1002*9880d681SAndroid Build Coastguard Worker 
1003*9880d681SAndroid Build Coastguard Worker     assert(PUsed->getResolver() && "Analysis Resolver is not set");
1004*9880d681SAndroid Build Coastguard Worker     PMDataManager &DM = PUsed->getResolver()->getPMDataManager();
1005*9880d681SAndroid Build Coastguard Worker     RDepth = DM.getDepth();
1006*9880d681SAndroid Build Coastguard Worker 
1007*9880d681SAndroid Build Coastguard Worker     if (PDepth == RDepth)
1008*9880d681SAndroid Build Coastguard Worker       LastUses.push_back(PUsed);
1009*9880d681SAndroid Build Coastguard Worker     else if (PDepth > RDepth) {
1010*9880d681SAndroid Build Coastguard Worker       // Let the parent claim responsibility of last use
1011*9880d681SAndroid Build Coastguard Worker       TransferLastUses.push_back(PUsed);
1012*9880d681SAndroid Build Coastguard Worker       // Keep track of higher level analysis used by this manager.
1013*9880d681SAndroid Build Coastguard Worker       HigherLevelAnalysis.push_back(PUsed);
1014*9880d681SAndroid Build Coastguard Worker     } else
1015*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("Unable to accommodate Used Pass");
1016*9880d681SAndroid Build Coastguard Worker   }
1017*9880d681SAndroid Build Coastguard Worker 
1018*9880d681SAndroid Build Coastguard Worker   // Set P as P's last user until someone starts using P.
1019*9880d681SAndroid Build Coastguard Worker   // However, if P is a Pass Manager then it does not need
1020*9880d681SAndroid Build Coastguard Worker   // to record its last user.
1021*9880d681SAndroid Build Coastguard Worker   if (!P->getAsPMDataManager())
1022*9880d681SAndroid Build Coastguard Worker     LastUses.push_back(P);
1023*9880d681SAndroid Build Coastguard Worker   TPM->setLastUser(LastUses, P);
1024*9880d681SAndroid Build Coastguard Worker 
1025*9880d681SAndroid Build Coastguard Worker   if (!TransferLastUses.empty()) {
1026*9880d681SAndroid Build Coastguard Worker     Pass *My_PM = getAsPass();
1027*9880d681SAndroid Build Coastguard Worker     TPM->setLastUser(TransferLastUses, My_PM);
1028*9880d681SAndroid Build Coastguard Worker     TransferLastUses.clear();
1029*9880d681SAndroid Build Coastguard Worker   }
1030*9880d681SAndroid Build Coastguard Worker 
1031*9880d681SAndroid Build Coastguard Worker   // Now, take care of required analyses that are not available.
1032*9880d681SAndroid Build Coastguard Worker   for (AnalysisID ID : ReqAnalysisNotAvailable) {
1033*9880d681SAndroid Build Coastguard Worker     const PassInfo *PI = TPM->findAnalysisPassInfo(ID);
1034*9880d681SAndroid Build Coastguard Worker     Pass *AnalysisPass = PI->createPass();
1035*9880d681SAndroid Build Coastguard Worker     this->addLowerLevelRequiredPass(P, AnalysisPass);
1036*9880d681SAndroid Build Coastguard Worker   }
1037*9880d681SAndroid Build Coastguard Worker 
1038*9880d681SAndroid Build Coastguard Worker   // Take a note of analysis required and made available by this pass.
1039*9880d681SAndroid Build Coastguard Worker   // Remove the analysis not preserved by this pass
1040*9880d681SAndroid Build Coastguard Worker   removeNotPreservedAnalysis(P);
1041*9880d681SAndroid Build Coastguard Worker   recordAvailableAnalysis(P);
1042*9880d681SAndroid Build Coastguard Worker 
1043*9880d681SAndroid Build Coastguard Worker   // Add pass
1044*9880d681SAndroid Build Coastguard Worker   PassVector.push_back(P);
1045*9880d681SAndroid Build Coastguard Worker }
1046*9880d681SAndroid Build Coastguard Worker 
1047*9880d681SAndroid Build Coastguard Worker 
1048*9880d681SAndroid Build Coastguard Worker /// Populate UP with analysis pass that are used or required by
1049*9880d681SAndroid Build Coastguard Worker /// pass P and are available. Populate RP_NotAvail with analysis
1050*9880d681SAndroid Build Coastguard Worker /// pass that are required by pass P but are not available.
collectRequiredAndUsedAnalyses(SmallVectorImpl<Pass * > & UP,SmallVectorImpl<AnalysisID> & RP_NotAvail,Pass * P)1051*9880d681SAndroid Build Coastguard Worker void PMDataManager::collectRequiredAndUsedAnalyses(
1052*9880d681SAndroid Build Coastguard Worker     SmallVectorImpl<Pass *> &UP, SmallVectorImpl<AnalysisID> &RP_NotAvail,
1053*9880d681SAndroid Build Coastguard Worker     Pass *P) {
1054*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1055*9880d681SAndroid Build Coastguard Worker 
1056*9880d681SAndroid Build Coastguard Worker   for (const auto &UsedID : AnUsage->getUsedSet())
1057*9880d681SAndroid Build Coastguard Worker     if (Pass *AnalysisPass = findAnalysisPass(UsedID, true))
1058*9880d681SAndroid Build Coastguard Worker       UP.push_back(AnalysisPass);
1059*9880d681SAndroid Build Coastguard Worker 
1060*9880d681SAndroid Build Coastguard Worker   for (const auto &RequiredID : AnUsage->getRequiredSet())
1061*9880d681SAndroid Build Coastguard Worker     if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true))
1062*9880d681SAndroid Build Coastguard Worker       UP.push_back(AnalysisPass);
1063*9880d681SAndroid Build Coastguard Worker     else
1064*9880d681SAndroid Build Coastguard Worker       RP_NotAvail.push_back(RequiredID);
1065*9880d681SAndroid Build Coastguard Worker 
1066*9880d681SAndroid Build Coastguard Worker   for (const auto &RequiredID : AnUsage->getRequiredTransitiveSet())
1067*9880d681SAndroid Build Coastguard Worker     if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true))
1068*9880d681SAndroid Build Coastguard Worker       UP.push_back(AnalysisPass);
1069*9880d681SAndroid Build Coastguard Worker     else
1070*9880d681SAndroid Build Coastguard Worker       RP_NotAvail.push_back(RequiredID);
1071*9880d681SAndroid Build Coastguard Worker }
1072*9880d681SAndroid Build Coastguard Worker 
1073*9880d681SAndroid Build Coastguard Worker // All Required analyses should be available to the pass as it runs!  Here
1074*9880d681SAndroid Build Coastguard Worker // we fill in the AnalysisImpls member of the pass so that it can
1075*9880d681SAndroid Build Coastguard Worker // successfully use the getAnalysis() method to retrieve the
1076*9880d681SAndroid Build Coastguard Worker // implementations it needs.
1077*9880d681SAndroid Build Coastguard Worker //
initializeAnalysisImpl(Pass * P)1078*9880d681SAndroid Build Coastguard Worker void PMDataManager::initializeAnalysisImpl(Pass *P) {
1079*9880d681SAndroid Build Coastguard Worker   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1080*9880d681SAndroid Build Coastguard Worker 
1081*9880d681SAndroid Build Coastguard Worker   for (AnalysisUsage::VectorType::const_iterator
1082*9880d681SAndroid Build Coastguard Worker          I = AnUsage->getRequiredSet().begin(),
1083*9880d681SAndroid Build Coastguard Worker          E = AnUsage->getRequiredSet().end(); I != E; ++I) {
1084*9880d681SAndroid Build Coastguard Worker     Pass *Impl = findAnalysisPass(*I, true);
1085*9880d681SAndroid Build Coastguard Worker     if (!Impl)
1086*9880d681SAndroid Build Coastguard Worker       // This may be analysis pass that is initialized on the fly.
1087*9880d681SAndroid Build Coastguard Worker       // If that is not the case then it will raise an assert when it is used.
1088*9880d681SAndroid Build Coastguard Worker       continue;
1089*9880d681SAndroid Build Coastguard Worker     AnalysisResolver *AR = P->getResolver();
1090*9880d681SAndroid Build Coastguard Worker     assert(AR && "Analysis Resolver is not set");
1091*9880d681SAndroid Build Coastguard Worker     AR->addAnalysisImplsPair(*I, Impl);
1092*9880d681SAndroid Build Coastguard Worker   }
1093*9880d681SAndroid Build Coastguard Worker }
1094*9880d681SAndroid Build Coastguard Worker 
1095*9880d681SAndroid Build Coastguard Worker /// Find the pass that implements Analysis AID. If desired pass is not found
1096*9880d681SAndroid Build Coastguard Worker /// then return NULL.
findAnalysisPass(AnalysisID AID,bool SearchParent)1097*9880d681SAndroid Build Coastguard Worker Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
1098*9880d681SAndroid Build Coastguard Worker 
1099*9880d681SAndroid Build Coastguard Worker   // Check if AvailableAnalysis map has one entry.
1100*9880d681SAndroid Build Coastguard Worker   DenseMap<AnalysisID, Pass*>::const_iterator I =  AvailableAnalysis.find(AID);
1101*9880d681SAndroid Build Coastguard Worker 
1102*9880d681SAndroid Build Coastguard Worker   if (I != AvailableAnalysis.end())
1103*9880d681SAndroid Build Coastguard Worker     return I->second;
1104*9880d681SAndroid Build Coastguard Worker 
1105*9880d681SAndroid Build Coastguard Worker   // Search Parents through TopLevelManager
1106*9880d681SAndroid Build Coastguard Worker   if (SearchParent)
1107*9880d681SAndroid Build Coastguard Worker     return TPM->findAnalysisPass(AID);
1108*9880d681SAndroid Build Coastguard Worker 
1109*9880d681SAndroid Build Coastguard Worker   return nullptr;
1110*9880d681SAndroid Build Coastguard Worker }
1111*9880d681SAndroid Build Coastguard Worker 
1112*9880d681SAndroid Build Coastguard Worker // Print list of passes that are last used by P.
dumpLastUses(Pass * P,unsigned Offset) const1113*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
1114*9880d681SAndroid Build Coastguard Worker 
1115*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 12> LUses;
1116*9880d681SAndroid Build Coastguard Worker 
1117*9880d681SAndroid Build Coastguard Worker   // If this is a on the fly manager then it does not have TPM.
1118*9880d681SAndroid Build Coastguard Worker   if (!TPM)
1119*9880d681SAndroid Build Coastguard Worker     return;
1120*9880d681SAndroid Build Coastguard Worker 
1121*9880d681SAndroid Build Coastguard Worker   TPM->collectLastUses(LUses, P);
1122*9880d681SAndroid Build Coastguard Worker 
1123*9880d681SAndroid Build Coastguard Worker   for (SmallVectorImpl<Pass *>::iterator I = LUses.begin(),
1124*9880d681SAndroid Build Coastguard Worker          E = LUses.end(); I != E; ++I) {
1125*9880d681SAndroid Build Coastguard Worker     dbgs() << "--" << std::string(Offset*2, ' ');
1126*9880d681SAndroid Build Coastguard Worker     (*I)->dumpPassStructure(0);
1127*9880d681SAndroid Build Coastguard Worker   }
1128*9880d681SAndroid Build Coastguard Worker }
1129*9880d681SAndroid Build Coastguard Worker 
dumpPassArguments() const1130*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpPassArguments() const {
1131*9880d681SAndroid Build Coastguard Worker   for (SmallVectorImpl<Pass *>::const_iterator I = PassVector.begin(),
1132*9880d681SAndroid Build Coastguard Worker         E = PassVector.end(); I != E; ++I) {
1133*9880d681SAndroid Build Coastguard Worker     if (PMDataManager *PMD = (*I)->getAsPMDataManager())
1134*9880d681SAndroid Build Coastguard Worker       PMD->dumpPassArguments();
1135*9880d681SAndroid Build Coastguard Worker     else
1136*9880d681SAndroid Build Coastguard Worker       if (const PassInfo *PI =
1137*9880d681SAndroid Build Coastguard Worker             TPM->findAnalysisPassInfo((*I)->getPassID()))
1138*9880d681SAndroid Build Coastguard Worker         if (!PI->isAnalysisGroup())
1139*9880d681SAndroid Build Coastguard Worker           dbgs() << " -" << PI->getPassArgument();
1140*9880d681SAndroid Build Coastguard Worker   }
1141*9880d681SAndroid Build Coastguard Worker }
1142*9880d681SAndroid Build Coastguard Worker 
dumpPassInfo(Pass * P,enum PassDebuggingString S1,enum PassDebuggingString S2,StringRef Msg)1143*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
1144*9880d681SAndroid Build Coastguard Worker                                  enum PassDebuggingString S2,
1145*9880d681SAndroid Build Coastguard Worker                                  StringRef Msg) {
1146*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Executions)
1147*9880d681SAndroid Build Coastguard Worker     return;
1148*9880d681SAndroid Build Coastguard Worker   dbgs() << "[" << sys::TimeValue::now().str() << "] " << (void *)this
1149*9880d681SAndroid Build Coastguard Worker          << std::string(getDepth() * 2 + 1, ' ');
1150*9880d681SAndroid Build Coastguard Worker   switch (S1) {
1151*9880d681SAndroid Build Coastguard Worker   case EXECUTION_MSG:
1152*9880d681SAndroid Build Coastguard Worker     dbgs() << "Executing Pass '" << P->getPassName();
1153*9880d681SAndroid Build Coastguard Worker     break;
1154*9880d681SAndroid Build Coastguard Worker   case MODIFICATION_MSG:
1155*9880d681SAndroid Build Coastguard Worker     dbgs() << "Made Modification '" << P->getPassName();
1156*9880d681SAndroid Build Coastguard Worker     break;
1157*9880d681SAndroid Build Coastguard Worker   case FREEING_MSG:
1158*9880d681SAndroid Build Coastguard Worker     dbgs() << " Freeing Pass '" << P->getPassName();
1159*9880d681SAndroid Build Coastguard Worker     break;
1160*9880d681SAndroid Build Coastguard Worker   default:
1161*9880d681SAndroid Build Coastguard Worker     break;
1162*9880d681SAndroid Build Coastguard Worker   }
1163*9880d681SAndroid Build Coastguard Worker   switch (S2) {
1164*9880d681SAndroid Build Coastguard Worker   case ON_BASICBLOCK_MSG:
1165*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on BasicBlock '" << Msg << "'...\n";
1166*9880d681SAndroid Build Coastguard Worker     break;
1167*9880d681SAndroid Build Coastguard Worker   case ON_FUNCTION_MSG:
1168*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on Function '" << Msg << "'...\n";
1169*9880d681SAndroid Build Coastguard Worker     break;
1170*9880d681SAndroid Build Coastguard Worker   case ON_MODULE_MSG:
1171*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on Module '"  << Msg << "'...\n";
1172*9880d681SAndroid Build Coastguard Worker     break;
1173*9880d681SAndroid Build Coastguard Worker   case ON_REGION_MSG:
1174*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on Region '"  << Msg << "'...\n";
1175*9880d681SAndroid Build Coastguard Worker     break;
1176*9880d681SAndroid Build Coastguard Worker   case ON_LOOP_MSG:
1177*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on Loop '" << Msg << "'...\n";
1178*9880d681SAndroid Build Coastguard Worker     break;
1179*9880d681SAndroid Build Coastguard Worker   case ON_CG_MSG:
1180*9880d681SAndroid Build Coastguard Worker     dbgs() << "' on Call Graph Nodes '" << Msg << "'...\n";
1181*9880d681SAndroid Build Coastguard Worker     break;
1182*9880d681SAndroid Build Coastguard Worker   default:
1183*9880d681SAndroid Build Coastguard Worker     break;
1184*9880d681SAndroid Build Coastguard Worker   }
1185*9880d681SAndroid Build Coastguard Worker }
1186*9880d681SAndroid Build Coastguard Worker 
dumpRequiredSet(const Pass * P) const1187*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpRequiredSet(const Pass *P) const {
1188*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Details)
1189*9880d681SAndroid Build Coastguard Worker     return;
1190*9880d681SAndroid Build Coastguard Worker 
1191*9880d681SAndroid Build Coastguard Worker   AnalysisUsage analysisUsage;
1192*9880d681SAndroid Build Coastguard Worker   P->getAnalysisUsage(analysisUsage);
1193*9880d681SAndroid Build Coastguard Worker   dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet());
1194*9880d681SAndroid Build Coastguard Worker }
1195*9880d681SAndroid Build Coastguard Worker 
dumpPreservedSet(const Pass * P) const1196*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpPreservedSet(const Pass *P) const {
1197*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Details)
1198*9880d681SAndroid Build Coastguard Worker     return;
1199*9880d681SAndroid Build Coastguard Worker 
1200*9880d681SAndroid Build Coastguard Worker   AnalysisUsage analysisUsage;
1201*9880d681SAndroid Build Coastguard Worker   P->getAnalysisUsage(analysisUsage);
1202*9880d681SAndroid Build Coastguard Worker   dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet());
1203*9880d681SAndroid Build Coastguard Worker }
1204*9880d681SAndroid Build Coastguard Worker 
dumpUsedSet(const Pass * P) const1205*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpUsedSet(const Pass *P) const {
1206*9880d681SAndroid Build Coastguard Worker   if (PassDebugging < Details)
1207*9880d681SAndroid Build Coastguard Worker     return;
1208*9880d681SAndroid Build Coastguard Worker 
1209*9880d681SAndroid Build Coastguard Worker   AnalysisUsage analysisUsage;
1210*9880d681SAndroid Build Coastguard Worker   P->getAnalysisUsage(analysisUsage);
1211*9880d681SAndroid Build Coastguard Worker   dumpAnalysisUsage("Used", P, analysisUsage.getUsedSet());
1212*9880d681SAndroid Build Coastguard Worker }
1213*9880d681SAndroid Build Coastguard Worker 
dumpAnalysisUsage(StringRef Msg,const Pass * P,const AnalysisUsage::VectorType & Set) const1214*9880d681SAndroid Build Coastguard Worker void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,
1215*9880d681SAndroid Build Coastguard Worker                                    const AnalysisUsage::VectorType &Set) const {
1216*9880d681SAndroid Build Coastguard Worker   assert(PassDebugging >= Details);
1217*9880d681SAndroid Build Coastguard Worker   if (Set.empty())
1218*9880d681SAndroid Build Coastguard Worker     return;
1219*9880d681SAndroid Build Coastguard Worker   dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
1220*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i != Set.size(); ++i) {
1221*9880d681SAndroid Build Coastguard Worker     if (i) dbgs() << ',';
1222*9880d681SAndroid Build Coastguard Worker     const PassInfo *PInf = TPM->findAnalysisPassInfo(Set[i]);
1223*9880d681SAndroid Build Coastguard Worker     if (!PInf) {
1224*9880d681SAndroid Build Coastguard Worker       // Some preserved passes, such as AliasAnalysis, may not be initialized by
1225*9880d681SAndroid Build Coastguard Worker       // all drivers.
1226*9880d681SAndroid Build Coastguard Worker       dbgs() << " Uninitialized Pass";
1227*9880d681SAndroid Build Coastguard Worker       continue;
1228*9880d681SAndroid Build Coastguard Worker     }
1229*9880d681SAndroid Build Coastguard Worker     dbgs() << ' ' << PInf->getPassName();
1230*9880d681SAndroid Build Coastguard Worker   }
1231*9880d681SAndroid Build Coastguard Worker   dbgs() << '\n';
1232*9880d681SAndroid Build Coastguard Worker }
1233*9880d681SAndroid Build Coastguard Worker 
1234*9880d681SAndroid Build Coastguard Worker /// Add RequiredPass into list of lower level passes required by pass P.
1235*9880d681SAndroid Build Coastguard Worker /// RequiredPass is run on the fly by Pass Manager when P requests it
1236*9880d681SAndroid Build Coastguard Worker /// through getAnalysis interface.
1237*9880d681SAndroid Build Coastguard Worker /// This should be handled by specific pass manager.
addLowerLevelRequiredPass(Pass * P,Pass * RequiredPass)1238*9880d681SAndroid Build Coastguard Worker void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1239*9880d681SAndroid Build Coastguard Worker   if (TPM) {
1240*9880d681SAndroid Build Coastguard Worker     TPM->dumpArguments();
1241*9880d681SAndroid Build Coastguard Worker     TPM->dumpPasses();
1242*9880d681SAndroid Build Coastguard Worker   }
1243*9880d681SAndroid Build Coastguard Worker 
1244*9880d681SAndroid Build Coastguard Worker   // Module Level pass may required Function Level analysis info
1245*9880d681SAndroid Build Coastguard Worker   // (e.g. dominator info). Pass manager uses on the fly function pass manager
1246*9880d681SAndroid Build Coastguard Worker   // to provide this on demand. In that case, in Pass manager terminology,
1247*9880d681SAndroid Build Coastguard Worker   // module level pass is requiring lower level analysis info managed by
1248*9880d681SAndroid Build Coastguard Worker   // lower level pass manager.
1249*9880d681SAndroid Build Coastguard Worker 
1250*9880d681SAndroid Build Coastguard Worker   // When Pass manager is not able to order required analysis info, Pass manager
1251*9880d681SAndroid Build Coastguard Worker   // checks whether any lower level manager will be able to provide this
1252*9880d681SAndroid Build Coastguard Worker   // analysis info on demand or not.
1253*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
1254*9880d681SAndroid Build Coastguard Worker   dbgs() << "Unable to schedule '" << RequiredPass->getPassName();
1255*9880d681SAndroid Build Coastguard Worker   dbgs() << "' required by '" << P->getPassName() << "'\n";
1256*9880d681SAndroid Build Coastguard Worker #endif
1257*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unable to schedule pass");
1258*9880d681SAndroid Build Coastguard Worker }
1259*9880d681SAndroid Build Coastguard Worker 
getOnTheFlyPass(Pass * P,AnalysisID PI,Function & F)1260*9880d681SAndroid Build Coastguard Worker Pass *PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI, Function &F) {
1261*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unable to find on the fly pass");
1262*9880d681SAndroid Build Coastguard Worker }
1263*9880d681SAndroid Build Coastguard Worker 
1264*9880d681SAndroid Build Coastguard Worker // Destructor
~PMDataManager()1265*9880d681SAndroid Build Coastguard Worker PMDataManager::~PMDataManager() {
1266*9880d681SAndroid Build Coastguard Worker   for (SmallVectorImpl<Pass *>::iterator I = PassVector.begin(),
1267*9880d681SAndroid Build Coastguard Worker          E = PassVector.end(); I != E; ++I)
1268*9880d681SAndroid Build Coastguard Worker     delete *I;
1269*9880d681SAndroid Build Coastguard Worker }
1270*9880d681SAndroid Build Coastguard Worker 
1271*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1272*9880d681SAndroid Build Coastguard Worker // NOTE: Is this the right place to define this method ?
1273*9880d681SAndroid Build Coastguard Worker // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist.
getAnalysisIfAvailable(AnalysisID ID,bool dir) const1274*9880d681SAndroid Build Coastguard Worker Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID, bool dir) const {
1275*9880d681SAndroid Build Coastguard Worker   return PM.findAnalysisPass(ID, dir);
1276*9880d681SAndroid Build Coastguard Worker }
1277*9880d681SAndroid Build Coastguard Worker 
findImplPass(Pass * P,AnalysisID AnalysisPI,Function & F)1278*9880d681SAndroid Build Coastguard Worker Pass *AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI,
1279*9880d681SAndroid Build Coastguard Worker                                      Function &F) {
1280*9880d681SAndroid Build Coastguard Worker   return PM.getOnTheFlyPass(P, AnalysisPI, F);
1281*9880d681SAndroid Build Coastguard Worker }
1282*9880d681SAndroid Build Coastguard Worker 
1283*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1284*9880d681SAndroid Build Coastguard Worker // BBPassManager implementation
1285*9880d681SAndroid Build Coastguard Worker 
1286*9880d681SAndroid Build Coastguard Worker /// Execute all of the passes scheduled for execution by invoking
1287*9880d681SAndroid Build Coastguard Worker /// runOnBasicBlock method.  Keep track of whether any of the passes modifies
1288*9880d681SAndroid Build Coastguard Worker /// the function, and if so, return true.
runOnFunction(Function & F)1289*9880d681SAndroid Build Coastguard Worker bool BBPassManager::runOnFunction(Function &F) {
1290*9880d681SAndroid Build Coastguard Worker   if (F.isDeclaration())
1291*9880d681SAndroid Build Coastguard Worker     return false;
1292*9880d681SAndroid Build Coastguard Worker 
1293*9880d681SAndroid Build Coastguard Worker   bool Changed = doInitialization(F);
1294*9880d681SAndroid Build Coastguard Worker 
1295*9880d681SAndroid Build Coastguard Worker   for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
1296*9880d681SAndroid Build Coastguard Worker     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1297*9880d681SAndroid Build Coastguard Worker       BasicBlockPass *BP = getContainedPass(Index);
1298*9880d681SAndroid Build Coastguard Worker       bool LocalChanged = false;
1299*9880d681SAndroid Build Coastguard Worker 
1300*9880d681SAndroid Build Coastguard Worker       dumpPassInfo(BP, EXECUTION_MSG, ON_BASICBLOCK_MSG, I->getName());
1301*9880d681SAndroid Build Coastguard Worker       dumpRequiredSet(BP);
1302*9880d681SAndroid Build Coastguard Worker 
1303*9880d681SAndroid Build Coastguard Worker       initializeAnalysisImpl(BP);
1304*9880d681SAndroid Build Coastguard Worker 
1305*9880d681SAndroid Build Coastguard Worker       {
1306*9880d681SAndroid Build Coastguard Worker         // If the pass crashes, remember this.
1307*9880d681SAndroid Build Coastguard Worker         PassManagerPrettyStackEntry X(BP, *I);
1308*9880d681SAndroid Build Coastguard Worker         TimeRegion PassTimer(getPassTimer(BP));
1309*9880d681SAndroid Build Coastguard Worker 
1310*9880d681SAndroid Build Coastguard Worker         LocalChanged |= BP->runOnBasicBlock(*I);
1311*9880d681SAndroid Build Coastguard Worker       }
1312*9880d681SAndroid Build Coastguard Worker 
1313*9880d681SAndroid Build Coastguard Worker       Changed |= LocalChanged;
1314*9880d681SAndroid Build Coastguard Worker       if (LocalChanged)
1315*9880d681SAndroid Build Coastguard Worker         dumpPassInfo(BP, MODIFICATION_MSG, ON_BASICBLOCK_MSG,
1316*9880d681SAndroid Build Coastguard Worker                      I->getName());
1317*9880d681SAndroid Build Coastguard Worker       dumpPreservedSet(BP);
1318*9880d681SAndroid Build Coastguard Worker       dumpUsedSet(BP);
1319*9880d681SAndroid Build Coastguard Worker 
1320*9880d681SAndroid Build Coastguard Worker       verifyPreservedAnalysis(BP);
1321*9880d681SAndroid Build Coastguard Worker       removeNotPreservedAnalysis(BP);
1322*9880d681SAndroid Build Coastguard Worker       recordAvailableAnalysis(BP);
1323*9880d681SAndroid Build Coastguard Worker       removeDeadPasses(BP, I->getName(), ON_BASICBLOCK_MSG);
1324*9880d681SAndroid Build Coastguard Worker     }
1325*9880d681SAndroid Build Coastguard Worker 
1326*9880d681SAndroid Build Coastguard Worker   return doFinalization(F) || Changed;
1327*9880d681SAndroid Build Coastguard Worker }
1328*9880d681SAndroid Build Coastguard Worker 
1329*9880d681SAndroid Build Coastguard Worker // Implement doInitialization and doFinalization
doInitialization(Module & M)1330*9880d681SAndroid Build Coastguard Worker bool BBPassManager::doInitialization(Module &M) {
1331*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1332*9880d681SAndroid Build Coastguard Worker 
1333*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1334*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doInitialization(M);
1335*9880d681SAndroid Build Coastguard Worker 
1336*9880d681SAndroid Build Coastguard Worker   return Changed;
1337*9880d681SAndroid Build Coastguard Worker }
1338*9880d681SAndroid Build Coastguard Worker 
doFinalization(Module & M)1339*9880d681SAndroid Build Coastguard Worker bool BBPassManager::doFinalization(Module &M) {
1340*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1341*9880d681SAndroid Build Coastguard Worker 
1342*9880d681SAndroid Build Coastguard Worker   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1343*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doFinalization(M);
1344*9880d681SAndroid Build Coastguard Worker 
1345*9880d681SAndroid Build Coastguard Worker   return Changed;
1346*9880d681SAndroid Build Coastguard Worker }
1347*9880d681SAndroid Build Coastguard Worker 
doInitialization(Function & F)1348*9880d681SAndroid Build Coastguard Worker bool BBPassManager::doInitialization(Function &F) {
1349*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1350*9880d681SAndroid Build Coastguard Worker 
1351*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1352*9880d681SAndroid Build Coastguard Worker     BasicBlockPass *BP = getContainedPass(Index);
1353*9880d681SAndroid Build Coastguard Worker     Changed |= BP->doInitialization(F);
1354*9880d681SAndroid Build Coastguard Worker   }
1355*9880d681SAndroid Build Coastguard Worker 
1356*9880d681SAndroid Build Coastguard Worker   return Changed;
1357*9880d681SAndroid Build Coastguard Worker }
1358*9880d681SAndroid Build Coastguard Worker 
doFinalization(Function & F)1359*9880d681SAndroid Build Coastguard Worker bool BBPassManager::doFinalization(Function &F) {
1360*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1361*9880d681SAndroid Build Coastguard Worker 
1362*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1363*9880d681SAndroid Build Coastguard Worker     BasicBlockPass *BP = getContainedPass(Index);
1364*9880d681SAndroid Build Coastguard Worker     Changed |= BP->doFinalization(F);
1365*9880d681SAndroid Build Coastguard Worker   }
1366*9880d681SAndroid Build Coastguard Worker 
1367*9880d681SAndroid Build Coastguard Worker   return Changed;
1368*9880d681SAndroid Build Coastguard Worker }
1369*9880d681SAndroid Build Coastguard Worker 
1370*9880d681SAndroid Build Coastguard Worker 
1371*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1372*9880d681SAndroid Build Coastguard Worker // FunctionPassManager implementation
1373*9880d681SAndroid Build Coastguard Worker 
1374*9880d681SAndroid Build Coastguard Worker /// Create new Function pass manager
FunctionPassManager(Module * m)1375*9880d681SAndroid Build Coastguard Worker FunctionPassManager::FunctionPassManager(Module *m) : M(m) {
1376*9880d681SAndroid Build Coastguard Worker   FPM = new FunctionPassManagerImpl();
1377*9880d681SAndroid Build Coastguard Worker   // FPM is the top level manager.
1378*9880d681SAndroid Build Coastguard Worker   FPM->setTopLevelManager(FPM);
1379*9880d681SAndroid Build Coastguard Worker 
1380*9880d681SAndroid Build Coastguard Worker   AnalysisResolver *AR = new AnalysisResolver(*FPM);
1381*9880d681SAndroid Build Coastguard Worker   FPM->setResolver(AR);
1382*9880d681SAndroid Build Coastguard Worker }
1383*9880d681SAndroid Build Coastguard Worker 
~FunctionPassManager()1384*9880d681SAndroid Build Coastguard Worker FunctionPassManager::~FunctionPassManager() {
1385*9880d681SAndroid Build Coastguard Worker   delete FPM;
1386*9880d681SAndroid Build Coastguard Worker }
1387*9880d681SAndroid Build Coastguard Worker 
add(Pass * P)1388*9880d681SAndroid Build Coastguard Worker void FunctionPassManager::add(Pass *P) {
1389*9880d681SAndroid Build Coastguard Worker   FPM->add(P);
1390*9880d681SAndroid Build Coastguard Worker }
1391*9880d681SAndroid Build Coastguard Worker 
1392*9880d681SAndroid Build Coastguard Worker /// run - Execute all of the passes scheduled for execution.  Keep
1393*9880d681SAndroid Build Coastguard Worker /// track of whether any of the passes modifies the function, and if
1394*9880d681SAndroid Build Coastguard Worker /// so, return true.
1395*9880d681SAndroid Build Coastguard Worker ///
run(Function & F)1396*9880d681SAndroid Build Coastguard Worker bool FunctionPassManager::run(Function &F) {
1397*9880d681SAndroid Build Coastguard Worker   if (std::error_code EC = F.materialize())
1398*9880d681SAndroid Build Coastguard Worker     report_fatal_error("Error reading bitcode file: " + EC.message());
1399*9880d681SAndroid Build Coastguard Worker   return FPM->run(F);
1400*9880d681SAndroid Build Coastguard Worker }
1401*9880d681SAndroid Build Coastguard Worker 
1402*9880d681SAndroid Build Coastguard Worker 
1403*9880d681SAndroid Build Coastguard Worker /// doInitialization - Run all of the initializers for the function passes.
1404*9880d681SAndroid Build Coastguard Worker ///
doInitialization()1405*9880d681SAndroid Build Coastguard Worker bool FunctionPassManager::doInitialization() {
1406*9880d681SAndroid Build Coastguard Worker   return FPM->doInitialization(*M);
1407*9880d681SAndroid Build Coastguard Worker }
1408*9880d681SAndroid Build Coastguard Worker 
1409*9880d681SAndroid Build Coastguard Worker /// doFinalization - Run all of the finalizers for the function passes.
1410*9880d681SAndroid Build Coastguard Worker ///
doFinalization()1411*9880d681SAndroid Build Coastguard Worker bool FunctionPassManager::doFinalization() {
1412*9880d681SAndroid Build Coastguard Worker   return FPM->doFinalization(*M);
1413*9880d681SAndroid Build Coastguard Worker }
1414*9880d681SAndroid Build Coastguard Worker 
1415*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1416*9880d681SAndroid Build Coastguard Worker // FunctionPassManagerImpl implementation
1417*9880d681SAndroid Build Coastguard Worker //
doInitialization(Module & M)1418*9880d681SAndroid Build Coastguard Worker bool FunctionPassManagerImpl::doInitialization(Module &M) {
1419*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1420*9880d681SAndroid Build Coastguard Worker 
1421*9880d681SAndroid Build Coastguard Worker   dumpArguments();
1422*9880d681SAndroid Build Coastguard Worker   dumpPasses();
1423*9880d681SAndroid Build Coastguard Worker 
1424*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *ImPass : getImmutablePasses())
1425*9880d681SAndroid Build Coastguard Worker     Changed |= ImPass->doInitialization(M);
1426*9880d681SAndroid Build Coastguard Worker 
1427*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
1428*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedManager(Index)->doInitialization(M);
1429*9880d681SAndroid Build Coastguard Worker 
1430*9880d681SAndroid Build Coastguard Worker   return Changed;
1431*9880d681SAndroid Build Coastguard Worker }
1432*9880d681SAndroid Build Coastguard Worker 
doFinalization(Module & M)1433*9880d681SAndroid Build Coastguard Worker bool FunctionPassManagerImpl::doFinalization(Module &M) {
1434*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1435*9880d681SAndroid Build Coastguard Worker 
1436*9880d681SAndroid Build Coastguard Worker   for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index)
1437*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedManager(Index)->doFinalization(M);
1438*9880d681SAndroid Build Coastguard Worker 
1439*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *ImPass : getImmutablePasses())
1440*9880d681SAndroid Build Coastguard Worker     Changed |= ImPass->doFinalization(M);
1441*9880d681SAndroid Build Coastguard Worker 
1442*9880d681SAndroid Build Coastguard Worker   return Changed;
1443*9880d681SAndroid Build Coastguard Worker }
1444*9880d681SAndroid Build Coastguard Worker 
1445*9880d681SAndroid Build Coastguard Worker /// cleanup - After running all passes, clean up pass manager cache.
cleanup()1446*9880d681SAndroid Build Coastguard Worker void FPPassManager::cleanup() {
1447*9880d681SAndroid Build Coastguard Worker  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1448*9880d681SAndroid Build Coastguard Worker     FunctionPass *FP = getContainedPass(Index);
1449*9880d681SAndroid Build Coastguard Worker     AnalysisResolver *AR = FP->getResolver();
1450*9880d681SAndroid Build Coastguard Worker     assert(AR && "Analysis Resolver is not set");
1451*9880d681SAndroid Build Coastguard Worker     AR->clearAnalysisImpls();
1452*9880d681SAndroid Build Coastguard Worker  }
1453*9880d681SAndroid Build Coastguard Worker }
1454*9880d681SAndroid Build Coastguard Worker 
releaseMemoryOnTheFly()1455*9880d681SAndroid Build Coastguard Worker void FunctionPassManagerImpl::releaseMemoryOnTheFly() {
1456*9880d681SAndroid Build Coastguard Worker   if (!wasRun)
1457*9880d681SAndroid Build Coastguard Worker     return;
1458*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
1459*9880d681SAndroid Build Coastguard Worker     FPPassManager *FPPM = getContainedManager(Index);
1460*9880d681SAndroid Build Coastguard Worker     for (unsigned Index = 0; Index < FPPM->getNumContainedPasses(); ++Index) {
1461*9880d681SAndroid Build Coastguard Worker       FPPM->getContainedPass(Index)->releaseMemory();
1462*9880d681SAndroid Build Coastguard Worker     }
1463*9880d681SAndroid Build Coastguard Worker   }
1464*9880d681SAndroid Build Coastguard Worker   wasRun = false;
1465*9880d681SAndroid Build Coastguard Worker }
1466*9880d681SAndroid Build Coastguard Worker 
1467*9880d681SAndroid Build Coastguard Worker // Execute all the passes managed by this top level manager.
1468*9880d681SAndroid Build Coastguard Worker // Return true if any function is modified by a pass.
run(Function & F)1469*9880d681SAndroid Build Coastguard Worker bool FunctionPassManagerImpl::run(Function &F) {
1470*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1471*9880d681SAndroid Build Coastguard Worker   TimingInfo::createTheTimeInfo();
1472*9880d681SAndroid Build Coastguard Worker 
1473*9880d681SAndroid Build Coastguard Worker   initializeAllAnalysisInfo();
1474*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
1475*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedManager(Index)->runOnFunction(F);
1476*9880d681SAndroid Build Coastguard Worker     F.getContext().yield();
1477*9880d681SAndroid Build Coastguard Worker   }
1478*9880d681SAndroid Build Coastguard Worker 
1479*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
1480*9880d681SAndroid Build Coastguard Worker     getContainedManager(Index)->cleanup();
1481*9880d681SAndroid Build Coastguard Worker 
1482*9880d681SAndroid Build Coastguard Worker   wasRun = true;
1483*9880d681SAndroid Build Coastguard Worker   return Changed;
1484*9880d681SAndroid Build Coastguard Worker }
1485*9880d681SAndroid Build Coastguard Worker 
1486*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1487*9880d681SAndroid Build Coastguard Worker // FPPassManager implementation
1488*9880d681SAndroid Build Coastguard Worker 
1489*9880d681SAndroid Build Coastguard Worker char FPPassManager::ID = 0;
1490*9880d681SAndroid Build Coastguard Worker /// Print passes managed by this manager
dumpPassStructure(unsigned Offset)1491*9880d681SAndroid Build Coastguard Worker void FPPassManager::dumpPassStructure(unsigned Offset) {
1492*9880d681SAndroid Build Coastguard Worker   dbgs().indent(Offset*2) << "FunctionPass Manager\n";
1493*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1494*9880d681SAndroid Build Coastguard Worker     FunctionPass *FP = getContainedPass(Index);
1495*9880d681SAndroid Build Coastguard Worker     FP->dumpPassStructure(Offset + 1);
1496*9880d681SAndroid Build Coastguard Worker     dumpLastUses(FP, Offset+1);
1497*9880d681SAndroid Build Coastguard Worker   }
1498*9880d681SAndroid Build Coastguard Worker }
1499*9880d681SAndroid Build Coastguard Worker 
1500*9880d681SAndroid Build Coastguard Worker 
1501*9880d681SAndroid Build Coastguard Worker /// Execute all of the passes scheduled for execution by invoking
1502*9880d681SAndroid Build Coastguard Worker /// runOnFunction method.  Keep track of whether any of the passes modifies
1503*9880d681SAndroid Build Coastguard Worker /// the function, and if so, return true.
runOnFunction(Function & F)1504*9880d681SAndroid Build Coastguard Worker bool FPPassManager::runOnFunction(Function &F) {
1505*9880d681SAndroid Build Coastguard Worker   if (F.isDeclaration())
1506*9880d681SAndroid Build Coastguard Worker     return false;
1507*9880d681SAndroid Build Coastguard Worker 
1508*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1509*9880d681SAndroid Build Coastguard Worker 
1510*9880d681SAndroid Build Coastguard Worker   // Collect inherited analysis from Module level pass manager.
1511*9880d681SAndroid Build Coastguard Worker   populateInheritedAnalysis(TPM->activeStack);
1512*9880d681SAndroid Build Coastguard Worker 
1513*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1514*9880d681SAndroid Build Coastguard Worker     FunctionPass *FP = getContainedPass(Index);
1515*9880d681SAndroid Build Coastguard Worker     bool LocalChanged = false;
1516*9880d681SAndroid Build Coastguard Worker 
1517*9880d681SAndroid Build Coastguard Worker     dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName());
1518*9880d681SAndroid Build Coastguard Worker     dumpRequiredSet(FP);
1519*9880d681SAndroid Build Coastguard Worker 
1520*9880d681SAndroid Build Coastguard Worker     initializeAnalysisImpl(FP);
1521*9880d681SAndroid Build Coastguard Worker 
1522*9880d681SAndroid Build Coastguard Worker     {
1523*9880d681SAndroid Build Coastguard Worker       PassManagerPrettyStackEntry X(FP, F);
1524*9880d681SAndroid Build Coastguard Worker       TimeRegion PassTimer(getPassTimer(FP));
1525*9880d681SAndroid Build Coastguard Worker 
1526*9880d681SAndroid Build Coastguard Worker       LocalChanged |= FP->runOnFunction(F);
1527*9880d681SAndroid Build Coastguard Worker     }
1528*9880d681SAndroid Build Coastguard Worker 
1529*9880d681SAndroid Build Coastguard Worker     Changed |= LocalChanged;
1530*9880d681SAndroid Build Coastguard Worker     if (LocalChanged)
1531*9880d681SAndroid Build Coastguard Worker       dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName());
1532*9880d681SAndroid Build Coastguard Worker     dumpPreservedSet(FP);
1533*9880d681SAndroid Build Coastguard Worker     dumpUsedSet(FP);
1534*9880d681SAndroid Build Coastguard Worker 
1535*9880d681SAndroid Build Coastguard Worker     verifyPreservedAnalysis(FP);
1536*9880d681SAndroid Build Coastguard Worker     removeNotPreservedAnalysis(FP);
1537*9880d681SAndroid Build Coastguard Worker     recordAvailableAnalysis(FP);
1538*9880d681SAndroid Build Coastguard Worker     removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG);
1539*9880d681SAndroid Build Coastguard Worker   }
1540*9880d681SAndroid Build Coastguard Worker   return Changed;
1541*9880d681SAndroid Build Coastguard Worker }
1542*9880d681SAndroid Build Coastguard Worker 
runOnModule(Module & M)1543*9880d681SAndroid Build Coastguard Worker bool FPPassManager::runOnModule(Module &M) {
1544*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1545*9880d681SAndroid Build Coastguard Worker 
1546*9880d681SAndroid Build Coastguard Worker   for (Function &F : M)
1547*9880d681SAndroid Build Coastguard Worker     Changed |= runOnFunction(F);
1548*9880d681SAndroid Build Coastguard Worker 
1549*9880d681SAndroid Build Coastguard Worker   return Changed;
1550*9880d681SAndroid Build Coastguard Worker }
1551*9880d681SAndroid Build Coastguard Worker 
doInitialization(Module & M)1552*9880d681SAndroid Build Coastguard Worker bool FPPassManager::doInitialization(Module &M) {
1553*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1554*9880d681SAndroid Build Coastguard Worker 
1555*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1556*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doInitialization(M);
1557*9880d681SAndroid Build Coastguard Worker 
1558*9880d681SAndroid Build Coastguard Worker   return Changed;
1559*9880d681SAndroid Build Coastguard Worker }
1560*9880d681SAndroid Build Coastguard Worker 
doFinalization(Module & M)1561*9880d681SAndroid Build Coastguard Worker bool FPPassManager::doFinalization(Module &M) {
1562*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1563*9880d681SAndroid Build Coastguard Worker 
1564*9880d681SAndroid Build Coastguard Worker   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1565*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doFinalization(M);
1566*9880d681SAndroid Build Coastguard Worker 
1567*9880d681SAndroid Build Coastguard Worker   return Changed;
1568*9880d681SAndroid Build Coastguard Worker }
1569*9880d681SAndroid Build Coastguard Worker 
1570*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1571*9880d681SAndroid Build Coastguard Worker // MPPassManager implementation
1572*9880d681SAndroid Build Coastguard Worker 
1573*9880d681SAndroid Build Coastguard Worker /// Execute all of the passes scheduled for execution by invoking
1574*9880d681SAndroid Build Coastguard Worker /// runOnModule method.  Keep track of whether any of the passes modifies
1575*9880d681SAndroid Build Coastguard Worker /// the module, and if so, return true.
1576*9880d681SAndroid Build Coastguard Worker bool
runOnModule(Module & M)1577*9880d681SAndroid Build Coastguard Worker MPPassManager::runOnModule(Module &M) {
1578*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1579*9880d681SAndroid Build Coastguard Worker 
1580*9880d681SAndroid Build Coastguard Worker   // Initialize on-the-fly passes
1581*9880d681SAndroid Build Coastguard Worker   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1582*9880d681SAndroid Build Coastguard Worker     FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1583*9880d681SAndroid Build Coastguard Worker     Changed |= FPP->doInitialization(M);
1584*9880d681SAndroid Build Coastguard Worker   }
1585*9880d681SAndroid Build Coastguard Worker 
1586*9880d681SAndroid Build Coastguard Worker   // Initialize module passes
1587*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1588*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doInitialization(M);
1589*9880d681SAndroid Build Coastguard Worker 
1590*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1591*9880d681SAndroid Build Coastguard Worker     ModulePass *MP = getContainedPass(Index);
1592*9880d681SAndroid Build Coastguard Worker     bool LocalChanged = false;
1593*9880d681SAndroid Build Coastguard Worker 
1594*9880d681SAndroid Build Coastguard Worker     dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1595*9880d681SAndroid Build Coastguard Worker     dumpRequiredSet(MP);
1596*9880d681SAndroid Build Coastguard Worker 
1597*9880d681SAndroid Build Coastguard Worker     initializeAnalysisImpl(MP);
1598*9880d681SAndroid Build Coastguard Worker 
1599*9880d681SAndroid Build Coastguard Worker     {
1600*9880d681SAndroid Build Coastguard Worker       PassManagerPrettyStackEntry X(MP, M);
1601*9880d681SAndroid Build Coastguard Worker       TimeRegion PassTimer(getPassTimer(MP));
1602*9880d681SAndroid Build Coastguard Worker 
1603*9880d681SAndroid Build Coastguard Worker       LocalChanged |= MP->runOnModule(M);
1604*9880d681SAndroid Build Coastguard Worker     }
1605*9880d681SAndroid Build Coastguard Worker 
1606*9880d681SAndroid Build Coastguard Worker     Changed |= LocalChanged;
1607*9880d681SAndroid Build Coastguard Worker     if (LocalChanged)
1608*9880d681SAndroid Build Coastguard Worker       dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1609*9880d681SAndroid Build Coastguard Worker                    M.getModuleIdentifier());
1610*9880d681SAndroid Build Coastguard Worker     dumpPreservedSet(MP);
1611*9880d681SAndroid Build Coastguard Worker     dumpUsedSet(MP);
1612*9880d681SAndroid Build Coastguard Worker 
1613*9880d681SAndroid Build Coastguard Worker     verifyPreservedAnalysis(MP);
1614*9880d681SAndroid Build Coastguard Worker     removeNotPreservedAnalysis(MP);
1615*9880d681SAndroid Build Coastguard Worker     recordAvailableAnalysis(MP);
1616*9880d681SAndroid Build Coastguard Worker     removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1617*9880d681SAndroid Build Coastguard Worker   }
1618*9880d681SAndroid Build Coastguard Worker 
1619*9880d681SAndroid Build Coastguard Worker   // Finalize module passes
1620*9880d681SAndroid Build Coastguard Worker   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1621*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedPass(Index)->doFinalization(M);
1622*9880d681SAndroid Build Coastguard Worker 
1623*9880d681SAndroid Build Coastguard Worker   // Finalize on-the-fly passes
1624*9880d681SAndroid Build Coastguard Worker   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1625*9880d681SAndroid Build Coastguard Worker     FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1626*9880d681SAndroid Build Coastguard Worker     // We don't know when is the last time an on-the-fly pass is run,
1627*9880d681SAndroid Build Coastguard Worker     // so we need to releaseMemory / finalize here
1628*9880d681SAndroid Build Coastguard Worker     FPP->releaseMemoryOnTheFly();
1629*9880d681SAndroid Build Coastguard Worker     Changed |= FPP->doFinalization(M);
1630*9880d681SAndroid Build Coastguard Worker   }
1631*9880d681SAndroid Build Coastguard Worker 
1632*9880d681SAndroid Build Coastguard Worker   return Changed;
1633*9880d681SAndroid Build Coastguard Worker }
1634*9880d681SAndroid Build Coastguard Worker 
1635*9880d681SAndroid Build Coastguard Worker /// Add RequiredPass into list of lower level passes required by pass P.
1636*9880d681SAndroid Build Coastguard Worker /// RequiredPass is run on the fly by Pass Manager when P requests it
1637*9880d681SAndroid Build Coastguard Worker /// through getAnalysis interface.
addLowerLevelRequiredPass(Pass * P,Pass * RequiredPass)1638*9880d681SAndroid Build Coastguard Worker void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1639*9880d681SAndroid Build Coastguard Worker   assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1640*9880d681SAndroid Build Coastguard Worker          "Unable to handle Pass that requires lower level Analysis pass");
1641*9880d681SAndroid Build Coastguard Worker   assert((P->getPotentialPassManagerType() <
1642*9880d681SAndroid Build Coastguard Worker           RequiredPass->getPotentialPassManagerType()) &&
1643*9880d681SAndroid Build Coastguard Worker          "Unable to handle Pass that requires lower level Analysis pass");
1644*9880d681SAndroid Build Coastguard Worker   if (!RequiredPass)
1645*9880d681SAndroid Build Coastguard Worker     return;
1646*9880d681SAndroid Build Coastguard Worker 
1647*9880d681SAndroid Build Coastguard Worker   FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1648*9880d681SAndroid Build Coastguard Worker   if (!FPP) {
1649*9880d681SAndroid Build Coastguard Worker     FPP = new FunctionPassManagerImpl();
1650*9880d681SAndroid Build Coastguard Worker     // FPP is the top level manager.
1651*9880d681SAndroid Build Coastguard Worker     FPP->setTopLevelManager(FPP);
1652*9880d681SAndroid Build Coastguard Worker 
1653*9880d681SAndroid Build Coastguard Worker     OnTheFlyManagers[P] = FPP;
1654*9880d681SAndroid Build Coastguard Worker   }
1655*9880d681SAndroid Build Coastguard Worker   const PassInfo *RequiredPassPI =
1656*9880d681SAndroid Build Coastguard Worker       TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1657*9880d681SAndroid Build Coastguard Worker 
1658*9880d681SAndroid Build Coastguard Worker   Pass *FoundPass = nullptr;
1659*9880d681SAndroid Build Coastguard Worker   if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1660*9880d681SAndroid Build Coastguard Worker     FoundPass =
1661*9880d681SAndroid Build Coastguard Worker       ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1662*9880d681SAndroid Build Coastguard Worker   }
1663*9880d681SAndroid Build Coastguard Worker   if (!FoundPass) {
1664*9880d681SAndroid Build Coastguard Worker     FoundPass = RequiredPass;
1665*9880d681SAndroid Build Coastguard Worker     // This should be guaranteed to add RequiredPass to the passmanager given
1666*9880d681SAndroid Build Coastguard Worker     // that we checked for an available analysis above.
1667*9880d681SAndroid Build Coastguard Worker     FPP->add(RequiredPass);
1668*9880d681SAndroid Build Coastguard Worker   }
1669*9880d681SAndroid Build Coastguard Worker   // Register P as the last user of FoundPass or RequiredPass.
1670*9880d681SAndroid Build Coastguard Worker   SmallVector<Pass *, 1> LU;
1671*9880d681SAndroid Build Coastguard Worker   LU.push_back(FoundPass);
1672*9880d681SAndroid Build Coastguard Worker   FPP->setLastUser(LU,  P);
1673*9880d681SAndroid Build Coastguard Worker }
1674*9880d681SAndroid Build Coastguard Worker 
1675*9880d681SAndroid Build Coastguard Worker /// Return function pass corresponding to PassInfo PI, that is
1676*9880d681SAndroid Build Coastguard Worker /// required by module pass MP. Instantiate analysis pass, by using
1677*9880d681SAndroid Build Coastguard Worker /// its runOnFunction() for function F.
getOnTheFlyPass(Pass * MP,AnalysisID PI,Function & F)1678*9880d681SAndroid Build Coastguard Worker Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
1679*9880d681SAndroid Build Coastguard Worker   FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1680*9880d681SAndroid Build Coastguard Worker   assert(FPP && "Unable to find on the fly pass");
1681*9880d681SAndroid Build Coastguard Worker 
1682*9880d681SAndroid Build Coastguard Worker   FPP->releaseMemoryOnTheFly();
1683*9880d681SAndroid Build Coastguard Worker   FPP->run(F);
1684*9880d681SAndroid Build Coastguard Worker   return ((PMTopLevelManager*)FPP)->findAnalysisPass(PI);
1685*9880d681SAndroid Build Coastguard Worker }
1686*9880d681SAndroid Build Coastguard Worker 
1687*9880d681SAndroid Build Coastguard Worker 
1688*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1689*9880d681SAndroid Build Coastguard Worker // PassManagerImpl implementation
1690*9880d681SAndroid Build Coastguard Worker 
1691*9880d681SAndroid Build Coastguard Worker //
1692*9880d681SAndroid Build Coastguard Worker /// run - Execute all of the passes scheduled for execution.  Keep track of
1693*9880d681SAndroid Build Coastguard Worker /// whether any of the passes modifies the module, and if so, return true.
run(Module & M)1694*9880d681SAndroid Build Coastguard Worker bool PassManagerImpl::run(Module &M) {
1695*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
1696*9880d681SAndroid Build Coastguard Worker   TimingInfo::createTheTimeInfo();
1697*9880d681SAndroid Build Coastguard Worker 
1698*9880d681SAndroid Build Coastguard Worker   dumpArguments();
1699*9880d681SAndroid Build Coastguard Worker   dumpPasses();
1700*9880d681SAndroid Build Coastguard Worker 
1701*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *ImPass : getImmutablePasses())
1702*9880d681SAndroid Build Coastguard Worker     Changed |= ImPass->doInitialization(M);
1703*9880d681SAndroid Build Coastguard Worker 
1704*9880d681SAndroid Build Coastguard Worker   initializeAllAnalysisInfo();
1705*9880d681SAndroid Build Coastguard Worker   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
1706*9880d681SAndroid Build Coastguard Worker     Changed |= getContainedManager(Index)->runOnModule(M);
1707*9880d681SAndroid Build Coastguard Worker     M.getContext().yield();
1708*9880d681SAndroid Build Coastguard Worker   }
1709*9880d681SAndroid Build Coastguard Worker 
1710*9880d681SAndroid Build Coastguard Worker   for (ImmutablePass *ImPass : getImmutablePasses())
1711*9880d681SAndroid Build Coastguard Worker     Changed |= ImPass->doFinalization(M);
1712*9880d681SAndroid Build Coastguard Worker 
1713*9880d681SAndroid Build Coastguard Worker   return Changed;
1714*9880d681SAndroid Build Coastguard Worker }
1715*9880d681SAndroid Build Coastguard Worker 
1716*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1717*9880d681SAndroid Build Coastguard Worker // PassManager implementation
1718*9880d681SAndroid Build Coastguard Worker 
1719*9880d681SAndroid Build Coastguard Worker /// Create new pass manager
PassManager()1720*9880d681SAndroid Build Coastguard Worker PassManager::PassManager() {
1721*9880d681SAndroid Build Coastguard Worker   PM = new PassManagerImpl();
1722*9880d681SAndroid Build Coastguard Worker   // PM is the top level manager
1723*9880d681SAndroid Build Coastguard Worker   PM->setTopLevelManager(PM);
1724*9880d681SAndroid Build Coastguard Worker }
1725*9880d681SAndroid Build Coastguard Worker 
~PassManager()1726*9880d681SAndroid Build Coastguard Worker PassManager::~PassManager() {
1727*9880d681SAndroid Build Coastguard Worker   delete PM;
1728*9880d681SAndroid Build Coastguard Worker }
1729*9880d681SAndroid Build Coastguard Worker 
add(Pass * P)1730*9880d681SAndroid Build Coastguard Worker void PassManager::add(Pass *P) {
1731*9880d681SAndroid Build Coastguard Worker   PM->add(P);
1732*9880d681SAndroid Build Coastguard Worker }
1733*9880d681SAndroid Build Coastguard Worker 
1734*9880d681SAndroid Build Coastguard Worker /// run - Execute all of the passes scheduled for execution.  Keep track of
1735*9880d681SAndroid Build Coastguard Worker /// whether any of the passes modifies the module, and if so, return true.
run(Module & M)1736*9880d681SAndroid Build Coastguard Worker bool PassManager::run(Module &M) {
1737*9880d681SAndroid Build Coastguard Worker   return PM->run(M);
1738*9880d681SAndroid Build Coastguard Worker }
1739*9880d681SAndroid Build Coastguard Worker 
1740*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1741*9880d681SAndroid Build Coastguard Worker // TimingInfo implementation
1742*9880d681SAndroid Build Coastguard Worker 
1743*9880d681SAndroid Build Coastguard Worker bool llvm::TimePassesIsEnabled = false;
1744*9880d681SAndroid Build Coastguard Worker static cl::opt<bool,true>
1745*9880d681SAndroid Build Coastguard Worker EnableTiming("time-passes", cl::location(TimePassesIsEnabled),
1746*9880d681SAndroid Build Coastguard Worker             cl::desc("Time each pass, printing elapsed time for each on exit"));
1747*9880d681SAndroid Build Coastguard Worker 
1748*9880d681SAndroid Build Coastguard Worker // createTheTimeInfo - This method either initializes the TheTimeInfo pointer to
1749*9880d681SAndroid Build Coastguard Worker // a non-null value (if the -time-passes option is enabled) or it leaves it
1750*9880d681SAndroid Build Coastguard Worker // null.  It may be called multiple times.
createTheTimeInfo()1751*9880d681SAndroid Build Coastguard Worker void TimingInfo::createTheTimeInfo() {
1752*9880d681SAndroid Build Coastguard Worker   if (!TimePassesIsEnabled || TheTimeInfo) return;
1753*9880d681SAndroid Build Coastguard Worker 
1754*9880d681SAndroid Build Coastguard Worker   // Constructed the first time this is called, iff -time-passes is enabled.
1755*9880d681SAndroid Build Coastguard Worker   // This guarantees that the object will be constructed before static globals,
1756*9880d681SAndroid Build Coastguard Worker   // thus it will be destroyed before them.
1757*9880d681SAndroid Build Coastguard Worker   static ManagedStatic<TimingInfo> TTI;
1758*9880d681SAndroid Build Coastguard Worker   TheTimeInfo = &*TTI;
1759*9880d681SAndroid Build Coastguard Worker }
1760*9880d681SAndroid Build Coastguard Worker 
1761*9880d681SAndroid Build Coastguard Worker /// If TimingInfo is enabled then start pass timer.
getPassTimer(Pass * P)1762*9880d681SAndroid Build Coastguard Worker Timer *llvm::getPassTimer(Pass *P) {
1763*9880d681SAndroid Build Coastguard Worker   if (TheTimeInfo)
1764*9880d681SAndroid Build Coastguard Worker     return TheTimeInfo->getPassTimer(P);
1765*9880d681SAndroid Build Coastguard Worker   return nullptr;
1766*9880d681SAndroid Build Coastguard Worker }
1767*9880d681SAndroid Build Coastguard Worker 
1768*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1769*9880d681SAndroid Build Coastguard Worker // PMStack implementation
1770*9880d681SAndroid Build Coastguard Worker //
1771*9880d681SAndroid Build Coastguard Worker 
1772*9880d681SAndroid Build Coastguard Worker // Pop Pass Manager from the stack and clear its analysis info.
pop()1773*9880d681SAndroid Build Coastguard Worker void PMStack::pop() {
1774*9880d681SAndroid Build Coastguard Worker 
1775*9880d681SAndroid Build Coastguard Worker   PMDataManager *Top = this->top();
1776*9880d681SAndroid Build Coastguard Worker   Top->initializeAnalysisInfo();
1777*9880d681SAndroid Build Coastguard Worker 
1778*9880d681SAndroid Build Coastguard Worker   S.pop_back();
1779*9880d681SAndroid Build Coastguard Worker }
1780*9880d681SAndroid Build Coastguard Worker 
1781*9880d681SAndroid Build Coastguard Worker // Push PM on the stack and set its top level manager.
push(PMDataManager * PM)1782*9880d681SAndroid Build Coastguard Worker void PMStack::push(PMDataManager *PM) {
1783*9880d681SAndroid Build Coastguard Worker   assert(PM && "Unable to push. Pass Manager expected");
1784*9880d681SAndroid Build Coastguard Worker   assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1785*9880d681SAndroid Build Coastguard Worker 
1786*9880d681SAndroid Build Coastguard Worker   if (!this->empty()) {
1787*9880d681SAndroid Build Coastguard Worker     assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1788*9880d681SAndroid Build Coastguard Worker            && "pushing bad pass manager to PMStack");
1789*9880d681SAndroid Build Coastguard Worker     PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1790*9880d681SAndroid Build Coastguard Worker 
1791*9880d681SAndroid Build Coastguard Worker     assert(TPM && "Unable to find top level manager");
1792*9880d681SAndroid Build Coastguard Worker     TPM->addIndirectPassManager(PM);
1793*9880d681SAndroid Build Coastguard Worker     PM->setTopLevelManager(TPM);
1794*9880d681SAndroid Build Coastguard Worker     PM->setDepth(this->top()->getDepth()+1);
1795*9880d681SAndroid Build Coastguard Worker   } else {
1796*9880d681SAndroid Build Coastguard Worker     assert((PM->getPassManagerType() == PMT_ModulePassManager
1797*9880d681SAndroid Build Coastguard Worker            || PM->getPassManagerType() == PMT_FunctionPassManager)
1798*9880d681SAndroid Build Coastguard Worker            && "pushing bad pass manager to PMStack");
1799*9880d681SAndroid Build Coastguard Worker     PM->setDepth(1);
1800*9880d681SAndroid Build Coastguard Worker   }
1801*9880d681SAndroid Build Coastguard Worker 
1802*9880d681SAndroid Build Coastguard Worker   S.push_back(PM);
1803*9880d681SAndroid Build Coastguard Worker }
1804*9880d681SAndroid Build Coastguard Worker 
1805*9880d681SAndroid Build Coastguard Worker // Dump content of the pass manager stack.
dump() const1806*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void PMStack::dump() const {
1807*9880d681SAndroid Build Coastguard Worker   for (PMDataManager *Manager : S)
1808*9880d681SAndroid Build Coastguard Worker     dbgs() << Manager->getAsPass()->getPassName() << ' ';
1809*9880d681SAndroid Build Coastguard Worker 
1810*9880d681SAndroid Build Coastguard Worker   if (!S.empty())
1811*9880d681SAndroid Build Coastguard Worker     dbgs() << '\n';
1812*9880d681SAndroid Build Coastguard Worker }
1813*9880d681SAndroid Build Coastguard Worker 
1814*9880d681SAndroid Build Coastguard Worker /// Find appropriate Module Pass Manager in the PM Stack and
1815*9880d681SAndroid Build Coastguard Worker /// add self into that manager.
assignPassManager(PMStack & PMS,PassManagerType PreferredType)1816*9880d681SAndroid Build Coastguard Worker void ModulePass::assignPassManager(PMStack &PMS,
1817*9880d681SAndroid Build Coastguard Worker                                    PassManagerType PreferredType) {
1818*9880d681SAndroid Build Coastguard Worker   // Find Module Pass Manager
1819*9880d681SAndroid Build Coastguard Worker   while (!PMS.empty()) {
1820*9880d681SAndroid Build Coastguard Worker     PassManagerType TopPMType = PMS.top()->getPassManagerType();
1821*9880d681SAndroid Build Coastguard Worker     if (TopPMType == PreferredType)
1822*9880d681SAndroid Build Coastguard Worker       break; // We found desired pass manager
1823*9880d681SAndroid Build Coastguard Worker     else if (TopPMType > PMT_ModulePassManager)
1824*9880d681SAndroid Build Coastguard Worker       PMS.pop();    // Pop children pass managers
1825*9880d681SAndroid Build Coastguard Worker     else
1826*9880d681SAndroid Build Coastguard Worker       break;
1827*9880d681SAndroid Build Coastguard Worker   }
1828*9880d681SAndroid Build Coastguard Worker   assert(!PMS.empty() && "Unable to find appropriate Pass Manager");
1829*9880d681SAndroid Build Coastguard Worker   PMS.top()->add(this);
1830*9880d681SAndroid Build Coastguard Worker }
1831*9880d681SAndroid Build Coastguard Worker 
1832*9880d681SAndroid Build Coastguard Worker /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1833*9880d681SAndroid Build Coastguard Worker /// in the PM Stack and add self into that manager.
assignPassManager(PMStack & PMS,PassManagerType PreferredType)1834*9880d681SAndroid Build Coastguard Worker void FunctionPass::assignPassManager(PMStack &PMS,
1835*9880d681SAndroid Build Coastguard Worker                                      PassManagerType PreferredType) {
1836*9880d681SAndroid Build Coastguard Worker 
1837*9880d681SAndroid Build Coastguard Worker   // Find Function Pass Manager
1838*9880d681SAndroid Build Coastguard Worker   while (!PMS.empty()) {
1839*9880d681SAndroid Build Coastguard Worker     if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager)
1840*9880d681SAndroid Build Coastguard Worker       PMS.pop();
1841*9880d681SAndroid Build Coastguard Worker     else
1842*9880d681SAndroid Build Coastguard Worker       break;
1843*9880d681SAndroid Build Coastguard Worker   }
1844*9880d681SAndroid Build Coastguard Worker 
1845*9880d681SAndroid Build Coastguard Worker   // Create new Function Pass Manager if needed.
1846*9880d681SAndroid Build Coastguard Worker   FPPassManager *FPP;
1847*9880d681SAndroid Build Coastguard Worker   if (PMS.top()->getPassManagerType() == PMT_FunctionPassManager) {
1848*9880d681SAndroid Build Coastguard Worker     FPP = (FPPassManager *)PMS.top();
1849*9880d681SAndroid Build Coastguard Worker   } else {
1850*9880d681SAndroid Build Coastguard Worker     assert(!PMS.empty() && "Unable to create Function Pass Manager");
1851*9880d681SAndroid Build Coastguard Worker     PMDataManager *PMD = PMS.top();
1852*9880d681SAndroid Build Coastguard Worker 
1853*9880d681SAndroid Build Coastguard Worker     // [1] Create new Function Pass Manager
1854*9880d681SAndroid Build Coastguard Worker     FPP = new FPPassManager();
1855*9880d681SAndroid Build Coastguard Worker     FPP->populateInheritedAnalysis(PMS);
1856*9880d681SAndroid Build Coastguard Worker 
1857*9880d681SAndroid Build Coastguard Worker     // [2] Set up new manager's top level manager
1858*9880d681SAndroid Build Coastguard Worker     PMTopLevelManager *TPM = PMD->getTopLevelManager();
1859*9880d681SAndroid Build Coastguard Worker     TPM->addIndirectPassManager(FPP);
1860*9880d681SAndroid Build Coastguard Worker 
1861*9880d681SAndroid Build Coastguard Worker     // [3] Assign manager to manage this new manager. This may create
1862*9880d681SAndroid Build Coastguard Worker     // and push new managers into PMS
1863*9880d681SAndroid Build Coastguard Worker     FPP->assignPassManager(PMS, PMD->getPassManagerType());
1864*9880d681SAndroid Build Coastguard Worker 
1865*9880d681SAndroid Build Coastguard Worker     // [4] Push new manager into PMS
1866*9880d681SAndroid Build Coastguard Worker     PMS.push(FPP);
1867*9880d681SAndroid Build Coastguard Worker   }
1868*9880d681SAndroid Build Coastguard Worker 
1869*9880d681SAndroid Build Coastguard Worker   // Assign FPP as the manager of this pass.
1870*9880d681SAndroid Build Coastguard Worker   FPP->add(this);
1871*9880d681SAndroid Build Coastguard Worker }
1872*9880d681SAndroid Build Coastguard Worker 
1873*9880d681SAndroid Build Coastguard Worker /// Find appropriate Basic Pass Manager or Call Graph Pass Manager
1874*9880d681SAndroid Build Coastguard Worker /// in the PM Stack and add self into that manager.
assignPassManager(PMStack & PMS,PassManagerType PreferredType)1875*9880d681SAndroid Build Coastguard Worker void BasicBlockPass::assignPassManager(PMStack &PMS,
1876*9880d681SAndroid Build Coastguard Worker                                        PassManagerType PreferredType) {
1877*9880d681SAndroid Build Coastguard Worker   BBPassManager *BBP;
1878*9880d681SAndroid Build Coastguard Worker 
1879*9880d681SAndroid Build Coastguard Worker   // Basic Pass Manager is a leaf pass manager. It does not handle
1880*9880d681SAndroid Build Coastguard Worker   // any other pass manager.
1881*9880d681SAndroid Build Coastguard Worker   if (!PMS.empty() &&
1882*9880d681SAndroid Build Coastguard Worker       PMS.top()->getPassManagerType() == PMT_BasicBlockPassManager) {
1883*9880d681SAndroid Build Coastguard Worker     BBP = (BBPassManager *)PMS.top();
1884*9880d681SAndroid Build Coastguard Worker   } else {
1885*9880d681SAndroid Build Coastguard Worker     // If leaf manager is not Basic Block Pass manager then create new
1886*9880d681SAndroid Build Coastguard Worker     // basic Block Pass manager.
1887*9880d681SAndroid Build Coastguard Worker     assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
1888*9880d681SAndroid Build Coastguard Worker     PMDataManager *PMD = PMS.top();
1889*9880d681SAndroid Build Coastguard Worker 
1890*9880d681SAndroid Build Coastguard Worker     // [1] Create new Basic Block Manager
1891*9880d681SAndroid Build Coastguard Worker     BBP = new BBPassManager();
1892*9880d681SAndroid Build Coastguard Worker 
1893*9880d681SAndroid Build Coastguard Worker     // [2] Set up new manager's top level manager
1894*9880d681SAndroid Build Coastguard Worker     // Basic Block Pass Manager does not live by itself
1895*9880d681SAndroid Build Coastguard Worker     PMTopLevelManager *TPM = PMD->getTopLevelManager();
1896*9880d681SAndroid Build Coastguard Worker     TPM->addIndirectPassManager(BBP);
1897*9880d681SAndroid Build Coastguard Worker 
1898*9880d681SAndroid Build Coastguard Worker     // [3] Assign manager to manage this new manager. This may create
1899*9880d681SAndroid Build Coastguard Worker     // and push new managers into PMS
1900*9880d681SAndroid Build Coastguard Worker     BBP->assignPassManager(PMS, PreferredType);
1901*9880d681SAndroid Build Coastguard Worker 
1902*9880d681SAndroid Build Coastguard Worker     // [4] Push new manager into PMS
1903*9880d681SAndroid Build Coastguard Worker     PMS.push(BBP);
1904*9880d681SAndroid Build Coastguard Worker   }
1905*9880d681SAndroid Build Coastguard Worker 
1906*9880d681SAndroid Build Coastguard Worker   // Assign BBP as the manager of this pass.
1907*9880d681SAndroid Build Coastguard Worker   BBP->add(this);
1908*9880d681SAndroid Build Coastguard Worker }
1909*9880d681SAndroid Build Coastguard Worker 
~PassManagerBase()1910*9880d681SAndroid Build Coastguard Worker PassManagerBase::~PassManagerBase() {}
1911