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/ADT/Statistic.h"
16 #include "llvm/IR/DiagnosticInfo.h"
17 #include "llvm/IR/IRPrintingPasses.h"
18 #include "llvm/IR/LLVMContext.h"
19 #include "llvm/IR/LegacyPassManagers.h"
20 #include "llvm/IR/LegacyPassNameParser.h"
21 #include "llvm/IR/Module.h"
22 #include "llvm/IR/PassTimingInfo.h"
23 #include "llvm/IR/PrintPasses.h"
24 #include "llvm/IR/StructuralHash.h"
25 #include "llvm/Support/Chrono.h"
26 #include "llvm/Support/CommandLine.h"
27 #include "llvm/Support/Debug.h"
28 #include "llvm/Support/Error.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/ManagedStatic.h"
31 #include "llvm/Support/Mutex.h"
32 #include "llvm/Support/TimeProfiler.h"
33 #include "llvm/Support/Timer.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include <algorithm>
36 #include <unordered_set>
37 using namespace llvm;
38 
39 // See PassManagers.h for Pass Manager infrastructure overview.
40 
41 //===----------------------------------------------------------------------===//
42 // Pass debugging information.  Often it is useful to find out what pass is
43 // running when a crash occurs in a utility.  When this library is compiled with
44 // debugging on, a command line option (--debug-pass) is enabled that causes the
45 // pass name to be printed before it executes.
46 //
47 
48 namespace {
49 // Different debug levels that can be enabled...
50 enum PassDebugLevel {
51   Disabled, Arguments, Structure, Executions, Details
52 };
53 } // namespace
54 
55 static cl::opt<enum PassDebugLevel> PassDebugging(
56     "debug-pass", cl::Hidden,
57     cl::desc("Print legacy PassManager debugging information"),
58     cl::values(clEnumVal(Disabled, "disable debug output"),
59                clEnumVal(Arguments, "print pass arguments to pass to 'opt'"),
60                clEnumVal(Structure, "print pass structure before run()"),
61                clEnumVal(Executions, "print pass name before it is executed"),
62                clEnumVal(Details, "print pass details when it is executed")));
63 
64 /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
65 /// or higher is specified.
66 bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
67   return PassDebugging >= Executions;
68 }
69 
70 unsigned PMDataManager::initSizeRemarkInfo(
71     Module &M, StringMap<std::pair<unsigned, unsigned>> &FunctionToInstrCount) {
72   // Only calculate getInstructionCount if the size-info remark is requested.
73   unsigned InstrCount = 0;
74 
75   // Collect instruction counts for every function. We'll use this to emit
76   // per-function size remarks later.
77   for (Function &F : M) {
78     unsigned FCount = F.getInstructionCount();
79 
80     // Insert a record into FunctionToInstrCount keeping track of the current
81     // size of the function as the first member of a pair. Set the second
82     // member to 0; if the function is deleted by the pass, then when we get
83     // here, we'll be able to let the user know that F no longer contributes to
84     // the module.
85     FunctionToInstrCount[F.getName().str()] =
86         std::pair<unsigned, unsigned>(FCount, 0);
87     InstrCount += FCount;
88   }
89   return InstrCount;
90 }
91 
92 void PMDataManager::emitInstrCountChangedRemark(
93     Pass *P, Module &M, int64_t Delta, unsigned CountBefore,
94     StringMap<std::pair<unsigned, unsigned>> &FunctionToInstrCount,
95     Function *F) {
96   // If it's a pass manager, don't emit a remark. (This hinges on the assumption
97   // that the only passes that return non-null with getAsPMDataManager are pass
98   // managers.) The reason we have to do this is to avoid emitting remarks for
99   // CGSCC passes.
100   if (P->getAsPMDataManager())
101     return;
102 
103   // Set to true if this isn't a module pass or CGSCC pass.
104   bool CouldOnlyImpactOneFunction = (F != nullptr);
105 
106   // Helper lambda that updates the changes to the size of some function.
107   auto UpdateFunctionChanges =
108       [&FunctionToInstrCount](Function &MaybeChangedFn) {
109         // Update the total module count.
110         unsigned FnSize = MaybeChangedFn.getInstructionCount();
111         auto It = FunctionToInstrCount.find(MaybeChangedFn.getName());
112 
113         // If we created a new function, then we need to add it to the map and
114         // say that it changed from 0 instructions to FnSize.
115         if (It == FunctionToInstrCount.end()) {
116           FunctionToInstrCount[MaybeChangedFn.getName()] =
117               std::pair<unsigned, unsigned>(0, FnSize);
118           return;
119         }
120         // Insert the new function size into the second member of the pair. This
121         // tells us whether or not this function changed in size.
122         It->second.second = FnSize;
123       };
124 
125   // We need to initially update all of the function sizes.
126   // If no function was passed in, then we're either a module pass or an
127   // CGSCC pass.
128   if (!CouldOnlyImpactOneFunction)
129     std::for_each(M.begin(), M.end(), UpdateFunctionChanges);
130   else
131     UpdateFunctionChanges(*F);
132 
133   // Do we have a function we can use to emit a remark?
134   if (!CouldOnlyImpactOneFunction) {
135     // We need a function containing at least one basic block in order to output
136     // remarks. Since it's possible that the first function in the module
137     // doesn't actually contain a basic block, we have to go and find one that's
138     // suitable for emitting remarks.
139     auto It = llvm::find_if(M, [](const Function &Fn) { return !Fn.empty(); });
140 
141     // Didn't find a function. Quit.
142     if (It == M.end())
143       return;
144 
145     // We found a function containing at least one basic block.
146     F = &*It;
147   }
148   int64_t CountAfter = static_cast<int64_t>(CountBefore) + Delta;
149   BasicBlock &BB = *F->begin();
150   OptimizationRemarkAnalysis R("size-info", "IRSizeChange",
151                                DiagnosticLocation(), &BB);
152   // FIXME: Move ore namespace to DiagnosticInfo so that we can use it. This
153   // would let us use NV instead of DiagnosticInfoOptimizationBase::Argument.
154   R << DiagnosticInfoOptimizationBase::Argument("Pass", P->getPassName())
155     << ": IR instruction count changed from "
156     << DiagnosticInfoOptimizationBase::Argument("IRInstrsBefore", CountBefore)
157     << " to "
158     << DiagnosticInfoOptimizationBase::Argument("IRInstrsAfter", CountAfter)
159     << "; Delta: "
160     << DiagnosticInfoOptimizationBase::Argument("DeltaInstrCount", Delta);
161   F->getContext().diagnose(R); // Not using ORE for layering reasons.
162 
163   // Emit per-function size change remarks separately.
164   std::string PassName = P->getPassName().str();
165 
166   // Helper lambda that emits a remark when the size of a function has changed.
167   auto EmitFunctionSizeChangedRemark = [&FunctionToInstrCount, &F, &BB,
168                                         &PassName](StringRef Fname) {
169     unsigned FnCountBefore, FnCountAfter;
170     std::pair<unsigned, unsigned> &Change = FunctionToInstrCount[Fname];
171     std::tie(FnCountBefore, FnCountAfter) = Change;
172     int64_t FnDelta = static_cast<int64_t>(FnCountAfter) -
173                       static_cast<int64_t>(FnCountBefore);
174 
175     if (FnDelta == 0)
176       return;
177 
178     // FIXME: We shouldn't use BB for the location here. Unfortunately, because
179     // the function that we're looking at could have been deleted, we can't use
180     // it for the source location. We *want* remarks when a function is deleted
181     // though, so we're kind of stuck here as is. (This remark, along with the
182     // whole-module size change remarks really ought not to have source
183     // locations at all.)
184     OptimizationRemarkAnalysis FR("size-info", "FunctionIRSizeChange",
185                                   DiagnosticLocation(), &BB);
186     FR << DiagnosticInfoOptimizationBase::Argument("Pass", PassName)
187        << ": Function: "
188        << DiagnosticInfoOptimizationBase::Argument("Function", Fname)
189        << ": IR instruction count changed from "
190        << DiagnosticInfoOptimizationBase::Argument("IRInstrsBefore",
191                                                    FnCountBefore)
192        << " to "
193        << DiagnosticInfoOptimizationBase::Argument("IRInstrsAfter",
194                                                    FnCountAfter)
195        << "; Delta: "
196        << DiagnosticInfoOptimizationBase::Argument("DeltaInstrCount", FnDelta);
197     F->getContext().diagnose(FR);
198 
199     // Update the function size.
200     Change.first = FnCountAfter;
201   };
202 
203   // Are we looking at more than one function? If so, emit remarks for all of
204   // the functions in the module. Otherwise, only emit one remark.
205   if (!CouldOnlyImpactOneFunction)
206     std::for_each(FunctionToInstrCount.keys().begin(),
207                   FunctionToInstrCount.keys().end(),
208                   EmitFunctionSizeChangedRemark);
209   else
210     EmitFunctionSizeChangedRemark(F->getName().str());
211 }
212 
213 void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
214   if (!V && !M)
215     OS << "Releasing pass '";
216   else
217     OS << "Running pass '";
218 
219   OS << P->getPassName() << "'";
220 
221   if (M) {
222     OS << " on module '" << M->getModuleIdentifier() << "'.\n";
223     return;
224   }
225   if (!V) {
226     OS << '\n';
227     return;
228   }
229 
230   OS << " on ";
231   if (isa<Function>(V))
232     OS << "function";
233   else if (isa<BasicBlock>(V))
234     OS << "basic block";
235   else
236     OS << "value";
237 
238   OS << " '";
239   V->printAsOperand(OS, /*PrintType=*/false, M);
240   OS << "'\n";
241 }
242 
243 namespace llvm {
244 namespace legacy {
245 bool debugPassSpecified() { return PassDebugging != Disabled; }
246 
247 //===----------------------------------------------------------------------===//
248 // FunctionPassManagerImpl
249 //
250 /// FunctionPassManagerImpl manages FPPassManagers
251 class FunctionPassManagerImpl : public Pass,
252                                 public PMDataManager,
253                                 public PMTopLevelManager {
254   virtual void anchor();
255 private:
256   bool wasRun;
257 public:
258   static char ID;
259   explicit FunctionPassManagerImpl()
260       : Pass(PT_PassManager, ID), PMTopLevelManager(new FPPassManager()),
261         wasRun(false) {}
262 
263   /// \copydoc FunctionPassManager::add()
264   void add(Pass *P) {
265     schedulePass(P);
266   }
267 
268   /// createPrinterPass - Get a function printer pass.
269   Pass *createPrinterPass(raw_ostream &O,
270                           const std::string &Banner) const override {
271     return createPrintFunctionPass(O, Banner);
272   }
273 
274   // Prepare for running an on the fly pass, freeing memory if needed
275   // from a previous run.
276   void releaseMemoryOnTheFly();
277 
278   /// run - Execute all of the passes scheduled for execution.  Keep track of
279   /// whether any of the passes modifies the module, and if so, return true.
280   bool run(Function &F);
281 
282   /// doInitialization - Run all of the initializers for the function passes.
283   ///
284   bool doInitialization(Module &M) override;
285 
286   /// doFinalization - Run all of the finalizers for the function passes.
287   ///
288   bool doFinalization(Module &M) override;
289 
290 
291   PMDataManager *getAsPMDataManager() override { return this; }
292   Pass *getAsPass() override { return this; }
293   PassManagerType getTopLevelPassManagerType() override {
294     return PMT_FunctionPassManager;
295   }
296 
297   /// Pass Manager itself does not invalidate any analysis info.
298   void getAnalysisUsage(AnalysisUsage &Info) const override {
299     Info.setPreservesAll();
300   }
301 
302   FPPassManager *getContainedManager(unsigned N) {
303     assert(N < PassManagers.size() && "Pass number out of range!");
304     FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
305     return FP;
306   }
307 
308   void dumpPassStructure(unsigned Offset) override {
309     for (unsigned I = 0; I < getNumContainedManagers(); ++I)
310       getContainedManager(I)->dumpPassStructure(Offset);
311   }
312 };
313 
314 void FunctionPassManagerImpl::anchor() {}
315 
316 char FunctionPassManagerImpl::ID = 0;
317 
318 //===----------------------------------------------------------------------===//
319 // FunctionPassManagerImpl implementation
320 //
321 bool FunctionPassManagerImpl::doInitialization(Module &M) {
322   bool Changed = false;
323 
324   dumpArguments();
325   dumpPasses();
326 
327   for (ImmutablePass *ImPass : getImmutablePasses())
328     Changed |= ImPass->doInitialization(M);
329 
330   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
331     Changed |= getContainedManager(Index)->doInitialization(M);
332 
333   return Changed;
334 }
335 
336 bool FunctionPassManagerImpl::doFinalization(Module &M) {
337   bool Changed = false;
338 
339   for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index)
340     Changed |= getContainedManager(Index)->doFinalization(M);
341 
342   for (ImmutablePass *ImPass : getImmutablePasses())
343     Changed |= ImPass->doFinalization(M);
344 
345   return Changed;
346 }
347 
348 void FunctionPassManagerImpl::releaseMemoryOnTheFly() {
349   if (!wasRun)
350     return;
351   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
352     FPPassManager *FPPM = getContainedManager(Index);
353     for (unsigned Index = 0; Index < FPPM->getNumContainedPasses(); ++Index) {
354       FPPM->getContainedPass(Index)->releaseMemory();
355     }
356   }
357   wasRun = false;
358 }
359 
360 // Execute all the passes managed by this top level manager.
361 // Return true if any function is modified by a pass.
362 bool FunctionPassManagerImpl::run(Function &F) {
363   bool Changed = false;
364 
365   initializeAllAnalysisInfo();
366   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
367     Changed |= getContainedManager(Index)->runOnFunction(F);
368     F.getContext().yield();
369   }
370 
371   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
372     getContainedManager(Index)->cleanup();
373 
374   wasRun = true;
375   return Changed;
376 }
377 } // namespace legacy
378 } // namespace llvm
379 
380 namespace {
381 //===----------------------------------------------------------------------===//
382 // MPPassManager
383 //
384 /// MPPassManager manages ModulePasses and function pass managers.
385 /// It batches all Module passes and function pass managers together and
386 /// sequences them to process one module.
387 class MPPassManager : public Pass, public PMDataManager {
388 public:
389   static char ID;
390   explicit MPPassManager() : Pass(PT_PassManager, ID) {}
391 
392   // Delete on the fly managers.
393   ~MPPassManager() override {
394     for (auto &OnTheFlyManager : OnTheFlyManagers) {
395       legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
396       delete FPP;
397     }
398   }
399 
400   /// createPrinterPass - Get a module printer pass.
401   Pass *createPrinterPass(raw_ostream &O,
402                           const std::string &Banner) const override {
403     return createPrintModulePass(O, Banner);
404   }
405 
406   /// run - Execute all of the passes scheduled for execution.  Keep track of
407   /// whether any of the passes modifies the module, and if so, return true.
408   bool runOnModule(Module &M);
409 
410   using llvm::Pass::doInitialization;
411   using llvm::Pass::doFinalization;
412 
413   /// Pass Manager itself does not invalidate any analysis info.
414   void getAnalysisUsage(AnalysisUsage &Info) const override {
415     Info.setPreservesAll();
416   }
417 
418   /// Add RequiredPass into list of lower level passes required by pass P.
419   /// RequiredPass is run on the fly by Pass Manager when P requests it
420   /// through getAnalysis interface.
421   void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override;
422 
423   /// Return function pass corresponding to PassInfo PI, that is
424   /// required by module pass MP. Instantiate analysis pass, by using
425   /// its runOnFunction() for function F.
426   std::tuple<Pass *, bool> getOnTheFlyPass(Pass *MP, AnalysisID PI,
427                                            Function &F) override;
428 
429   StringRef getPassName() const override { return "Module Pass Manager"; }
430 
431   PMDataManager *getAsPMDataManager() override { return this; }
432   Pass *getAsPass() override { return this; }
433 
434   // Print passes managed by this manager
435   void dumpPassStructure(unsigned Offset) override {
436     dbgs().indent(Offset*2) << "ModulePass Manager\n";
437     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
438       ModulePass *MP = getContainedPass(Index);
439       MP->dumpPassStructure(Offset + 1);
440       MapVector<Pass *, legacy::FunctionPassManagerImpl *>::const_iterator I =
441           OnTheFlyManagers.find(MP);
442       if (I != OnTheFlyManagers.end())
443         I->second->dumpPassStructure(Offset + 2);
444       dumpLastUses(MP, Offset+1);
445     }
446   }
447 
448   ModulePass *getContainedPass(unsigned N) {
449     assert(N < PassVector.size() && "Pass number out of range!");
450     return static_cast<ModulePass *>(PassVector[N]);
451   }
452 
453   PassManagerType getPassManagerType() const override {
454     return PMT_ModulePassManager;
455   }
456 
457  private:
458   /// Collection of on the fly FPPassManagers. These managers manage
459   /// function passes that are required by module passes.
460    MapVector<Pass *, legacy::FunctionPassManagerImpl *> OnTheFlyManagers;
461 };
462 
463 char MPPassManager::ID = 0;
464 } // End anonymous namespace
465 
466 namespace llvm {
467 namespace legacy {
468 //===----------------------------------------------------------------------===//
469 // PassManagerImpl
470 //
471 
472 /// PassManagerImpl manages MPPassManagers
473 class PassManagerImpl : public Pass,
474                         public PMDataManager,
475                         public PMTopLevelManager {
476   virtual void anchor();
477 
478 public:
479   static char ID;
480   explicit PassManagerImpl()
481       : Pass(PT_PassManager, ID), PMTopLevelManager(new MPPassManager()) {}
482 
483   /// \copydoc PassManager::add()
484   void add(Pass *P) {
485     schedulePass(P);
486   }
487 
488   /// createPrinterPass - Get a module printer pass.
489   Pass *createPrinterPass(raw_ostream &O,
490                           const std::string &Banner) const override {
491     return createPrintModulePass(O, Banner);
492   }
493 
494   /// run - Execute all of the passes scheduled for execution.  Keep track of
495   /// whether any of the passes modifies the module, and if so, return true.
496   bool run(Module &M);
497 
498   using llvm::Pass::doInitialization;
499   using llvm::Pass::doFinalization;
500 
501   /// Pass Manager itself does not invalidate any analysis info.
502   void getAnalysisUsage(AnalysisUsage &Info) const override {
503     Info.setPreservesAll();
504   }
505 
506   PMDataManager *getAsPMDataManager() override { return this; }
507   Pass *getAsPass() override { return this; }
508   PassManagerType getTopLevelPassManagerType() override {
509     return PMT_ModulePassManager;
510   }
511 
512   MPPassManager *getContainedManager(unsigned N) {
513     assert(N < PassManagers.size() && "Pass number out of range!");
514     MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
515     return MP;
516   }
517 };
518 
519 void PassManagerImpl::anchor() {}
520 
521 char PassManagerImpl::ID = 0;
522 
523 //===----------------------------------------------------------------------===//
524 // PassManagerImpl implementation
525 
526 //
527 /// run - Execute all of the passes scheduled for execution.  Keep track of
528 /// whether any of the passes modifies the module, and if so, return true.
529 bool PassManagerImpl::run(Module &M) {
530   bool Changed = false;
531 
532   dumpArguments();
533   dumpPasses();
534 
535   for (ImmutablePass *ImPass : getImmutablePasses())
536     Changed |= ImPass->doInitialization(M);
537 
538   initializeAllAnalysisInfo();
539   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
540     Changed |= getContainedManager(Index)->runOnModule(M);
541     M.getContext().yield();
542   }
543 
544   for (ImmutablePass *ImPass : getImmutablePasses())
545     Changed |= ImPass->doFinalization(M);
546 
547   return Changed;
548 }
549 } // namespace legacy
550 } // namespace llvm
551 
552 //===----------------------------------------------------------------------===//
553 // PMTopLevelManager implementation
554 
555 /// Initialize top level manager. Create first pass manager.
556 PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) {
557   PMDM->setTopLevelManager(this);
558   addPassManager(PMDM);
559   activeStack.push(PMDM);
560 }
561 
562 /// Set pass P as the last user of the given analysis passes.
563 void
564 PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) {
565   unsigned PDepth = 0;
566   if (P->getResolver())
567     PDepth = P->getResolver()->getPMDataManager().getDepth();
568 
569   for (Pass *AP : AnalysisPasses) {
570     // Record P as the new last user of AP.
571     auto &LastUserOfAP = LastUser[AP];
572     if (LastUserOfAP)
573       InversedLastUser[LastUserOfAP].erase(AP);
574     LastUserOfAP = P;
575     InversedLastUser[P].insert(AP);
576 
577     if (P == AP)
578       continue;
579 
580     // Update the last users of passes that are required transitive by AP.
581     AnalysisUsage *AnUsage = findAnalysisUsage(AP);
582     const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet();
583     SmallVector<Pass *, 12> LastUses;
584     SmallVector<Pass *, 12> LastPMUses;
585     for (AnalysisID ID : IDs) {
586       Pass *AnalysisPass = findAnalysisPass(ID);
587       assert(AnalysisPass && "Expected analysis pass to exist.");
588       AnalysisResolver *AR = AnalysisPass->getResolver();
589       assert(AR && "Expected analysis resolver to exist.");
590       unsigned APDepth = AR->getPMDataManager().getDepth();
591 
592       if (PDepth == APDepth)
593         LastUses.push_back(AnalysisPass);
594       else if (PDepth > APDepth)
595         LastPMUses.push_back(AnalysisPass);
596     }
597 
598     setLastUser(LastUses, P);
599 
600     // If this pass has a corresponding pass manager, push higher level
601     // analysis to this pass manager.
602     if (P->getResolver())
603       setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass());
604 
605     // If AP is the last user of other passes then make P last user of
606     // such passes.
607     auto &LastUsedByAP = InversedLastUser[AP];
608     for (Pass *L : LastUsedByAP)
609       LastUser[L] = P;
610     InversedLastUser[P].insert(LastUsedByAP.begin(), LastUsedByAP.end());
611     LastUsedByAP.clear();
612   }
613 }
614 
615 /// Collect passes whose last user is P
616 void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses,
617                                         Pass *P) {
618   auto DMI = InversedLastUser.find(P);
619   if (DMI == InversedLastUser.end())
620     return;
621 
622   auto &LU = DMI->second;
623   LastUses.append(LU.begin(), LU.end());
624 }
625 
626 AnalysisUsage *PMTopLevelManager::findAnalysisUsage(Pass *P) {
627   AnalysisUsage *AnUsage = nullptr;
628   auto DMI = AnUsageMap.find(P);
629   if (DMI != AnUsageMap.end())
630     AnUsage = DMI->second;
631   else {
632     // Look up the analysis usage from the pass instance (different instances
633     // of the same pass can produce different results), but unique the
634     // resulting object to reduce memory usage.  This helps to greatly reduce
635     // memory usage when we have many instances of only a few pass types
636     // (e.g. instcombine, simplifycfg, etc...) which tend to share a fixed set
637     // of dependencies.
638     AnalysisUsage AU;
639     P->getAnalysisUsage(AU);
640 
641     AUFoldingSetNode* Node = nullptr;
642     FoldingSetNodeID ID;
643     AUFoldingSetNode::Profile(ID, AU);
644     void *IP = nullptr;
645     if (auto *N = UniqueAnalysisUsages.FindNodeOrInsertPos(ID, IP))
646       Node = N;
647     else {
648       Node = new (AUFoldingSetNodeAllocator.Allocate()) AUFoldingSetNode(AU);
649       UniqueAnalysisUsages.InsertNode(Node, IP);
650     }
651     assert(Node && "cached analysis usage must be non null");
652 
653     AnUsageMap[P] = &Node->AU;
654     AnUsage = &Node->AU;
655   }
656   return AnUsage;
657 }
658 
659 /// Schedule pass P for execution. Make sure that passes required by
660 /// P are run before P is run. Update analysis info maintained by
661 /// the manager. Remove dead passes. This is a recursive function.
662 void PMTopLevelManager::schedulePass(Pass *P) {
663 
664   // TODO : Allocate function manager for this pass, other wise required set
665   // may be inserted into previous function manager
666 
667   // Give pass a chance to prepare the stage.
668   P->preparePassManager(activeStack);
669 
670   // If P is an analysis pass and it is available then do not
671   // generate the analysis again. Stale analysis info should not be
672   // available at this point.
673   const PassInfo *PI = findAnalysisPassInfo(P->getPassID());
674   if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) {
675     // Remove any cached AnalysisUsage information.
676     AnUsageMap.erase(P);
677     delete P;
678     return;
679   }
680 
681   AnalysisUsage *AnUsage = findAnalysisUsage(P);
682 
683   bool checkAnalysis = true;
684   while (checkAnalysis) {
685     checkAnalysis = false;
686 
687     const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet();
688     for (const AnalysisID ID : RequiredSet) {
689 
690       Pass *AnalysisPass = findAnalysisPass(ID);
691       if (!AnalysisPass) {
692         const PassInfo *PI = findAnalysisPassInfo(ID);
693 
694         if (!PI) {
695           // Pass P is not in the global PassRegistry
696           dbgs() << "Pass '"  << P->getPassName() << "' is not initialized." << "\n";
697           dbgs() << "Verify if there is a pass dependency cycle." << "\n";
698           dbgs() << "Required Passes:" << "\n";
699           for (const AnalysisID ID2 : RequiredSet) {
700             if (ID == ID2)
701               break;
702             Pass *AnalysisPass2 = findAnalysisPass(ID2);
703             if (AnalysisPass2) {
704               dbgs() << "\t" << AnalysisPass2->getPassName() << "\n";
705             } else {
706               dbgs() << "\t"   << "Error: Required pass not found! Possible causes:"  << "\n";
707               dbgs() << "\t\t" << "- Pass misconfiguration (e.g.: missing macros)"    << "\n";
708               dbgs() << "\t\t" << "- Corruption of the global PassRegistry"           << "\n";
709             }
710           }
711         }
712 
713         assert(PI && "Expected required passes to be initialized");
714         AnalysisPass = PI->createPass();
715         if (P->getPotentialPassManagerType () ==
716             AnalysisPass->getPotentialPassManagerType())
717           // Schedule analysis pass that is managed by the same pass manager.
718           schedulePass(AnalysisPass);
719         else if (P->getPotentialPassManagerType () >
720                  AnalysisPass->getPotentialPassManagerType()) {
721           // Schedule analysis pass that is managed by a new manager.
722           schedulePass(AnalysisPass);
723           // Recheck analysis passes to ensure that required analyses that
724           // are already checked are still available.
725           checkAnalysis = true;
726         } else
727           // Do not schedule this analysis. Lower level analysis
728           // passes are run on the fly.
729           delete AnalysisPass;
730       }
731     }
732   }
733 
734   // Now all required passes are available.
735   if (ImmutablePass *IP = P->getAsImmutablePass()) {
736     // P is a immutable pass and it will be managed by this
737     // top level manager. Set up analysis resolver to connect them.
738     PMDataManager *DM = getAsPMDataManager();
739     AnalysisResolver *AR = new AnalysisResolver(*DM);
740     P->setResolver(AR);
741     DM->initializeAnalysisImpl(P);
742     addImmutablePass(IP);
743     DM->recordAvailableAnalysis(IP);
744     return;
745   }
746 
747   if (PI && !PI->isAnalysis() && shouldPrintBeforePass(PI->getPassArgument())) {
748     Pass *PP =
749         P->createPrinterPass(dbgs(), ("*** IR Dump Before " + P->getPassName() +
750                                       " (" + PI->getPassArgument() + ") ***")
751                                          .str());
752     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
753   }
754 
755   // Add the requested pass to the best available pass manager.
756   P->assignPassManager(activeStack, getTopLevelPassManagerType());
757 
758   if (PI && !PI->isAnalysis() && shouldPrintAfterPass(PI->getPassArgument())) {
759     Pass *PP =
760         P->createPrinterPass(dbgs(), ("*** IR Dump After " + P->getPassName() +
761                                       " (" + PI->getPassArgument() + ") ***")
762                                          .str());
763     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
764   }
765 }
766 
767 /// Find the pass that implements Analysis AID. Search immutable
768 /// passes and all pass managers. If desired pass is not found
769 /// then return NULL.
770 Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
771   // For immutable passes we have a direct mapping from ID to pass, so check
772   // that first.
773   if (Pass *P = ImmutablePassMap.lookup(AID))
774     return P;
775 
776   // Check pass managers
777   for (PMDataManager *PassManager : PassManagers)
778     if (Pass *P = PassManager->findAnalysisPass(AID, false))
779       return P;
780 
781   // Check other pass managers
782   for (PMDataManager *IndirectPassManager : IndirectPassManagers)
783     if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
784       return P;
785 
786   return nullptr;
787 }
788 
789 const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const {
790   const PassInfo *&PI = AnalysisPassInfos[AID];
791   if (!PI)
792     PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
793   else
794     assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) &&
795            "The pass info pointer changed for an analysis ID!");
796 
797   return PI;
798 }
799 
800 void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
801   P->initializePass();
802   ImmutablePasses.push_back(P);
803 
804   // Add this pass to the map from its analysis ID. We clobber any prior runs
805   // of the pass in the map so that the last one added is the one found when
806   // doing lookups.
807   AnalysisID AID = P->getPassID();
808   ImmutablePassMap[AID] = P;
809 
810   // Also add any interfaces implemented by the immutable pass to the map for
811   // fast lookup.
812   const PassInfo *PassInf = findAnalysisPassInfo(AID);
813   assert(PassInf && "Expected all immutable passes to be initialized");
814   for (const PassInfo *ImmPI : PassInf->getInterfacesImplemented())
815     ImmutablePassMap[ImmPI->getTypeInfo()] = P;
816 }
817 
818 // Print passes managed by this top level manager.
819 void PMTopLevelManager::dumpPasses() const {
820 
821   if (PassDebugging < Structure)
822     return;
823 
824   // Print out the immutable passes
825   for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
826     ImmutablePasses[i]->dumpPassStructure(0);
827   }
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 
837 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 
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
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.
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
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.
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
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
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 
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.
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.
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 //
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.
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.
1153 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 
1171 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 
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 
1224 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 
1233 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 
1242 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 
1251 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.
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 
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
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.
1311 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID) const {
1312   return PM.findAnalysisPass(ID, true);
1313 }
1314 
1315 std::tuple<Pass *, bool>
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
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 
1336 FunctionPassManager::~FunctionPassManager() {
1337   delete FPM;
1338 }
1339 
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 ///
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 ///
1358 bool FunctionPassManager::doInitialization() {
1359   return FPM->doInitialization(*M);
1360 }
1361 
1362 /// doFinalization - Run all of the finalizers for the function passes.
1363 ///
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.
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
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.
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   llvm::TimeTraceScope FunctionScope("OptFunction", F.getName());
1417 
1418   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1419     FunctionPass *FP = getContainedPass(Index);
1420     bool LocalChanged = false;
1421 
1422     llvm::TimeTraceScope PassScope("RunPass", FP->getPassName());
1423 
1424     dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName());
1425     dumpRequiredSet(FP);
1426 
1427     initializeAnalysisImpl(FP);
1428 
1429     {
1430       PassManagerPrettyStackEntry X(FP, F);
1431       TimeRegion PassTimer(getPassTimer(FP));
1432 #ifdef EXPENSIVE_CHECKS
1433       uint64_t RefHash = StructuralHash(F);
1434 #endif
1435       LocalChanged |= FP->runOnFunction(F);
1436 
1437 #if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
1438       if (!LocalChanged && (RefHash != StructuralHash(F))) {
1439         llvm::errs() << "Pass modifies its input and doesn't report it: "
1440                      << FP->getPassName() << "\n";
1441         llvm_unreachable("Pass modifies its input and doesn't report it");
1442       }
1443 #endif
1444 
1445       if (EmitICRemark) {
1446         unsigned NewSize = F.getInstructionCount();
1447 
1448         // Update the size of the function, emit a remark, and update the size
1449         // of the module.
1450         if (NewSize != FunctionSize) {
1451           int64_t Delta = static_cast<int64_t>(NewSize) -
1452                           static_cast<int64_t>(FunctionSize);
1453           emitInstrCountChangedRemark(FP, M, Delta, InstrCount,
1454                                       FunctionToInstrCount, &F);
1455           InstrCount = static_cast<int64_t>(InstrCount) + Delta;
1456           FunctionSize = NewSize;
1457         }
1458       }
1459     }
1460 
1461     Changed |= LocalChanged;
1462     if (LocalChanged)
1463       dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName());
1464     dumpPreservedSet(FP);
1465     dumpUsedSet(FP);
1466 
1467     verifyPreservedAnalysis(FP);
1468     if (LocalChanged)
1469       removeNotPreservedAnalysis(FP);
1470     recordAvailableAnalysis(FP);
1471     removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG);
1472   }
1473 
1474   return Changed;
1475 }
1476 
1477 bool FPPassManager::runOnModule(Module &M) {
1478   bool Changed = false;
1479 
1480   for (Function &F : M)
1481     Changed |= runOnFunction(F);
1482 
1483   return Changed;
1484 }
1485 
1486 bool FPPassManager::doInitialization(Module &M) {
1487   bool Changed = false;
1488 
1489   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1490     Changed |= getContainedPass(Index)->doInitialization(M);
1491 
1492   return Changed;
1493 }
1494 
1495 bool FPPassManager::doFinalization(Module &M) {
1496   bool Changed = false;
1497 
1498   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1499     Changed |= getContainedPass(Index)->doFinalization(M);
1500 
1501   return Changed;
1502 }
1503 
1504 //===----------------------------------------------------------------------===//
1505 // MPPassManager implementation
1506 
1507 /// Execute all of the passes scheduled for execution by invoking
1508 /// runOnModule method.  Keep track of whether any of the passes modifies
1509 /// the module, and if so, return true.
1510 bool
1511 MPPassManager::runOnModule(Module &M) {
1512   llvm::TimeTraceScope TimeScope("OptModule", M.getName());
1513 
1514   bool Changed = false;
1515 
1516   // Initialize on-the-fly passes
1517   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1518     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1519     Changed |= FPP->doInitialization(M);
1520   }
1521 
1522   // Initialize module passes
1523   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1524     Changed |= getContainedPass(Index)->doInitialization(M);
1525 
1526   unsigned InstrCount;
1527   StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1528   bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1529   // Collect the initial size of the module.
1530   if (EmitICRemark)
1531     InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1532 
1533   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1534     ModulePass *MP = getContainedPass(Index);
1535     bool LocalChanged = false;
1536 
1537     dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1538     dumpRequiredSet(MP);
1539 
1540     initializeAnalysisImpl(MP);
1541 
1542     {
1543       PassManagerPrettyStackEntry X(MP, M);
1544       TimeRegion PassTimer(getPassTimer(MP));
1545 
1546 #ifdef EXPENSIVE_CHECKS
1547       uint64_t RefHash = StructuralHash(M);
1548 #endif
1549 
1550       LocalChanged |= MP->runOnModule(M);
1551 
1552 #ifdef EXPENSIVE_CHECKS
1553       assert((LocalChanged || (RefHash == StructuralHash(M))) &&
1554              "Pass modifies its input and doesn't report it.");
1555 #endif
1556 
1557       if (EmitICRemark) {
1558         // Update the size of the module.
1559         unsigned ModuleCount = M.getInstructionCount();
1560         if (ModuleCount != InstrCount) {
1561           int64_t Delta = static_cast<int64_t>(ModuleCount) -
1562                           static_cast<int64_t>(InstrCount);
1563           emitInstrCountChangedRemark(MP, M, Delta, InstrCount,
1564                                       FunctionToInstrCount);
1565           InstrCount = ModuleCount;
1566         }
1567       }
1568     }
1569 
1570     Changed |= LocalChanged;
1571     if (LocalChanged)
1572       dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1573                    M.getModuleIdentifier());
1574     dumpPreservedSet(MP);
1575     dumpUsedSet(MP);
1576 
1577     verifyPreservedAnalysis(MP);
1578     if (LocalChanged)
1579       removeNotPreservedAnalysis(MP);
1580     recordAvailableAnalysis(MP);
1581     removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1582   }
1583 
1584   // Finalize module passes
1585   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1586     Changed |= getContainedPass(Index)->doFinalization(M);
1587 
1588   // Finalize on-the-fly passes
1589   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1590     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1591     // We don't know when is the last time an on-the-fly pass is run,
1592     // so we need to releaseMemory / finalize here
1593     FPP->releaseMemoryOnTheFly();
1594     Changed |= FPP->doFinalization(M);
1595   }
1596 
1597   return Changed;
1598 }
1599 
1600 /// Add RequiredPass into list of lower level passes required by pass P.
1601 /// RequiredPass is run on the fly by Pass Manager when P requests it
1602 /// through getAnalysis interface.
1603 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1604   assert(RequiredPass && "No required pass?");
1605   assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1606          "Unable to handle Pass that requires lower level Analysis pass");
1607   assert((P->getPotentialPassManagerType() <
1608           RequiredPass->getPotentialPassManagerType()) &&
1609          "Unable to handle Pass that requires lower level Analysis pass");
1610 
1611   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1612   if (!FPP) {
1613     FPP = new legacy::FunctionPassManagerImpl();
1614     // FPP is the top level manager.
1615     FPP->setTopLevelManager(FPP);
1616 
1617     OnTheFlyManagers[P] = FPP;
1618   }
1619   const PassInfo *RequiredPassPI =
1620       TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1621 
1622   Pass *FoundPass = nullptr;
1623   if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1624     FoundPass =
1625       ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1626   }
1627   if (!FoundPass) {
1628     FoundPass = RequiredPass;
1629     // This should be guaranteed to add RequiredPass to the passmanager given
1630     // that we checked for an available analysis above.
1631     FPP->add(RequiredPass);
1632   }
1633   // Register P as the last user of FoundPass or RequiredPass.
1634   SmallVector<Pass *, 1> LU;
1635   LU.push_back(FoundPass);
1636   FPP->setLastUser(LU,  P);
1637 }
1638 
1639 /// Return function pass corresponding to PassInfo PI, that is
1640 /// required by module pass MP. Instantiate analysis pass, by using
1641 /// its runOnFunction() for function F.
1642 std::tuple<Pass *, bool> MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI,
1643                                                         Function &F) {
1644   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1645   assert(FPP && "Unable to find on the fly pass");
1646 
1647   FPP->releaseMemoryOnTheFly();
1648   bool Changed = FPP->run(F);
1649   return std::make_tuple(((PMTopLevelManager *)FPP)->findAnalysisPass(PI),
1650                          Changed);
1651 }
1652 
1653 namespace llvm {
1654 namespace legacy {
1655 
1656 //===----------------------------------------------------------------------===//
1657 // PassManager implementation
1658 
1659 /// Create new pass manager
1660 PassManager::PassManager() {
1661   PM = new PassManagerImpl();
1662   // PM is the top level manager
1663   PM->setTopLevelManager(PM);
1664 }
1665 
1666 PassManager::~PassManager() {
1667   delete PM;
1668 }
1669 
1670 void PassManager::add(Pass *P) {
1671   PM->add(P);
1672 }
1673 
1674 /// run - Execute all of the passes scheduled for execution.  Keep track of
1675 /// whether any of the passes modifies the module, and if so, return true.
1676 bool PassManager::run(Module &M) {
1677   return PM->run(M);
1678 }
1679 } // namespace legacy
1680 } // namespace llvm
1681 
1682 //===----------------------------------------------------------------------===//
1683 // PMStack implementation
1684 //
1685 
1686 // Pop Pass Manager from the stack and clear its analysis info.
1687 void PMStack::pop() {
1688 
1689   PMDataManager *Top = this->top();
1690   Top->initializeAnalysisInfo();
1691 
1692   S.pop_back();
1693 }
1694 
1695 // Push PM on the stack and set its top level manager.
1696 void PMStack::push(PMDataManager *PM) {
1697   assert(PM && "Unable to push. Pass Manager expected");
1698   assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1699 
1700   if (!this->empty()) {
1701     assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1702            && "pushing bad pass manager to PMStack");
1703     PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1704 
1705     assert(TPM && "Unable to find top level manager");
1706     TPM->addIndirectPassManager(PM);
1707     PM->setTopLevelManager(TPM);
1708     PM->setDepth(this->top()->getDepth()+1);
1709   } else {
1710     assert((PM->getPassManagerType() == PMT_ModulePassManager
1711            || PM->getPassManagerType() == PMT_FunctionPassManager)
1712            && "pushing bad pass manager to PMStack");
1713     PM->setDepth(1);
1714   }
1715 
1716   S.push_back(PM);
1717 }
1718 
1719 // Dump content of the pass manager stack.
1720 LLVM_DUMP_METHOD void PMStack::dump() const {
1721   for (PMDataManager *Manager : S)
1722     dbgs() << Manager->getAsPass()->getPassName() << ' ';
1723 
1724   if (!S.empty())
1725     dbgs() << '\n';
1726 }
1727 
1728 /// Find appropriate Module Pass Manager in the PM Stack and
1729 /// add self into that manager.
1730 void ModulePass::assignPassManager(PMStack &PMS,
1731                                    PassManagerType PreferredType) {
1732   // Find Module Pass Manager
1733   PassManagerType T;
1734   while ((T = PMS.top()->getPassManagerType()) > PMT_ModulePassManager &&
1735          T != PreferredType)
1736     PMS.pop();
1737   PMS.top()->add(this);
1738 }
1739 
1740 /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1741 /// in the PM Stack and add self into that manager.
1742 void FunctionPass::assignPassManager(PMStack &PMS,
1743                                      PassManagerType /*PreferredType*/) {
1744   // Find Function Pass Manager
1745   PMDataManager *PM;
1746   while (PM = PMS.top(), PM->getPassManagerType() > PMT_FunctionPassManager)
1747     PMS.pop();
1748 
1749   // Create new Function Pass Manager if needed.
1750   if (PM->getPassManagerType() != PMT_FunctionPassManager) {
1751     // [1] Create new Function Pass Manager
1752     auto *FPP = new FPPassManager;
1753     FPP->populateInheritedAnalysis(PMS);
1754 
1755     // [2] Set up new manager's top level manager
1756     PM->getTopLevelManager()->addIndirectPassManager(FPP);
1757 
1758     // [3] Assign manager to manage this new manager. This may create
1759     // and push new managers into PMS
1760     FPP->assignPassManager(PMS, PM->getPassManagerType());
1761 
1762     // [4] Push new manager into PMS
1763     PMS.push(FPP);
1764     PM = FPP;
1765   }
1766 
1767   // Assign FPP as the manager of this pass.
1768   PM->add(this);
1769 }
1770 
1771 legacy::PassManagerBase::~PassManagerBase() {}
1772