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