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 //===----------------------------------------------------------------------===//
246 // FunctionPassManagerImpl
247 //
248 /// FunctionPassManagerImpl manages FPPassManagers
249 class FunctionPassManagerImpl : public Pass,
250                                 public PMDataManager,
251                                 public PMTopLevelManager {
252   virtual void anchor();
253 private:
254   bool wasRun;
255 public:
256   static char ID;
257   explicit FunctionPassManagerImpl() :
258     Pass(PT_PassManager, ID), PMDataManager(),
259     PMTopLevelManager(new FPPassManager()), wasRun(false) {}
260 
261   /// \copydoc FunctionPassManager::add()
262   void add(Pass *P) {
263     schedulePass(P);
264   }
265 
266   /// createPrinterPass - Get a function printer pass.
267   Pass *createPrinterPass(raw_ostream &O,
268                           const std::string &Banner) const override {
269     return createPrintFunctionPass(O, Banner);
270   }
271 
272   // Prepare for running an on the fly pass, freeing memory if needed
273   // from a previous run.
274   void releaseMemoryOnTheFly();
275 
276   /// run - Execute all of the passes scheduled for execution.  Keep track of
277   /// whether any of the passes modifies the module, and if so, return true.
278   bool run(Function &F);
279 
280   /// doInitialization - Run all of the initializers for the function passes.
281   ///
282   bool doInitialization(Module &M) override;
283 
284   /// doFinalization - Run all of the finalizers for the function passes.
285   ///
286   bool doFinalization(Module &M) override;
287 
288 
289   PMDataManager *getAsPMDataManager() override { return this; }
290   Pass *getAsPass() override { return this; }
291   PassManagerType getTopLevelPassManagerType() override {
292     return PMT_FunctionPassManager;
293   }
294 
295   /// Pass Manager itself does not invalidate any analysis info.
296   void getAnalysisUsage(AnalysisUsage &Info) const override {
297     Info.setPreservesAll();
298   }
299 
300   FPPassManager *getContainedManager(unsigned N) {
301     assert(N < PassManagers.size() && "Pass number out of range!");
302     FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
303     return FP;
304   }
305 
306   void dumpPassStructure(unsigned Offset) override {
307     for (unsigned I = 0; I < getNumContainedManagers(); ++I)
308       getContainedManager(I)->dumpPassStructure(Offset);
309   }
310 };
311 
312 void FunctionPassManagerImpl::anchor() {}
313 
314 char FunctionPassManagerImpl::ID = 0;
315 
316 //===----------------------------------------------------------------------===//
317 // FunctionPassManagerImpl implementation
318 //
319 bool FunctionPassManagerImpl::doInitialization(Module &M) {
320   bool Changed = false;
321 
322   dumpArguments();
323   dumpPasses();
324 
325   for (ImmutablePass *ImPass : getImmutablePasses())
326     Changed |= ImPass->doInitialization(M);
327 
328   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
329     Changed |= getContainedManager(Index)->doInitialization(M);
330 
331   return Changed;
332 }
333 
334 bool FunctionPassManagerImpl::doFinalization(Module &M) {
335   bool Changed = false;
336 
337   for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index)
338     Changed |= getContainedManager(Index)->doFinalization(M);
339 
340   for (ImmutablePass *ImPass : getImmutablePasses())
341     Changed |= ImPass->doFinalization(M);
342 
343   return Changed;
344 }
345 
346 void FunctionPassManagerImpl::releaseMemoryOnTheFly() {
347   if (!wasRun)
348     return;
349   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
350     FPPassManager *FPPM = getContainedManager(Index);
351     for (unsigned Index = 0; Index < FPPM->getNumContainedPasses(); ++Index) {
352       FPPM->getContainedPass(Index)->releaseMemory();
353     }
354   }
355   wasRun = false;
356 }
357 
358 // Execute all the passes managed by this top level manager.
359 // Return true if any function is modified by a pass.
360 bool FunctionPassManagerImpl::run(Function &F) {
361   bool Changed = false;
362 
363   initializeAllAnalysisInfo();
364   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
365     Changed |= getContainedManager(Index)->runOnFunction(F);
366     F.getContext().yield();
367   }
368 
369   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
370     getContainedManager(Index)->cleanup();
371 
372   wasRun = true;
373   return Changed;
374 }
375 } // namespace legacy
376 } // namespace llvm
377 
378 namespace {
379 //===----------------------------------------------------------------------===//
380 // MPPassManager
381 //
382 /// MPPassManager manages ModulePasses and function pass managers.
383 /// It batches all Module passes and function pass managers together and
384 /// sequences them to process one module.
385 class MPPassManager : public Pass, public PMDataManager {
386 public:
387   static char ID;
388   explicit MPPassManager() :
389     Pass(PT_PassManager, ID), PMDataManager() { }
390 
391   // Delete on the fly managers.
392   ~MPPassManager() override {
393     for (auto &OnTheFlyManager : OnTheFlyManagers) {
394       legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
395       delete FPP;
396     }
397   }
398 
399   /// createPrinterPass - Get a module printer pass.
400   Pass *createPrinterPass(raw_ostream &O,
401                           const std::string &Banner) const override {
402     return createPrintModulePass(O, Banner);
403   }
404 
405   /// run - Execute all of the passes scheduled for execution.  Keep track of
406   /// whether any of the passes modifies the module, and if so, return true.
407   bool runOnModule(Module &M);
408 
409   using llvm::Pass::doInitialization;
410   using llvm::Pass::doFinalization;
411 
412   /// Pass Manager itself does not invalidate any analysis info.
413   void getAnalysisUsage(AnalysisUsage &Info) const override {
414     Info.setPreservesAll();
415   }
416 
417   /// Add RequiredPass into list of lower level passes required by pass P.
418   /// RequiredPass is run on the fly by Pass Manager when P requests it
419   /// through getAnalysis interface.
420   void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override;
421 
422   /// Return function pass corresponding to PassInfo PI, that is
423   /// required by module pass MP. Instantiate analysis pass, by using
424   /// its runOnFunction() for function F.
425   std::tuple<Pass *, bool> getOnTheFlyPass(Pass *MP, AnalysisID PI,
426                                            Function &F) override;
427 
428   StringRef getPassName() const override { return "Module Pass Manager"; }
429 
430   PMDataManager *getAsPMDataManager() override { return this; }
431   Pass *getAsPass() override { return this; }
432 
433   // Print passes managed by this manager
434   void dumpPassStructure(unsigned Offset) override {
435     dbgs().indent(Offset*2) << "ModulePass Manager\n";
436     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
437       ModulePass *MP = getContainedPass(Index);
438       MP->dumpPassStructure(Offset + 1);
439       MapVector<Pass *, legacy::FunctionPassManagerImpl *>::const_iterator I =
440           OnTheFlyManagers.find(MP);
441       if (I != OnTheFlyManagers.end())
442         I->second->dumpPassStructure(Offset + 2);
443       dumpLastUses(MP, Offset+1);
444     }
445   }
446 
447   ModulePass *getContainedPass(unsigned N) {
448     assert(N < PassVector.size() && "Pass number out of range!");
449     return static_cast<ModulePass *>(PassVector[N]);
450   }
451 
452   PassManagerType getPassManagerType() const override {
453     return PMT_ModulePassManager;
454   }
455 
456  private:
457   /// Collection of on the fly FPPassManagers. These managers manage
458   /// function passes that are required by module passes.
459    MapVector<Pass *, legacy::FunctionPassManagerImpl *> OnTheFlyManagers;
460 };
461 
462 char MPPassManager::ID = 0;
463 } // End anonymous namespace
464 
465 namespace llvm {
466 namespace legacy {
467 //===----------------------------------------------------------------------===//
468 // PassManagerImpl
469 //
470 
471 /// PassManagerImpl manages MPPassManagers
472 class PassManagerImpl : public Pass,
473                         public PMDataManager,
474                         public PMTopLevelManager {
475   virtual void anchor();
476 
477 public:
478   static char ID;
479   explicit PassManagerImpl() :
480     Pass(PT_PassManager, ID), PMDataManager(),
481                               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 = P->createPrinterPass(
749         dbgs(), ("*** IR Dump Before " + P->getPassName() + " ***").str());
750     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
751   }
752 
753   // Add the requested pass to the best available pass manager.
754   P->assignPassManager(activeStack, getTopLevelPassManagerType());
755 
756   if (PI && !PI->isAnalysis() && shouldPrintAfterPass(PI->getPassArgument())) {
757     Pass *PP = P->createPrinterPass(
758         dbgs(), ("*** IR Dump After " + P->getPassName() + " ***").str());
759     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
760   }
761 }
762 
763 /// Find the pass that implements Analysis AID. Search immutable
764 /// passes and all pass managers. If desired pass is not found
765 /// then return NULL.
766 Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
767   // For immutable passes we have a direct mapping from ID to pass, so check
768   // that first.
769   if (Pass *P = ImmutablePassMap.lookup(AID))
770     return P;
771 
772   // Check pass managers
773   for (PMDataManager *PassManager : PassManagers)
774     if (Pass *P = PassManager->findAnalysisPass(AID, false))
775       return P;
776 
777   // Check other pass managers
778   for (PMDataManager *IndirectPassManager : IndirectPassManagers)
779     if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
780       return P;
781 
782   return nullptr;
783 }
784 
785 const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const {
786   const PassInfo *&PI = AnalysisPassInfos[AID];
787   if (!PI)
788     PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
789   else
790     assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) &&
791            "The pass info pointer changed for an analysis ID!");
792 
793   return PI;
794 }
795 
796 void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
797   P->initializePass();
798   ImmutablePasses.push_back(P);
799 
800   // Add this pass to the map from its analysis ID. We clobber any prior runs
801   // of the pass in the map so that the last one added is the one found when
802   // doing lookups.
803   AnalysisID AID = P->getPassID();
804   ImmutablePassMap[AID] = P;
805 
806   // Also add any interfaces implemented by the immutable pass to the map for
807   // fast lookup.
808   const PassInfo *PassInf = findAnalysisPassInfo(AID);
809   assert(PassInf && "Expected all immutable passes to be initialized");
810   for (const PassInfo *ImmPI : PassInf->getInterfacesImplemented())
811     ImmutablePassMap[ImmPI->getTypeInfo()] = P;
812 }
813 
814 // Print passes managed by this top level manager.
815 void PMTopLevelManager::dumpPasses() const {
816 
817   if (PassDebugging < Structure)
818     return;
819 
820   // Print out the immutable passes
821   for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
822     ImmutablePasses[i]->dumpPassStructure(0);
823   }
824 
825   // Every class that derives from PMDataManager also derives from Pass
826   // (sometimes indirectly), but there's no inheritance relationship
827   // between PMDataManager and Pass, so we have to getAsPass to get
828   // from a PMDataManager* to a Pass*.
829   for (PMDataManager *Manager : PassManagers)
830     Manager->getAsPass()->dumpPassStructure(1);
831 }
832 
833 void PMTopLevelManager::dumpArguments() const {
834 
835   if (PassDebugging < Arguments)
836     return;
837 
838   dbgs() << "Pass Arguments: ";
839   for (ImmutablePass *P : ImmutablePasses)
840     if (const PassInfo *PI = findAnalysisPassInfo(P->getPassID())) {
841       assert(PI && "Expected all immutable passes to be initialized");
842       if (!PI->isAnalysisGroup())
843         dbgs() << " -" << PI->getPassArgument();
844     }
845   for (PMDataManager *PM : PassManagers)
846     PM->dumpPassArguments();
847   dbgs() << "\n";
848 }
849 
850 void PMTopLevelManager::initializeAllAnalysisInfo() {
851   for (PMDataManager *PM : PassManagers)
852     PM->initializeAnalysisInfo();
853 
854   // Initailize other pass managers
855   for (PMDataManager *IPM : IndirectPassManagers)
856     IPM->initializeAnalysisInfo();
857 }
858 
859 /// Destructor
860 PMTopLevelManager::~PMTopLevelManager() {
861   for (PMDataManager *PM : PassManagers)
862     delete PM;
863 
864   for (ImmutablePass *P : ImmutablePasses)
865     delete P;
866 }
867 
868 //===----------------------------------------------------------------------===//
869 // PMDataManager implementation
870 
871 /// Augement AvailableAnalysis by adding analysis made available by pass P.
872 void PMDataManager::recordAvailableAnalysis(Pass *P) {
873   AnalysisID PI = P->getPassID();
874 
875   AvailableAnalysis[PI] = P;
876 
877   assert(!AvailableAnalysis.empty());
878 
879   // This pass is the current implementation of all of the interfaces it
880   // implements as well.
881   const PassInfo *PInf = TPM->findAnalysisPassInfo(PI);
882   if (!PInf) return;
883   const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented();
884   for (unsigned i = 0, e = II.size(); i != e; ++i)
885     AvailableAnalysis[II[i]->getTypeInfo()] = P;
886 }
887 
888 // Return true if P preserves high level analysis used by other
889 // passes managed by this manager
890 bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
891   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
892   if (AnUsage->getPreservesAll())
893     return true;
894 
895   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
896   for (Pass *P1 : HigherLevelAnalysis) {
897     if (P1->getAsImmutablePass() == nullptr &&
898         !is_contained(PreservedSet, P1->getPassID()))
899       return false;
900   }
901 
902   return true;
903 }
904 
905 /// verifyPreservedAnalysis -- Verify analysis preserved by pass P.
906 void PMDataManager::verifyPreservedAnalysis(Pass *P) {
907   // Don't do this unless assertions are enabled.
908 #ifdef NDEBUG
909   return;
910 #endif
911   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
912   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
913 
914   // Verify preserved analysis
915   for (AnalysisID AID : PreservedSet) {
916     if (Pass *AP = findAnalysisPass(AID, true)) {
917       TimeRegion PassTimer(getPassTimer(AP));
918       AP->verifyAnalysis();
919     }
920   }
921 }
922 
923 /// Remove Analysis not preserved by Pass P
924 void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
925   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
926   if (AnUsage->getPreservesAll())
927     return;
928 
929   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
930   for (DenseMap<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
931          E = AvailableAnalysis.end(); I != E; ) {
932     DenseMap<AnalysisID, Pass*>::iterator Info = I++;
933     if (Info->second->getAsImmutablePass() == nullptr &&
934         !is_contained(PreservedSet, Info->first)) {
935       // Remove this analysis
936       if (PassDebugging >= Details) {
937         Pass *S = Info->second;
938         dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
939         dbgs() << S->getPassName() << "'\n";
940       }
941       AvailableAnalysis.erase(Info);
942     }
943   }
944 
945   // Check inherited analysis also. If P is not preserving analysis
946   // provided by parent manager then remove it here.
947   for (unsigned Index = 0; Index < PMT_Last; ++Index) {
948 
949     if (!InheritedAnalysis[Index])
950       continue;
951 
952     for (DenseMap<AnalysisID, Pass*>::iterator
953            I = InheritedAnalysis[Index]->begin(),
954            E = InheritedAnalysis[Index]->end(); I != E; ) {
955       DenseMap<AnalysisID, Pass *>::iterator Info = I++;
956       if (Info->second->getAsImmutablePass() == nullptr &&
957           !is_contained(PreservedSet, Info->first)) {
958         // Remove this analysis
959         if (PassDebugging >= Details) {
960           Pass *S = Info->second;
961           dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
962           dbgs() << S->getPassName() << "'\n";
963         }
964         InheritedAnalysis[Index]->erase(Info);
965       }
966     }
967   }
968 }
969 
970 /// Remove analysis passes that are not used any longer
971 void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
972                                      enum PassDebuggingString DBG_STR) {
973 
974   SmallVector<Pass *, 12> DeadPasses;
975 
976   // If this is a on the fly manager then it does not have TPM.
977   if (!TPM)
978     return;
979 
980   TPM->collectLastUses(DeadPasses, P);
981 
982   if (PassDebugging >= Details && !DeadPasses.empty()) {
983     dbgs() << " -*- '" <<  P->getPassName();
984     dbgs() << "' is the last user of following pass instances.";
985     dbgs() << " Free these instances\n";
986   }
987 
988   for (Pass *P : DeadPasses)
989     freePass(P, Msg, DBG_STR);
990 }
991 
992 void PMDataManager::freePass(Pass *P, StringRef Msg,
993                              enum PassDebuggingString DBG_STR) {
994   dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
995 
996   {
997     // If the pass crashes releasing memory, remember this.
998     PassManagerPrettyStackEntry X(P);
999     TimeRegion PassTimer(getPassTimer(P));
1000 
1001     P->releaseMemory();
1002   }
1003 
1004   AnalysisID PI = P->getPassID();
1005   if (const PassInfo *PInf = TPM->findAnalysisPassInfo(PI)) {
1006     // Remove the pass itself (if it is not already removed).
1007     AvailableAnalysis.erase(PI);
1008 
1009     // Remove all interfaces this pass implements, for which it is also
1010     // listed as the available implementation.
1011     const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented();
1012     for (unsigned i = 0, e = II.size(); i != e; ++i) {
1013       DenseMap<AnalysisID, Pass*>::iterator Pos =
1014         AvailableAnalysis.find(II[i]->getTypeInfo());
1015       if (Pos != AvailableAnalysis.end() && Pos->second == P)
1016         AvailableAnalysis.erase(Pos);
1017     }
1018   }
1019 }
1020 
1021 /// Add pass P into the PassVector. Update
1022 /// AvailableAnalysis appropriately if ProcessAnalysis is true.
1023 void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
1024   // This manager is going to manage pass P. Set up analysis resolver
1025   // to connect them.
1026   AnalysisResolver *AR = new AnalysisResolver(*this);
1027   P->setResolver(AR);
1028 
1029   // If a FunctionPass F is the last user of ModulePass info M
1030   // then the F's manager, not F, records itself as a last user of M.
1031   SmallVector<Pass *, 12> TransferLastUses;
1032 
1033   if (!ProcessAnalysis) {
1034     // Add pass
1035     PassVector.push_back(P);
1036     return;
1037   }
1038 
1039   // At the moment, this pass is the last user of all required passes.
1040   SmallVector<Pass *, 12> LastUses;
1041   SmallVector<Pass *, 8> UsedPasses;
1042   SmallVector<AnalysisID, 8> ReqAnalysisNotAvailable;
1043 
1044   unsigned PDepth = this->getDepth();
1045 
1046   collectRequiredAndUsedAnalyses(UsedPasses, ReqAnalysisNotAvailable, P);
1047   for (Pass *PUsed : UsedPasses) {
1048     unsigned RDepth = 0;
1049 
1050     assert(PUsed->getResolver() && "Analysis Resolver is not set");
1051     PMDataManager &DM = PUsed->getResolver()->getPMDataManager();
1052     RDepth = DM.getDepth();
1053 
1054     if (PDepth == RDepth)
1055       LastUses.push_back(PUsed);
1056     else if (PDepth > RDepth) {
1057       // Let the parent claim responsibility of last use
1058       TransferLastUses.push_back(PUsed);
1059       // Keep track of higher level analysis used by this manager.
1060       HigherLevelAnalysis.push_back(PUsed);
1061     } else
1062       llvm_unreachable("Unable to accommodate Used Pass");
1063   }
1064 
1065   // Set P as P's last user until someone starts using P.
1066   // However, if P is a Pass Manager then it does not need
1067   // to record its last user.
1068   if (!P->getAsPMDataManager())
1069     LastUses.push_back(P);
1070   TPM->setLastUser(LastUses, P);
1071 
1072   if (!TransferLastUses.empty()) {
1073     Pass *My_PM = getAsPass();
1074     TPM->setLastUser(TransferLastUses, My_PM);
1075     TransferLastUses.clear();
1076   }
1077 
1078   // Now, take care of required analyses that are not available.
1079   for (AnalysisID ID : ReqAnalysisNotAvailable) {
1080     const PassInfo *PI = TPM->findAnalysisPassInfo(ID);
1081     Pass *AnalysisPass = PI->createPass();
1082     this->addLowerLevelRequiredPass(P, AnalysisPass);
1083   }
1084 
1085   // Take a note of analysis required and made available by this pass.
1086   // Remove the analysis not preserved by this pass
1087   removeNotPreservedAnalysis(P);
1088   recordAvailableAnalysis(P);
1089 
1090   // Add pass
1091   PassVector.push_back(P);
1092 }
1093 
1094 
1095 /// Populate UP with analysis pass that are used or required by
1096 /// pass P and are available. Populate RP_NotAvail with analysis
1097 /// pass that are required by pass P but are not available.
1098 void PMDataManager::collectRequiredAndUsedAnalyses(
1099     SmallVectorImpl<Pass *> &UP, SmallVectorImpl<AnalysisID> &RP_NotAvail,
1100     Pass *P) {
1101   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1102 
1103   for (const auto &UsedID : AnUsage->getUsedSet())
1104     if (Pass *AnalysisPass = findAnalysisPass(UsedID, true))
1105       UP.push_back(AnalysisPass);
1106 
1107   for (const auto &RequiredID : AnUsage->getRequiredSet())
1108     if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true))
1109       UP.push_back(AnalysisPass);
1110     else
1111       RP_NotAvail.push_back(RequiredID);
1112 }
1113 
1114 // All Required analyses should be available to the pass as it runs!  Here
1115 // we fill in the AnalysisImpls member of the pass so that it can
1116 // successfully use the getAnalysis() method to retrieve the
1117 // implementations it needs.
1118 //
1119 void PMDataManager::initializeAnalysisImpl(Pass *P) {
1120   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1121 
1122   for (const AnalysisID ID : AnUsage->getRequiredSet()) {
1123     Pass *Impl = findAnalysisPass(ID, true);
1124     if (!Impl)
1125       // This may be analysis pass that is initialized on the fly.
1126       // If that is not the case then it will raise an assert when it is used.
1127       continue;
1128     AnalysisResolver *AR = P->getResolver();
1129     assert(AR && "Analysis Resolver is not set");
1130     AR->addAnalysisImplsPair(ID, Impl);
1131   }
1132 }
1133 
1134 /// Find the pass that implements Analysis AID. If desired pass is not found
1135 /// then return NULL.
1136 Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
1137 
1138   // Check if AvailableAnalysis map has one entry.
1139   DenseMap<AnalysisID, Pass*>::const_iterator I =  AvailableAnalysis.find(AID);
1140 
1141   if (I != AvailableAnalysis.end())
1142     return I->second;
1143 
1144   // Search Parents through TopLevelManager
1145   if (SearchParent)
1146     return TPM->findAnalysisPass(AID);
1147 
1148   return nullptr;
1149 }
1150 
1151 // Print list of passes that are last used by P.
1152 void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
1153   if (PassDebugging < Details)
1154     return;
1155 
1156   SmallVector<Pass *, 12> LUses;
1157 
1158   // If this is a on the fly manager then it does not have TPM.
1159   if (!TPM)
1160     return;
1161 
1162   TPM->collectLastUses(LUses, P);
1163 
1164   for (Pass *P : LUses) {
1165     dbgs() << "--" << std::string(Offset*2, ' ');
1166     P->dumpPassStructure(0);
1167   }
1168 }
1169 
1170 void PMDataManager::dumpPassArguments() const {
1171   for (Pass *P : PassVector) {
1172     if (PMDataManager *PMD = P->getAsPMDataManager())
1173       PMD->dumpPassArguments();
1174     else
1175       if (const PassInfo *PI =
1176             TPM->findAnalysisPassInfo(P->getPassID()))
1177         if (!PI->isAnalysisGroup())
1178           dbgs() << " -" << PI->getPassArgument();
1179   }
1180 }
1181 
1182 void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
1183                                  enum PassDebuggingString S2,
1184                                  StringRef Msg) {
1185   if (PassDebugging < Executions)
1186     return;
1187   dbgs() << "[" << std::chrono::system_clock::now() << "] " << (void *)this
1188          << std::string(getDepth() * 2 + 1, ' ');
1189   switch (S1) {
1190   case EXECUTION_MSG:
1191     dbgs() << "Executing Pass '" << P->getPassName();
1192     break;
1193   case MODIFICATION_MSG:
1194     dbgs() << "Made Modification '" << P->getPassName();
1195     break;
1196   case FREEING_MSG:
1197     dbgs() << " Freeing Pass '" << P->getPassName();
1198     break;
1199   default:
1200     break;
1201   }
1202   switch (S2) {
1203   case ON_FUNCTION_MSG:
1204     dbgs() << "' on Function '" << Msg << "'...\n";
1205     break;
1206   case ON_MODULE_MSG:
1207     dbgs() << "' on Module '"  << Msg << "'...\n";
1208     break;
1209   case ON_REGION_MSG:
1210     dbgs() << "' on Region '"  << Msg << "'...\n";
1211     break;
1212   case ON_LOOP_MSG:
1213     dbgs() << "' on Loop '" << Msg << "'...\n";
1214     break;
1215   case ON_CG_MSG:
1216     dbgs() << "' on Call Graph Nodes '" << Msg << "'...\n";
1217     break;
1218   default:
1219     break;
1220   }
1221 }
1222 
1223 void PMDataManager::dumpRequiredSet(const Pass *P) const {
1224   if (PassDebugging < Details)
1225     return;
1226 
1227   AnalysisUsage analysisUsage;
1228   P->getAnalysisUsage(analysisUsage);
1229   dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet());
1230 }
1231 
1232 void PMDataManager::dumpPreservedSet(const Pass *P) const {
1233   if (PassDebugging < Details)
1234     return;
1235 
1236   AnalysisUsage analysisUsage;
1237   P->getAnalysisUsage(analysisUsage);
1238   dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet());
1239 }
1240 
1241 void PMDataManager::dumpUsedSet(const Pass *P) const {
1242   if (PassDebugging < Details)
1243     return;
1244 
1245   AnalysisUsage analysisUsage;
1246   P->getAnalysisUsage(analysisUsage);
1247   dumpAnalysisUsage("Used", P, analysisUsage.getUsedSet());
1248 }
1249 
1250 void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,
1251                                    const AnalysisUsage::VectorType &Set) const {
1252   assert(PassDebugging >= Details);
1253   if (Set.empty())
1254     return;
1255   dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
1256   for (unsigned i = 0; i != Set.size(); ++i) {
1257     if (i) dbgs() << ',';
1258     const PassInfo *PInf = TPM->findAnalysisPassInfo(Set[i]);
1259     if (!PInf) {
1260       // Some preserved passes, such as AliasAnalysis, may not be initialized by
1261       // all drivers.
1262       dbgs() << " Uninitialized Pass";
1263       continue;
1264     }
1265     dbgs() << ' ' << PInf->getPassName();
1266   }
1267   dbgs() << '\n';
1268 }
1269 
1270 /// Add RequiredPass into list of lower level passes required by pass P.
1271 /// RequiredPass is run on the fly by Pass Manager when P requests it
1272 /// through getAnalysis interface.
1273 /// This should be handled by specific pass manager.
1274 void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1275   if (TPM) {
1276     TPM->dumpArguments();
1277     TPM->dumpPasses();
1278   }
1279 
1280   // Module Level pass may required Function Level analysis info
1281   // (e.g. dominator info). Pass manager uses on the fly function pass manager
1282   // to provide this on demand. In that case, in Pass manager terminology,
1283   // module level pass is requiring lower level analysis info managed by
1284   // lower level pass manager.
1285 
1286   // When Pass manager is not able to order required analysis info, Pass manager
1287   // checks whether any lower level manager will be able to provide this
1288   // analysis info on demand or not.
1289 #ifndef NDEBUG
1290   dbgs() << "Unable to schedule '" << RequiredPass->getPassName();
1291   dbgs() << "' required by '" << P->getPassName() << "'\n";
1292 #endif
1293   llvm_unreachable("Unable to schedule pass");
1294 }
1295 
1296 std::tuple<Pass *, bool> PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI,
1297                                                         Function &F) {
1298   llvm_unreachable("Unable to find on the fly pass");
1299 }
1300 
1301 // Destructor
1302 PMDataManager::~PMDataManager() {
1303   for (Pass *P : PassVector)
1304     delete P;
1305 }
1306 
1307 //===----------------------------------------------------------------------===//
1308 // NOTE: Is this the right place to define this method ?
1309 // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist.
1310 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID) const {
1311   return PM.findAnalysisPass(ID, true);
1312 }
1313 
1314 std::tuple<Pass *, bool>
1315 AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI, Function &F) {
1316   return PM.getOnTheFlyPass(P, AnalysisPI, F);
1317 }
1318 
1319 namespace llvm {
1320 namespace legacy {
1321 
1322 //===----------------------------------------------------------------------===//
1323 // FunctionPassManager implementation
1324 
1325 /// Create new Function pass manager
1326 FunctionPassManager::FunctionPassManager(Module *m) : M(m) {
1327   FPM = new legacy::FunctionPassManagerImpl();
1328   // FPM is the top level manager.
1329   FPM->setTopLevelManager(FPM);
1330 
1331   AnalysisResolver *AR = new AnalysisResolver(*FPM);
1332   FPM->setResolver(AR);
1333 }
1334 
1335 FunctionPassManager::~FunctionPassManager() {
1336   delete FPM;
1337 }
1338 
1339 void FunctionPassManager::add(Pass *P) {
1340   FPM->add(P);
1341 }
1342 
1343 /// run - Execute all of the passes scheduled for execution.  Keep
1344 /// track of whether any of the passes modifies the function, and if
1345 /// so, return true.
1346 ///
1347 bool FunctionPassManager::run(Function &F) {
1348   handleAllErrors(F.materialize(), [&](ErrorInfoBase &EIB) {
1349     report_fatal_error("Error reading bitcode file: " + EIB.message());
1350   });
1351   return FPM->run(F);
1352 }
1353 
1354 
1355 /// doInitialization - Run all of the initializers for the function passes.
1356 ///
1357 bool FunctionPassManager::doInitialization() {
1358   return FPM->doInitialization(*M);
1359 }
1360 
1361 /// doFinalization - Run all of the finalizers for the function passes.
1362 ///
1363 bool FunctionPassManager::doFinalization() {
1364   return FPM->doFinalization(*M);
1365 }
1366 } // namespace legacy
1367 } // namespace llvm
1368 
1369 /// cleanup - After running all passes, clean up pass manager cache.
1370 void FPPassManager::cleanup() {
1371  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1372     FunctionPass *FP = getContainedPass(Index);
1373     AnalysisResolver *AR = FP->getResolver();
1374     assert(AR && "Analysis Resolver is not set");
1375     AR->clearAnalysisImpls();
1376  }
1377 }
1378 
1379 
1380 //===----------------------------------------------------------------------===//
1381 // FPPassManager implementation
1382 
1383 char FPPassManager::ID = 0;
1384 /// Print passes managed by this manager
1385 void FPPassManager::dumpPassStructure(unsigned Offset) {
1386   dbgs().indent(Offset*2) << "FunctionPass Manager\n";
1387   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1388     FunctionPass *FP = getContainedPass(Index);
1389     FP->dumpPassStructure(Offset + 1);
1390     dumpLastUses(FP, Offset+1);
1391   }
1392 }
1393 
1394 /// Execute all of the passes scheduled for execution by invoking
1395 /// runOnFunction method.  Keep track of whether any of the passes modifies
1396 /// the function, and if so, return true.
1397 bool FPPassManager::runOnFunction(Function &F) {
1398   if (F.isDeclaration())
1399     return false;
1400 
1401   bool Changed = false;
1402   Module &M = *F.getParent();
1403   // Collect inherited analysis from Module level pass manager.
1404   populateInheritedAnalysis(TPM->activeStack);
1405 
1406   unsigned InstrCount, FunctionSize = 0;
1407   StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1408   bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1409   // Collect the initial size of the module.
1410   if (EmitICRemark) {
1411     InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1412     FunctionSize = F.getInstructionCount();
1413   }
1414 
1415   llvm::TimeTraceScope FunctionScope("OptFunction", F.getName());
1416 
1417   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1418     FunctionPass *FP = getContainedPass(Index);
1419     bool LocalChanged = false;
1420 
1421     llvm::TimeTraceScope PassScope("RunPass", FP->getPassName());
1422 
1423     dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName());
1424     dumpRequiredSet(FP);
1425 
1426     initializeAnalysisImpl(FP);
1427 
1428     {
1429       PassManagerPrettyStackEntry X(FP, F);
1430       TimeRegion PassTimer(getPassTimer(FP));
1431 #ifdef EXPENSIVE_CHECKS
1432       uint64_t RefHash = StructuralHash(F);
1433 #endif
1434       LocalChanged |= FP->runOnFunction(F);
1435 
1436 #if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
1437       if (!LocalChanged && (RefHash != StructuralHash(F))) {
1438         llvm::errs() << "Pass modifies its input and doesn't report it: "
1439                      << FP->getPassName() << "\n";
1440         llvm_unreachable("Pass modifies its input and doesn't report it");
1441       }
1442 #endif
1443 
1444       if (EmitICRemark) {
1445         unsigned NewSize = F.getInstructionCount();
1446 
1447         // Update the size of the function, emit a remark, and update the size
1448         // of the module.
1449         if (NewSize != FunctionSize) {
1450           int64_t Delta = static_cast<int64_t>(NewSize) -
1451                           static_cast<int64_t>(FunctionSize);
1452           emitInstrCountChangedRemark(FP, M, Delta, InstrCount,
1453                                       FunctionToInstrCount, &F);
1454           InstrCount = static_cast<int64_t>(InstrCount) + Delta;
1455           FunctionSize = NewSize;
1456         }
1457       }
1458     }
1459 
1460     Changed |= LocalChanged;
1461     if (LocalChanged)
1462       dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName());
1463     dumpPreservedSet(FP);
1464     dumpUsedSet(FP);
1465 
1466     verifyPreservedAnalysis(FP);
1467     if (LocalChanged)
1468       removeNotPreservedAnalysis(FP);
1469     recordAvailableAnalysis(FP);
1470     removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG);
1471   }
1472 
1473   return Changed;
1474 }
1475 
1476 bool FPPassManager::runOnModule(Module &M) {
1477   bool Changed = false;
1478 
1479   for (Function &F : M)
1480     Changed |= runOnFunction(F);
1481 
1482   return Changed;
1483 }
1484 
1485 bool FPPassManager::doInitialization(Module &M) {
1486   bool Changed = false;
1487 
1488   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1489     Changed |= getContainedPass(Index)->doInitialization(M);
1490 
1491   return Changed;
1492 }
1493 
1494 bool FPPassManager::doFinalization(Module &M) {
1495   bool Changed = false;
1496 
1497   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1498     Changed |= getContainedPass(Index)->doFinalization(M);
1499 
1500   return Changed;
1501 }
1502 
1503 //===----------------------------------------------------------------------===//
1504 // MPPassManager implementation
1505 
1506 /// Execute all of the passes scheduled for execution by invoking
1507 /// runOnModule method.  Keep track of whether any of the passes modifies
1508 /// the module, and if so, return true.
1509 bool
1510 MPPassManager::runOnModule(Module &M) {
1511   llvm::TimeTraceScope TimeScope("OptModule", M.getName());
1512 
1513   bool Changed = false;
1514 
1515   // Initialize on-the-fly passes
1516   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1517     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1518     Changed |= FPP->doInitialization(M);
1519   }
1520 
1521   // Initialize module passes
1522   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1523     Changed |= getContainedPass(Index)->doInitialization(M);
1524 
1525   unsigned InstrCount;
1526   StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1527   bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1528   // Collect the initial size of the module.
1529   if (EmitICRemark)
1530     InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1531 
1532   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1533     ModulePass *MP = getContainedPass(Index);
1534     bool LocalChanged = false;
1535 
1536     dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1537     dumpRequiredSet(MP);
1538 
1539     initializeAnalysisImpl(MP);
1540 
1541     {
1542       PassManagerPrettyStackEntry X(MP, M);
1543       TimeRegion PassTimer(getPassTimer(MP));
1544 
1545 #ifdef EXPENSIVE_CHECKS
1546       uint64_t RefHash = StructuralHash(M);
1547 #endif
1548 
1549       LocalChanged |= MP->runOnModule(M);
1550 
1551 #ifdef EXPENSIVE_CHECKS
1552       assert((LocalChanged || (RefHash == StructuralHash(M))) &&
1553              "Pass modifies its input and doesn't report it.");
1554 #endif
1555 
1556       if (EmitICRemark) {
1557         // Update the size of the module.
1558         unsigned ModuleCount = M.getInstructionCount();
1559         if (ModuleCount != InstrCount) {
1560           int64_t Delta = static_cast<int64_t>(ModuleCount) -
1561                           static_cast<int64_t>(InstrCount);
1562           emitInstrCountChangedRemark(MP, M, Delta, InstrCount,
1563                                       FunctionToInstrCount);
1564           InstrCount = ModuleCount;
1565         }
1566       }
1567     }
1568 
1569     Changed |= LocalChanged;
1570     if (LocalChanged)
1571       dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1572                    M.getModuleIdentifier());
1573     dumpPreservedSet(MP);
1574     dumpUsedSet(MP);
1575 
1576     verifyPreservedAnalysis(MP);
1577     if (LocalChanged)
1578       removeNotPreservedAnalysis(MP);
1579     recordAvailableAnalysis(MP);
1580     removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1581   }
1582 
1583   // Finalize module passes
1584   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1585     Changed |= getContainedPass(Index)->doFinalization(M);
1586 
1587   // Finalize on-the-fly passes
1588   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1589     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1590     // We don't know when is the last time an on-the-fly pass is run,
1591     // so we need to releaseMemory / finalize here
1592     FPP->releaseMemoryOnTheFly();
1593     Changed |= FPP->doFinalization(M);
1594   }
1595 
1596   return Changed;
1597 }
1598 
1599 /// Add RequiredPass into list of lower level passes required by pass P.
1600 /// RequiredPass is run on the fly by Pass Manager when P requests it
1601 /// through getAnalysis interface.
1602 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1603   assert(RequiredPass && "No required pass?");
1604   assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1605          "Unable to handle Pass that requires lower level Analysis pass");
1606   assert((P->getPotentialPassManagerType() <
1607           RequiredPass->getPotentialPassManagerType()) &&
1608          "Unable to handle Pass that requires lower level Analysis pass");
1609 
1610   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1611   if (!FPP) {
1612     FPP = new legacy::FunctionPassManagerImpl();
1613     // FPP is the top level manager.
1614     FPP->setTopLevelManager(FPP);
1615 
1616     OnTheFlyManagers[P] = FPP;
1617   }
1618   const PassInfo *RequiredPassPI =
1619       TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1620 
1621   Pass *FoundPass = nullptr;
1622   if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1623     FoundPass =
1624       ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1625   }
1626   if (!FoundPass) {
1627     FoundPass = RequiredPass;
1628     // This should be guaranteed to add RequiredPass to the passmanager given
1629     // that we checked for an available analysis above.
1630     FPP->add(RequiredPass);
1631   }
1632   // Register P as the last user of FoundPass or RequiredPass.
1633   SmallVector<Pass *, 1> LU;
1634   LU.push_back(FoundPass);
1635   FPP->setLastUser(LU,  P);
1636 }
1637 
1638 /// Return function pass corresponding to PassInfo PI, that is
1639 /// required by module pass MP. Instantiate analysis pass, by using
1640 /// its runOnFunction() for function F.
1641 std::tuple<Pass *, bool> MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI,
1642                                                         Function &F) {
1643   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1644   assert(FPP && "Unable to find on the fly pass");
1645 
1646   FPP->releaseMemoryOnTheFly();
1647   bool Changed = FPP->run(F);
1648   return std::make_tuple(((PMTopLevelManager *)FPP)->findAnalysisPass(PI),
1649                          Changed);
1650 }
1651 
1652 namespace llvm {
1653 namespace legacy {
1654 
1655 //===----------------------------------------------------------------------===//
1656 // PassManager implementation
1657 
1658 /// Create new pass manager
1659 PassManager::PassManager() {
1660   PM = new PassManagerImpl();
1661   // PM is the top level manager
1662   PM->setTopLevelManager(PM);
1663 }
1664 
1665 PassManager::~PassManager() {
1666   delete PM;
1667 }
1668 
1669 void PassManager::add(Pass *P) {
1670   PM->add(P);
1671 }
1672 
1673 /// run - Execute all of the passes scheduled for execution.  Keep track of
1674 /// whether any of the passes modifies the module, and if so, return true.
1675 bool PassManager::run(Module &M) {
1676   return PM->run(M);
1677 }
1678 } // namespace legacy
1679 } // namespace llvm
1680 
1681 //===----------------------------------------------------------------------===//
1682 // PMStack implementation
1683 //
1684 
1685 // Pop Pass Manager from the stack and clear its analysis info.
1686 void PMStack::pop() {
1687 
1688   PMDataManager *Top = this->top();
1689   Top->initializeAnalysisInfo();
1690 
1691   S.pop_back();
1692 }
1693 
1694 // Push PM on the stack and set its top level manager.
1695 void PMStack::push(PMDataManager *PM) {
1696   assert(PM && "Unable to push. Pass Manager expected");
1697   assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1698 
1699   if (!this->empty()) {
1700     assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1701            && "pushing bad pass manager to PMStack");
1702     PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1703 
1704     assert(TPM && "Unable to find top level manager");
1705     TPM->addIndirectPassManager(PM);
1706     PM->setTopLevelManager(TPM);
1707     PM->setDepth(this->top()->getDepth()+1);
1708   } else {
1709     assert((PM->getPassManagerType() == PMT_ModulePassManager
1710            || PM->getPassManagerType() == PMT_FunctionPassManager)
1711            && "pushing bad pass manager to PMStack");
1712     PM->setDepth(1);
1713   }
1714 
1715   S.push_back(PM);
1716 }
1717 
1718 // Dump content of the pass manager stack.
1719 LLVM_DUMP_METHOD void PMStack::dump() const {
1720   for (PMDataManager *Manager : S)
1721     dbgs() << Manager->getAsPass()->getPassName() << ' ';
1722 
1723   if (!S.empty())
1724     dbgs() << '\n';
1725 }
1726 
1727 /// Find appropriate Module Pass Manager in the PM Stack and
1728 /// add self into that manager.
1729 void ModulePass::assignPassManager(PMStack &PMS,
1730                                    PassManagerType PreferredType) {
1731   // Find Module Pass Manager
1732   PassManagerType T;
1733   while ((T = PMS.top()->getPassManagerType()) > PMT_ModulePassManager &&
1734          T != PreferredType)
1735     PMS.pop();
1736   PMS.top()->add(this);
1737 }
1738 
1739 /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1740 /// in the PM Stack and add self into that manager.
1741 void FunctionPass::assignPassManager(PMStack &PMS,
1742                                      PassManagerType /*PreferredType*/) {
1743   // Find Function Pass Manager
1744   PMDataManager *PM;
1745   while (PM = PMS.top(), PM->getPassManagerType() > PMT_FunctionPassManager)
1746     PMS.pop();
1747 
1748   // Create new Function Pass Manager if needed.
1749   if (PM->getPassManagerType() != PMT_FunctionPassManager) {
1750     // [1] Create new Function Pass Manager
1751     auto *FPP = new FPPassManager;
1752     FPP->populateInheritedAnalysis(PMS);
1753 
1754     // [2] Set up new manager's top level manager
1755     PM->getTopLevelManager()->addIndirectPassManager(FPP);
1756 
1757     // [3] Assign manager to manage this new manager. This may create
1758     // and push new managers into PMS
1759     FPP->assignPassManager(PMS, PM->getPassManagerType());
1760 
1761     // [4] Push new manager into PMS
1762     PMS.push(FPP);
1763     PM = FPP;
1764   }
1765 
1766   // Assign FPP as the manager of this pass.
1767   PM->add(this);
1768 }
1769 
1770 legacy::PassManagerBase::~PassManagerBase() {}
1771