xref: /freebsd-src/contrib/llvm-project/llvm/lib/IR/LegacyPassManager.cpp (revision 0eae32dcef82f6f06de6419a0d623d7def0cc8f6)
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), PMDataManager(),
261     PMTopLevelManager(new FPPassManager()), 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() :
391     Pass(PT_PassManager, ID), PMDataManager() { }
392 
393   // Delete on the fly managers.
394   ~MPPassManager() override {
395     for (auto &OnTheFlyManager : OnTheFlyManagers) {
396       legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
397       delete FPP;
398     }
399   }
400 
401   /// createPrinterPass - Get a module printer pass.
402   Pass *createPrinterPass(raw_ostream &O,
403                           const std::string &Banner) const override {
404     return createPrintModulePass(O, Banner);
405   }
406 
407   /// run - Execute all of the passes scheduled for execution.  Keep track of
408   /// whether any of the passes modifies the module, and if so, return true.
409   bool runOnModule(Module &M);
410 
411   using llvm::Pass::doInitialization;
412   using llvm::Pass::doFinalization;
413 
414   /// Pass Manager itself does not invalidate any analysis info.
415   void getAnalysisUsage(AnalysisUsage &Info) const override {
416     Info.setPreservesAll();
417   }
418 
419   /// Add RequiredPass into list of lower level passes required by pass P.
420   /// RequiredPass is run on the fly by Pass Manager when P requests it
421   /// through getAnalysis interface.
422   void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override;
423 
424   /// Return function pass corresponding to PassInfo PI, that is
425   /// required by module pass MP. Instantiate analysis pass, by using
426   /// its runOnFunction() for function F.
427   std::tuple<Pass *, bool> getOnTheFlyPass(Pass *MP, AnalysisID PI,
428                                            Function &F) override;
429 
430   StringRef getPassName() const override { return "Module Pass Manager"; }
431 
432   PMDataManager *getAsPMDataManager() override { return this; }
433   Pass *getAsPass() override { return this; }
434 
435   // Print passes managed by this manager
436   void dumpPassStructure(unsigned Offset) override {
437     dbgs().indent(Offset*2) << "ModulePass Manager\n";
438     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
439       ModulePass *MP = getContainedPass(Index);
440       MP->dumpPassStructure(Offset + 1);
441       MapVector<Pass *, legacy::FunctionPassManagerImpl *>::const_iterator I =
442           OnTheFlyManagers.find(MP);
443       if (I != OnTheFlyManagers.end())
444         I->second->dumpPassStructure(Offset + 2);
445       dumpLastUses(MP, Offset+1);
446     }
447   }
448 
449   ModulePass *getContainedPass(unsigned N) {
450     assert(N < PassVector.size() && "Pass number out of range!");
451     return static_cast<ModulePass *>(PassVector[N]);
452   }
453 
454   PassManagerType getPassManagerType() const override {
455     return PMT_ModulePassManager;
456   }
457 
458  private:
459   /// Collection of on the fly FPPassManagers. These managers manage
460   /// function passes that are required by module passes.
461    MapVector<Pass *, legacy::FunctionPassManagerImpl *> OnTheFlyManagers;
462 };
463 
464 char MPPassManager::ID = 0;
465 } // End anonymous namespace
466 
467 namespace llvm {
468 namespace legacy {
469 //===----------------------------------------------------------------------===//
470 // PassManagerImpl
471 //
472 
473 /// PassManagerImpl manages MPPassManagers
474 class PassManagerImpl : public Pass,
475                         public PMDataManager,
476                         public PMTopLevelManager {
477   virtual void anchor();
478 
479 public:
480   static char ID;
481   explicit PassManagerImpl() :
482     Pass(PT_PassManager, ID), PMDataManager(),
483                               PMTopLevelManager(new MPPassManager()) {}
484 
485   /// \copydoc PassManager::add()
486   void add(Pass *P) {
487     schedulePass(P);
488   }
489 
490   /// createPrinterPass - Get a module printer pass.
491   Pass *createPrinterPass(raw_ostream &O,
492                           const std::string &Banner) const override {
493     return createPrintModulePass(O, Banner);
494   }
495 
496   /// run - Execute all of the passes scheduled for execution.  Keep track of
497   /// whether any of the passes modifies the module, and if so, return true.
498   bool run(Module &M);
499 
500   using llvm::Pass::doInitialization;
501   using llvm::Pass::doFinalization;
502 
503   /// Pass Manager itself does not invalidate any analysis info.
504   void getAnalysisUsage(AnalysisUsage &Info) const override {
505     Info.setPreservesAll();
506   }
507 
508   PMDataManager *getAsPMDataManager() override { return this; }
509   Pass *getAsPass() override { return this; }
510   PassManagerType getTopLevelPassManagerType() override {
511     return PMT_ModulePassManager;
512   }
513 
514   MPPassManager *getContainedManager(unsigned N) {
515     assert(N < PassManagers.size() && "Pass number out of range!");
516     MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
517     return MP;
518   }
519 };
520 
521 void PassManagerImpl::anchor() {}
522 
523 char PassManagerImpl::ID = 0;
524 
525 //===----------------------------------------------------------------------===//
526 // PassManagerImpl implementation
527 
528 //
529 /// run - Execute all of the passes scheduled for execution.  Keep track of
530 /// whether any of the passes modifies the module, and if so, return true.
531 bool PassManagerImpl::run(Module &M) {
532   bool Changed = false;
533 
534   dumpArguments();
535   dumpPasses();
536 
537   for (ImmutablePass *ImPass : getImmutablePasses())
538     Changed |= ImPass->doInitialization(M);
539 
540   initializeAllAnalysisInfo();
541   for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
542     Changed |= getContainedManager(Index)->runOnModule(M);
543     M.getContext().yield();
544   }
545 
546   for (ImmutablePass *ImPass : getImmutablePasses())
547     Changed |= ImPass->doFinalization(M);
548 
549   return Changed;
550 }
551 } // namespace legacy
552 } // namespace llvm
553 
554 //===----------------------------------------------------------------------===//
555 // PMTopLevelManager implementation
556 
557 /// Initialize top level manager. Create first pass manager.
558 PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) {
559   PMDM->setTopLevelManager(this);
560   addPassManager(PMDM);
561   activeStack.push(PMDM);
562 }
563 
564 /// Set pass P as the last user of the given analysis passes.
565 void
566 PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) {
567   unsigned PDepth = 0;
568   if (P->getResolver())
569     PDepth = P->getResolver()->getPMDataManager().getDepth();
570 
571   for (Pass *AP : AnalysisPasses) {
572     // Record P as the new last user of AP.
573     auto &LastUserOfAP = LastUser[AP];
574     if (LastUserOfAP)
575       InversedLastUser[LastUserOfAP].erase(AP);
576     LastUserOfAP = P;
577     InversedLastUser[P].insert(AP);
578 
579     if (P == AP)
580       continue;
581 
582     // Update the last users of passes that are required transitive by AP.
583     AnalysisUsage *AnUsage = findAnalysisUsage(AP);
584     const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet();
585     SmallVector<Pass *, 12> LastUses;
586     SmallVector<Pass *, 12> LastPMUses;
587     for (AnalysisID ID : IDs) {
588       Pass *AnalysisPass = findAnalysisPass(ID);
589       assert(AnalysisPass && "Expected analysis pass to exist.");
590       AnalysisResolver *AR = AnalysisPass->getResolver();
591       assert(AR && "Expected analysis resolver to exist.");
592       unsigned APDepth = AR->getPMDataManager().getDepth();
593 
594       if (PDepth == APDepth)
595         LastUses.push_back(AnalysisPass);
596       else if (PDepth > APDepth)
597         LastPMUses.push_back(AnalysisPass);
598     }
599 
600     setLastUser(LastUses, P);
601 
602     // If this pass has a corresponding pass manager, push higher level
603     // analysis to this pass manager.
604     if (P->getResolver())
605       setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass());
606 
607     // If AP is the last user of other passes then make P last user of
608     // such passes.
609     auto &LastUsedByAP = InversedLastUser[AP];
610     for (Pass *L : LastUsedByAP)
611       LastUser[L] = P;
612     InversedLastUser[P].insert(LastUsedByAP.begin(), LastUsedByAP.end());
613     LastUsedByAP.clear();
614   }
615 }
616 
617 /// Collect passes whose last user is P
618 void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses,
619                                         Pass *P) {
620   auto DMI = InversedLastUser.find(P);
621   if (DMI == InversedLastUser.end())
622     return;
623 
624   auto &LU = DMI->second;
625   LastUses.append(LU.begin(), LU.end());
626 }
627 
628 AnalysisUsage *PMTopLevelManager::findAnalysisUsage(Pass *P) {
629   AnalysisUsage *AnUsage = nullptr;
630   auto DMI = AnUsageMap.find(P);
631   if (DMI != AnUsageMap.end())
632     AnUsage = DMI->second;
633   else {
634     // Look up the analysis usage from the pass instance (different instances
635     // of the same pass can produce different results), but unique the
636     // resulting object to reduce memory usage.  This helps to greatly reduce
637     // memory usage when we have many instances of only a few pass types
638     // (e.g. instcombine, simplifycfg, etc...) which tend to share a fixed set
639     // of dependencies.
640     AnalysisUsage AU;
641     P->getAnalysisUsage(AU);
642 
643     AUFoldingSetNode* Node = nullptr;
644     FoldingSetNodeID ID;
645     AUFoldingSetNode::Profile(ID, AU);
646     void *IP = nullptr;
647     if (auto *N = UniqueAnalysisUsages.FindNodeOrInsertPos(ID, IP))
648       Node = N;
649     else {
650       Node = new (AUFoldingSetNodeAllocator.Allocate()) AUFoldingSetNode(AU);
651       UniqueAnalysisUsages.InsertNode(Node, IP);
652     }
653     assert(Node && "cached analysis usage must be non null");
654 
655     AnUsageMap[P] = &Node->AU;
656     AnUsage = &Node->AU;
657   }
658   return AnUsage;
659 }
660 
661 /// Schedule pass P for execution. Make sure that passes required by
662 /// P are run before P is run. Update analysis info maintained by
663 /// the manager. Remove dead passes. This is a recursive function.
664 void PMTopLevelManager::schedulePass(Pass *P) {
665 
666   // TODO : Allocate function manager for this pass, other wise required set
667   // may be inserted into previous function manager
668 
669   // Give pass a chance to prepare the stage.
670   P->preparePassManager(activeStack);
671 
672   // If P is an analysis pass and it is available then do not
673   // generate the analysis again. Stale analysis info should not be
674   // available at this point.
675   const PassInfo *PI = findAnalysisPassInfo(P->getPassID());
676   if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) {
677     // Remove any cached AnalysisUsage information.
678     AnUsageMap.erase(P);
679     delete P;
680     return;
681   }
682 
683   AnalysisUsage *AnUsage = findAnalysisUsage(P);
684 
685   bool checkAnalysis = true;
686   while (checkAnalysis) {
687     checkAnalysis = false;
688 
689     const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet();
690     for (const AnalysisID ID : RequiredSet) {
691 
692       Pass *AnalysisPass = findAnalysisPass(ID);
693       if (!AnalysisPass) {
694         const PassInfo *PI = findAnalysisPassInfo(ID);
695 
696         if (!PI) {
697           // Pass P is not in the global PassRegistry
698           dbgs() << "Pass '"  << P->getPassName() << "' is not initialized." << "\n";
699           dbgs() << "Verify if there is a pass dependency cycle." << "\n";
700           dbgs() << "Required Passes:" << "\n";
701           for (const AnalysisID ID2 : RequiredSet) {
702             if (ID == ID2)
703               break;
704             Pass *AnalysisPass2 = findAnalysisPass(ID2);
705             if (AnalysisPass2) {
706               dbgs() << "\t" << AnalysisPass2->getPassName() << "\n";
707             } else {
708               dbgs() << "\t"   << "Error: Required pass not found! Possible causes:"  << "\n";
709               dbgs() << "\t\t" << "- Pass misconfiguration (e.g.: missing macros)"    << "\n";
710               dbgs() << "\t\t" << "- Corruption of the global PassRegistry"           << "\n";
711             }
712           }
713         }
714 
715         assert(PI && "Expected required passes to be initialized");
716         AnalysisPass = PI->createPass();
717         if (P->getPotentialPassManagerType () ==
718             AnalysisPass->getPotentialPassManagerType())
719           // Schedule analysis pass that is managed by the same pass manager.
720           schedulePass(AnalysisPass);
721         else if (P->getPotentialPassManagerType () >
722                  AnalysisPass->getPotentialPassManagerType()) {
723           // Schedule analysis pass that is managed by a new manager.
724           schedulePass(AnalysisPass);
725           // Recheck analysis passes to ensure that required analyses that
726           // are already checked are still available.
727           checkAnalysis = true;
728         } else
729           // Do not schedule this analysis. Lower level analysis
730           // passes are run on the fly.
731           delete AnalysisPass;
732       }
733     }
734   }
735 
736   // Now all required passes are available.
737   if (ImmutablePass *IP = P->getAsImmutablePass()) {
738     // P is a immutable pass and it will be managed by this
739     // top level manager. Set up analysis resolver to connect them.
740     PMDataManager *DM = getAsPMDataManager();
741     AnalysisResolver *AR = new AnalysisResolver(*DM);
742     P->setResolver(AR);
743     DM->initializeAnalysisImpl(P);
744     addImmutablePass(IP);
745     DM->recordAvailableAnalysis(IP);
746     return;
747   }
748 
749   if (PI && !PI->isAnalysis() && shouldPrintBeforePass(PI->getPassArgument())) {
750     Pass *PP =
751         P->createPrinterPass(dbgs(), ("*** IR Dump Before " + P->getPassName() +
752                                       " (" + PI->getPassArgument() + ") ***")
753                                          .str());
754     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
755   }
756 
757   // Add the requested pass to the best available pass manager.
758   P->assignPassManager(activeStack, getTopLevelPassManagerType());
759 
760   if (PI && !PI->isAnalysis() && shouldPrintAfterPass(PI->getPassArgument())) {
761     Pass *PP =
762         P->createPrinterPass(dbgs(), ("*** IR Dump After " + P->getPassName() +
763                                       " (" + PI->getPassArgument() + ") ***")
764                                          .str());
765     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
766   }
767 }
768 
769 /// Find the pass that implements Analysis AID. Search immutable
770 /// passes and all pass managers. If desired pass is not found
771 /// then return NULL.
772 Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
773   // For immutable passes we have a direct mapping from ID to pass, so check
774   // that first.
775   if (Pass *P = ImmutablePassMap.lookup(AID))
776     return P;
777 
778   // Check pass managers
779   for (PMDataManager *PassManager : PassManagers)
780     if (Pass *P = PassManager->findAnalysisPass(AID, false))
781       return P;
782 
783   // Check other pass managers
784   for (PMDataManager *IndirectPassManager : IndirectPassManagers)
785     if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
786       return P;
787 
788   return nullptr;
789 }
790 
791 const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const {
792   const PassInfo *&PI = AnalysisPassInfos[AID];
793   if (!PI)
794     PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
795   else
796     assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) &&
797            "The pass info pointer changed for an analysis ID!");
798 
799   return PI;
800 }
801 
802 void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
803   P->initializePass();
804   ImmutablePasses.push_back(P);
805 
806   // Add this pass to the map from its analysis ID. We clobber any prior runs
807   // of the pass in the map so that the last one added is the one found when
808   // doing lookups.
809   AnalysisID AID = P->getPassID();
810   ImmutablePassMap[AID] = P;
811 
812   // Also add any interfaces implemented by the immutable pass to the map for
813   // fast lookup.
814   const PassInfo *PassInf = findAnalysisPassInfo(AID);
815   assert(PassInf && "Expected all immutable passes to be initialized");
816   for (const PassInfo *ImmPI : PassInf->getInterfacesImplemented())
817     ImmutablePassMap[ImmPI->getTypeInfo()] = P;
818 }
819 
820 // Print passes managed by this top level manager.
821 void PMTopLevelManager::dumpPasses() const {
822 
823   if (PassDebugging < Structure)
824     return;
825 
826   // Print out the immutable passes
827   for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
828     ImmutablePasses[i]->dumpPassStructure(0);
829   }
830 
831   // Every class that derives from PMDataManager also derives from Pass
832   // (sometimes indirectly), but there's no inheritance relationship
833   // between PMDataManager and Pass, so we have to getAsPass to get
834   // from a PMDataManager* to a Pass*.
835   for (PMDataManager *Manager : PassManagers)
836     Manager->getAsPass()->dumpPassStructure(1);
837 }
838 
839 void PMTopLevelManager::dumpArguments() const {
840 
841   if (PassDebugging < Arguments)
842     return;
843 
844   dbgs() << "Pass Arguments: ";
845   for (ImmutablePass *P : ImmutablePasses)
846     if (const PassInfo *PI = findAnalysisPassInfo(P->getPassID())) {
847       assert(PI && "Expected all immutable passes to be initialized");
848       if (!PI->isAnalysisGroup())
849         dbgs() << " -" << PI->getPassArgument();
850     }
851   for (PMDataManager *PM : PassManagers)
852     PM->dumpPassArguments();
853   dbgs() << "\n";
854 }
855 
856 void PMTopLevelManager::initializeAllAnalysisInfo() {
857   for (PMDataManager *PM : PassManagers)
858     PM->initializeAnalysisInfo();
859 
860   // Initailize other pass managers
861   for (PMDataManager *IPM : IndirectPassManagers)
862     IPM->initializeAnalysisInfo();
863 }
864 
865 /// Destructor
866 PMTopLevelManager::~PMTopLevelManager() {
867   for (PMDataManager *PM : PassManagers)
868     delete PM;
869 
870   for (ImmutablePass *P : ImmutablePasses)
871     delete P;
872 }
873 
874 //===----------------------------------------------------------------------===//
875 // PMDataManager implementation
876 
877 /// Augement AvailableAnalysis by adding analysis made available by pass P.
878 void PMDataManager::recordAvailableAnalysis(Pass *P) {
879   AnalysisID PI = P->getPassID();
880 
881   AvailableAnalysis[PI] = P;
882 
883   assert(!AvailableAnalysis.empty());
884 
885   // This pass is the current implementation of all of the interfaces it
886   // implements as well.
887   const PassInfo *PInf = TPM->findAnalysisPassInfo(PI);
888   if (!PInf) return;
889   for (const PassInfo *PI : PInf->getInterfacesImplemented())
890     AvailableAnalysis[PI->getTypeInfo()] = P;
891 }
892 
893 // Return true if P preserves high level analysis used by other
894 // passes managed by this manager
895 bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
896   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
897   if (AnUsage->getPreservesAll())
898     return true;
899 
900   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
901   for (Pass *P1 : HigherLevelAnalysis) {
902     if (P1->getAsImmutablePass() == nullptr &&
903         !is_contained(PreservedSet, P1->getPassID()))
904       return false;
905   }
906 
907   return true;
908 }
909 
910 /// verifyPreservedAnalysis -- Verify analysis preserved by pass P.
911 void PMDataManager::verifyPreservedAnalysis(Pass *P) {
912   // Don't do this unless assertions are enabled.
913 #ifdef NDEBUG
914   return;
915 #endif
916   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
917   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
918 
919   // Verify preserved analysis
920   for (AnalysisID AID : PreservedSet) {
921     if (Pass *AP = findAnalysisPass(AID, true)) {
922       TimeRegion PassTimer(getPassTimer(AP));
923       AP->verifyAnalysis();
924     }
925   }
926 }
927 
928 /// Remove Analysis not preserved by Pass P
929 void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
930   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
931   if (AnUsage->getPreservesAll())
932     return;
933 
934   const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
935   for (DenseMap<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
936          E = AvailableAnalysis.end(); I != E; ) {
937     DenseMap<AnalysisID, Pass*>::iterator Info = I++;
938     if (Info->second->getAsImmutablePass() == nullptr &&
939         !is_contained(PreservedSet, Info->first)) {
940       // Remove this analysis
941       if (PassDebugging >= Details) {
942         Pass *S = Info->second;
943         dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
944         dbgs() << S->getPassName() << "'\n";
945       }
946       AvailableAnalysis.erase(Info);
947     }
948   }
949 
950   // Check inherited analysis also. If P is not preserving analysis
951   // provided by parent manager then remove it here.
952   for (DenseMap<AnalysisID, Pass *> *IA : InheritedAnalysis) {
953     if (!IA)
954       continue;
955 
956     for (DenseMap<AnalysisID, Pass *>::iterator I = IA->begin(),
957                                                 E = IA->end();
958          I != E;) {
959       DenseMap<AnalysisID, Pass *>::iterator Info = I++;
960       if (Info->second->getAsImmutablePass() == nullptr &&
961           !is_contained(PreservedSet, Info->first)) {
962         // Remove this analysis
963         if (PassDebugging >= Details) {
964           Pass *S = Info->second;
965           dbgs() << " -- '" <<  P->getPassName() << "' is not preserving '";
966           dbgs() << S->getPassName() << "'\n";
967         }
968         IA->erase(Info);
969       }
970     }
971   }
972 }
973 
974 /// Remove analysis passes that are not used any longer
975 void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
976                                      enum PassDebuggingString DBG_STR) {
977 
978   SmallVector<Pass *, 12> DeadPasses;
979 
980   // If this is a on the fly manager then it does not have TPM.
981   if (!TPM)
982     return;
983 
984   TPM->collectLastUses(DeadPasses, P);
985 
986   if (PassDebugging >= Details && !DeadPasses.empty()) {
987     dbgs() << " -*- '" <<  P->getPassName();
988     dbgs() << "' is the last user of following pass instances.";
989     dbgs() << " Free these instances\n";
990   }
991 
992   for (Pass *P : DeadPasses)
993     freePass(P, Msg, DBG_STR);
994 }
995 
996 void PMDataManager::freePass(Pass *P, StringRef Msg,
997                              enum PassDebuggingString DBG_STR) {
998   dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
999 
1000   {
1001     // If the pass crashes releasing memory, remember this.
1002     PassManagerPrettyStackEntry X(P);
1003     TimeRegion PassTimer(getPassTimer(P));
1004 
1005     P->releaseMemory();
1006   }
1007 
1008   AnalysisID PI = P->getPassID();
1009   if (const PassInfo *PInf = TPM->findAnalysisPassInfo(PI)) {
1010     // Remove the pass itself (if it is not already removed).
1011     AvailableAnalysis.erase(PI);
1012 
1013     // Remove all interfaces this pass implements, for which it is also
1014     // listed as the available implementation.
1015     for (const PassInfo *PI : PInf->getInterfacesImplemented()) {
1016       DenseMap<AnalysisID, Pass *>::iterator Pos =
1017           AvailableAnalysis.find(PI->getTypeInfo());
1018       if (Pos != AvailableAnalysis.end() && Pos->second == P)
1019         AvailableAnalysis.erase(Pos);
1020     }
1021   }
1022 }
1023 
1024 /// Add pass P into the PassVector. Update
1025 /// AvailableAnalysis appropriately if ProcessAnalysis is true.
1026 void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
1027   // This manager is going to manage pass P. Set up analysis resolver
1028   // to connect them.
1029   AnalysisResolver *AR = new AnalysisResolver(*this);
1030   P->setResolver(AR);
1031 
1032   // If a FunctionPass F is the last user of ModulePass info M
1033   // then the F's manager, not F, records itself as a last user of M.
1034   SmallVector<Pass *, 12> TransferLastUses;
1035 
1036   if (!ProcessAnalysis) {
1037     // Add pass
1038     PassVector.push_back(P);
1039     return;
1040   }
1041 
1042   // At the moment, this pass is the last user of all required passes.
1043   SmallVector<Pass *, 12> LastUses;
1044   SmallVector<Pass *, 8> UsedPasses;
1045   SmallVector<AnalysisID, 8> ReqAnalysisNotAvailable;
1046 
1047   unsigned PDepth = this->getDepth();
1048 
1049   collectRequiredAndUsedAnalyses(UsedPasses, ReqAnalysisNotAvailable, P);
1050   for (Pass *PUsed : UsedPasses) {
1051     unsigned RDepth = 0;
1052 
1053     assert(PUsed->getResolver() && "Analysis Resolver is not set");
1054     PMDataManager &DM = PUsed->getResolver()->getPMDataManager();
1055     RDepth = DM.getDepth();
1056 
1057     if (PDepth == RDepth)
1058       LastUses.push_back(PUsed);
1059     else if (PDepth > RDepth) {
1060       // Let the parent claim responsibility of last use
1061       TransferLastUses.push_back(PUsed);
1062       // Keep track of higher level analysis used by this manager.
1063       HigherLevelAnalysis.push_back(PUsed);
1064     } else
1065       llvm_unreachable("Unable to accommodate Used Pass");
1066   }
1067 
1068   // Set P as P's last user until someone starts using P.
1069   // However, if P is a Pass Manager then it does not need
1070   // to record its last user.
1071   if (!P->getAsPMDataManager())
1072     LastUses.push_back(P);
1073   TPM->setLastUser(LastUses, P);
1074 
1075   if (!TransferLastUses.empty()) {
1076     Pass *My_PM = getAsPass();
1077     TPM->setLastUser(TransferLastUses, My_PM);
1078     TransferLastUses.clear();
1079   }
1080 
1081   // Now, take care of required analyses that are not available.
1082   for (AnalysisID ID : ReqAnalysisNotAvailable) {
1083     const PassInfo *PI = TPM->findAnalysisPassInfo(ID);
1084     Pass *AnalysisPass = PI->createPass();
1085     this->addLowerLevelRequiredPass(P, AnalysisPass);
1086   }
1087 
1088   // Take a note of analysis required and made available by this pass.
1089   // Remove the analysis not preserved by this pass
1090   removeNotPreservedAnalysis(P);
1091   recordAvailableAnalysis(P);
1092 
1093   // Add pass
1094   PassVector.push_back(P);
1095 }
1096 
1097 
1098 /// Populate UP with analysis pass that are used or required by
1099 /// pass P and are available. Populate RP_NotAvail with analysis
1100 /// pass that are required by pass P but are not available.
1101 void PMDataManager::collectRequiredAndUsedAnalyses(
1102     SmallVectorImpl<Pass *> &UP, SmallVectorImpl<AnalysisID> &RP_NotAvail,
1103     Pass *P) {
1104   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1105 
1106   for (const auto &UsedID : AnUsage->getUsedSet())
1107     if (Pass *AnalysisPass = findAnalysisPass(UsedID, true))
1108       UP.push_back(AnalysisPass);
1109 
1110   for (const auto &RequiredID : AnUsage->getRequiredSet())
1111     if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true))
1112       UP.push_back(AnalysisPass);
1113     else
1114       RP_NotAvail.push_back(RequiredID);
1115 }
1116 
1117 // All Required analyses should be available to the pass as it runs!  Here
1118 // we fill in the AnalysisImpls member of the pass so that it can
1119 // successfully use the getAnalysis() method to retrieve the
1120 // implementations it needs.
1121 //
1122 void PMDataManager::initializeAnalysisImpl(Pass *P) {
1123   AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1124 
1125   for (const AnalysisID ID : AnUsage->getRequiredSet()) {
1126     Pass *Impl = findAnalysisPass(ID, true);
1127     if (!Impl)
1128       // This may be analysis pass that is initialized on the fly.
1129       // If that is not the case then it will raise an assert when it is used.
1130       continue;
1131     AnalysisResolver *AR = P->getResolver();
1132     assert(AR && "Analysis Resolver is not set");
1133     AR->addAnalysisImplsPair(ID, Impl);
1134   }
1135 }
1136 
1137 /// Find the pass that implements Analysis AID. If desired pass is not found
1138 /// then return NULL.
1139 Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
1140 
1141   // Check if AvailableAnalysis map has one entry.
1142   DenseMap<AnalysisID, Pass*>::const_iterator I =  AvailableAnalysis.find(AID);
1143 
1144   if (I != AvailableAnalysis.end())
1145     return I->second;
1146 
1147   // Search Parents through TopLevelManager
1148   if (SearchParent)
1149     return TPM->findAnalysisPass(AID);
1150 
1151   return nullptr;
1152 }
1153 
1154 // Print list of passes that are last used by P.
1155 void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
1156   if (PassDebugging < Details)
1157     return;
1158 
1159   SmallVector<Pass *, 12> LUses;
1160 
1161   // If this is a on the fly manager then it does not have TPM.
1162   if (!TPM)
1163     return;
1164 
1165   TPM->collectLastUses(LUses, P);
1166 
1167   for (Pass *P : LUses) {
1168     dbgs() << "--" << std::string(Offset*2, ' ');
1169     P->dumpPassStructure(0);
1170   }
1171 }
1172 
1173 void PMDataManager::dumpPassArguments() const {
1174   for (Pass *P : PassVector) {
1175     if (PMDataManager *PMD = P->getAsPMDataManager())
1176       PMD->dumpPassArguments();
1177     else
1178       if (const PassInfo *PI =
1179             TPM->findAnalysisPassInfo(P->getPassID()))
1180         if (!PI->isAnalysisGroup())
1181           dbgs() << " -" << PI->getPassArgument();
1182   }
1183 }
1184 
1185 void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
1186                                  enum PassDebuggingString S2,
1187                                  StringRef Msg) {
1188   if (PassDebugging < Executions)
1189     return;
1190   dbgs() << "[" << std::chrono::system_clock::now() << "] " << (void *)this
1191          << std::string(getDepth() * 2 + 1, ' ');
1192   switch (S1) {
1193   case EXECUTION_MSG:
1194     dbgs() << "Executing Pass '" << P->getPassName();
1195     break;
1196   case MODIFICATION_MSG:
1197     dbgs() << "Made Modification '" << P->getPassName();
1198     break;
1199   case FREEING_MSG:
1200     dbgs() << " Freeing Pass '" << P->getPassName();
1201     break;
1202   default:
1203     break;
1204   }
1205   switch (S2) {
1206   case ON_FUNCTION_MSG:
1207     dbgs() << "' on Function '" << Msg << "'...\n";
1208     break;
1209   case ON_MODULE_MSG:
1210     dbgs() << "' on Module '"  << Msg << "'...\n";
1211     break;
1212   case ON_REGION_MSG:
1213     dbgs() << "' on Region '"  << Msg << "'...\n";
1214     break;
1215   case ON_LOOP_MSG:
1216     dbgs() << "' on Loop '" << Msg << "'...\n";
1217     break;
1218   case ON_CG_MSG:
1219     dbgs() << "' on Call Graph Nodes '" << Msg << "'...\n";
1220     break;
1221   default:
1222     break;
1223   }
1224 }
1225 
1226 void PMDataManager::dumpRequiredSet(const Pass *P) const {
1227   if (PassDebugging < Details)
1228     return;
1229 
1230   AnalysisUsage analysisUsage;
1231   P->getAnalysisUsage(analysisUsage);
1232   dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet());
1233 }
1234 
1235 void PMDataManager::dumpPreservedSet(const Pass *P) const {
1236   if (PassDebugging < Details)
1237     return;
1238 
1239   AnalysisUsage analysisUsage;
1240   P->getAnalysisUsage(analysisUsage);
1241   dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet());
1242 }
1243 
1244 void PMDataManager::dumpUsedSet(const Pass *P) const {
1245   if (PassDebugging < Details)
1246     return;
1247 
1248   AnalysisUsage analysisUsage;
1249   P->getAnalysisUsage(analysisUsage);
1250   dumpAnalysisUsage("Used", P, analysisUsage.getUsedSet());
1251 }
1252 
1253 void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,
1254                                    const AnalysisUsage::VectorType &Set) const {
1255   assert(PassDebugging >= Details);
1256   if (Set.empty())
1257     return;
1258   dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
1259   for (unsigned i = 0; i != Set.size(); ++i) {
1260     if (i) dbgs() << ',';
1261     const PassInfo *PInf = TPM->findAnalysisPassInfo(Set[i]);
1262     if (!PInf) {
1263       // Some preserved passes, such as AliasAnalysis, may not be initialized by
1264       // all drivers.
1265       dbgs() << " Uninitialized Pass";
1266       continue;
1267     }
1268     dbgs() << ' ' << PInf->getPassName();
1269   }
1270   dbgs() << '\n';
1271 }
1272 
1273 /// Add RequiredPass into list of lower level passes required by pass P.
1274 /// RequiredPass is run on the fly by Pass Manager when P requests it
1275 /// through getAnalysis interface.
1276 /// This should be handled by specific pass manager.
1277 void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1278   if (TPM) {
1279     TPM->dumpArguments();
1280     TPM->dumpPasses();
1281   }
1282 
1283   // Module Level pass may required Function Level analysis info
1284   // (e.g. dominator info). Pass manager uses on the fly function pass manager
1285   // to provide this on demand. In that case, in Pass manager terminology,
1286   // module level pass is requiring lower level analysis info managed by
1287   // lower level pass manager.
1288 
1289   // When Pass manager is not able to order required analysis info, Pass manager
1290   // checks whether any lower level manager will be able to provide this
1291   // analysis info on demand or not.
1292 #ifndef NDEBUG
1293   dbgs() << "Unable to schedule '" << RequiredPass->getPassName();
1294   dbgs() << "' required by '" << P->getPassName() << "'\n";
1295 #endif
1296   llvm_unreachable("Unable to schedule pass");
1297 }
1298 
1299 std::tuple<Pass *, bool> PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI,
1300                                                         Function &F) {
1301   llvm_unreachable("Unable to find on the fly pass");
1302 }
1303 
1304 // Destructor
1305 PMDataManager::~PMDataManager() {
1306   for (Pass *P : PassVector)
1307     delete P;
1308 }
1309 
1310 //===----------------------------------------------------------------------===//
1311 // NOTE: Is this the right place to define this method ?
1312 // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist.
1313 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID) const {
1314   return PM.findAnalysisPass(ID, true);
1315 }
1316 
1317 std::tuple<Pass *, bool>
1318 AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI, Function &F) {
1319   return PM.getOnTheFlyPass(P, AnalysisPI, F);
1320 }
1321 
1322 namespace llvm {
1323 namespace legacy {
1324 
1325 //===----------------------------------------------------------------------===//
1326 // FunctionPassManager implementation
1327 
1328 /// Create new Function pass manager
1329 FunctionPassManager::FunctionPassManager(Module *m) : M(m) {
1330   FPM = new legacy::FunctionPassManagerImpl();
1331   // FPM is the top level manager.
1332   FPM->setTopLevelManager(FPM);
1333 
1334   AnalysisResolver *AR = new AnalysisResolver(*FPM);
1335   FPM->setResolver(AR);
1336 }
1337 
1338 FunctionPassManager::~FunctionPassManager() {
1339   delete FPM;
1340 }
1341 
1342 void FunctionPassManager::add(Pass *P) {
1343   FPM->add(P);
1344 }
1345 
1346 /// run - Execute all of the passes scheduled for execution.  Keep
1347 /// track of whether any of the passes modifies the function, and if
1348 /// so, return true.
1349 ///
1350 bool FunctionPassManager::run(Function &F) {
1351   handleAllErrors(F.materialize(), [&](ErrorInfoBase &EIB) {
1352     report_fatal_error(Twine("Error reading bitcode file: ") + EIB.message());
1353   });
1354   return FPM->run(F);
1355 }
1356 
1357 
1358 /// doInitialization - Run all of the initializers for the function passes.
1359 ///
1360 bool FunctionPassManager::doInitialization() {
1361   return FPM->doInitialization(*M);
1362 }
1363 
1364 /// doFinalization - Run all of the finalizers for the function passes.
1365 ///
1366 bool FunctionPassManager::doFinalization() {
1367   return FPM->doFinalization(*M);
1368 }
1369 } // namespace legacy
1370 } // namespace llvm
1371 
1372 /// cleanup - After running all passes, clean up pass manager cache.
1373 void FPPassManager::cleanup() {
1374  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1375     FunctionPass *FP = getContainedPass(Index);
1376     AnalysisResolver *AR = FP->getResolver();
1377     assert(AR && "Analysis Resolver is not set");
1378     AR->clearAnalysisImpls();
1379  }
1380 }
1381 
1382 
1383 //===----------------------------------------------------------------------===//
1384 // FPPassManager implementation
1385 
1386 char FPPassManager::ID = 0;
1387 /// Print passes managed by this manager
1388 void FPPassManager::dumpPassStructure(unsigned Offset) {
1389   dbgs().indent(Offset*2) << "FunctionPass Manager\n";
1390   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1391     FunctionPass *FP = getContainedPass(Index);
1392     FP->dumpPassStructure(Offset + 1);
1393     dumpLastUses(FP, Offset+1);
1394   }
1395 }
1396 
1397 /// Execute all of the passes scheduled for execution by invoking
1398 /// runOnFunction method.  Keep track of whether any of the passes modifies
1399 /// the function, and if so, return true.
1400 bool FPPassManager::runOnFunction(Function &F) {
1401   if (F.isDeclaration())
1402     return false;
1403 
1404   bool Changed = false;
1405   Module &M = *F.getParent();
1406   // Collect inherited analysis from Module level pass manager.
1407   populateInheritedAnalysis(TPM->activeStack);
1408 
1409   unsigned InstrCount, FunctionSize = 0;
1410   StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1411   bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1412   // Collect the initial size of the module.
1413   if (EmitICRemark) {
1414     InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1415     FunctionSize = F.getInstructionCount();
1416   }
1417 
1418   llvm::TimeTraceScope FunctionScope("OptFunction", F.getName());
1419 
1420   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1421     FunctionPass *FP = getContainedPass(Index);
1422     bool LocalChanged = false;
1423 
1424     llvm::TimeTraceScope PassScope("RunPass", FP->getPassName());
1425 
1426     dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName());
1427     dumpRequiredSet(FP);
1428 
1429     initializeAnalysisImpl(FP);
1430 
1431     {
1432       PassManagerPrettyStackEntry X(FP, F);
1433       TimeRegion PassTimer(getPassTimer(FP));
1434 #ifdef EXPENSIVE_CHECKS
1435       uint64_t RefHash = StructuralHash(F);
1436 #endif
1437       LocalChanged |= FP->runOnFunction(F);
1438 
1439 #if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
1440       if (!LocalChanged && (RefHash != StructuralHash(F))) {
1441         llvm::errs() << "Pass modifies its input and doesn't report it: "
1442                      << FP->getPassName() << "\n";
1443         llvm_unreachable("Pass modifies its input and doesn't report it");
1444       }
1445 #endif
1446 
1447       if (EmitICRemark) {
1448         unsigned NewSize = F.getInstructionCount();
1449 
1450         // Update the size of the function, emit a remark, and update the size
1451         // of the module.
1452         if (NewSize != FunctionSize) {
1453           int64_t Delta = static_cast<int64_t>(NewSize) -
1454                           static_cast<int64_t>(FunctionSize);
1455           emitInstrCountChangedRemark(FP, M, Delta, InstrCount,
1456                                       FunctionToInstrCount, &F);
1457           InstrCount = static_cast<int64_t>(InstrCount) + Delta;
1458           FunctionSize = NewSize;
1459         }
1460       }
1461     }
1462 
1463     Changed |= LocalChanged;
1464     if (LocalChanged)
1465       dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName());
1466     dumpPreservedSet(FP);
1467     dumpUsedSet(FP);
1468 
1469     verifyPreservedAnalysis(FP);
1470     if (LocalChanged)
1471       removeNotPreservedAnalysis(FP);
1472     recordAvailableAnalysis(FP);
1473     removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG);
1474   }
1475 
1476   return Changed;
1477 }
1478 
1479 bool FPPassManager::runOnModule(Module &M) {
1480   bool Changed = false;
1481 
1482   for (Function &F : M)
1483     Changed |= runOnFunction(F);
1484 
1485   return Changed;
1486 }
1487 
1488 bool FPPassManager::doInitialization(Module &M) {
1489   bool Changed = false;
1490 
1491   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1492     Changed |= getContainedPass(Index)->doInitialization(M);
1493 
1494   return Changed;
1495 }
1496 
1497 bool FPPassManager::doFinalization(Module &M) {
1498   bool Changed = false;
1499 
1500   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1501     Changed |= getContainedPass(Index)->doFinalization(M);
1502 
1503   return Changed;
1504 }
1505 
1506 //===----------------------------------------------------------------------===//
1507 // MPPassManager implementation
1508 
1509 /// Execute all of the passes scheduled for execution by invoking
1510 /// runOnModule method.  Keep track of whether any of the passes modifies
1511 /// the module, and if so, return true.
1512 bool
1513 MPPassManager::runOnModule(Module &M) {
1514   llvm::TimeTraceScope TimeScope("OptModule", M.getName());
1515 
1516   bool Changed = false;
1517 
1518   // Initialize on-the-fly passes
1519   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1520     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1521     Changed |= FPP->doInitialization(M);
1522   }
1523 
1524   // Initialize module passes
1525   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1526     Changed |= getContainedPass(Index)->doInitialization(M);
1527 
1528   unsigned InstrCount;
1529   StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1530   bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1531   // Collect the initial size of the module.
1532   if (EmitICRemark)
1533     InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1534 
1535   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1536     ModulePass *MP = getContainedPass(Index);
1537     bool LocalChanged = false;
1538 
1539     dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1540     dumpRequiredSet(MP);
1541 
1542     initializeAnalysisImpl(MP);
1543 
1544     {
1545       PassManagerPrettyStackEntry X(MP, M);
1546       TimeRegion PassTimer(getPassTimer(MP));
1547 
1548 #ifdef EXPENSIVE_CHECKS
1549       uint64_t RefHash = StructuralHash(M);
1550 #endif
1551 
1552       LocalChanged |= MP->runOnModule(M);
1553 
1554 #ifdef EXPENSIVE_CHECKS
1555       assert((LocalChanged || (RefHash == StructuralHash(M))) &&
1556              "Pass modifies its input and doesn't report it.");
1557 #endif
1558 
1559       if (EmitICRemark) {
1560         // Update the size of the module.
1561         unsigned ModuleCount = M.getInstructionCount();
1562         if (ModuleCount != InstrCount) {
1563           int64_t Delta = static_cast<int64_t>(ModuleCount) -
1564                           static_cast<int64_t>(InstrCount);
1565           emitInstrCountChangedRemark(MP, M, Delta, InstrCount,
1566                                       FunctionToInstrCount);
1567           InstrCount = ModuleCount;
1568         }
1569       }
1570     }
1571 
1572     Changed |= LocalChanged;
1573     if (LocalChanged)
1574       dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1575                    M.getModuleIdentifier());
1576     dumpPreservedSet(MP);
1577     dumpUsedSet(MP);
1578 
1579     verifyPreservedAnalysis(MP);
1580     if (LocalChanged)
1581       removeNotPreservedAnalysis(MP);
1582     recordAvailableAnalysis(MP);
1583     removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1584   }
1585 
1586   // Finalize module passes
1587   for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1588     Changed |= getContainedPass(Index)->doFinalization(M);
1589 
1590   // Finalize on-the-fly passes
1591   for (auto &OnTheFlyManager : OnTheFlyManagers) {
1592     legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1593     // We don't know when is the last time an on-the-fly pass is run,
1594     // so we need to releaseMemory / finalize here
1595     FPP->releaseMemoryOnTheFly();
1596     Changed |= FPP->doFinalization(M);
1597   }
1598 
1599   return Changed;
1600 }
1601 
1602 /// Add RequiredPass into list of lower level passes required by pass P.
1603 /// RequiredPass is run on the fly by Pass Manager when P requests it
1604 /// through getAnalysis interface.
1605 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1606   assert(RequiredPass && "No required pass?");
1607   assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1608          "Unable to handle Pass that requires lower level Analysis pass");
1609   assert((P->getPotentialPassManagerType() <
1610           RequiredPass->getPotentialPassManagerType()) &&
1611          "Unable to handle Pass that requires lower level Analysis pass");
1612 
1613   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1614   if (!FPP) {
1615     FPP = new legacy::FunctionPassManagerImpl();
1616     // FPP is the top level manager.
1617     FPP->setTopLevelManager(FPP);
1618 
1619     OnTheFlyManagers[P] = FPP;
1620   }
1621   const PassInfo *RequiredPassPI =
1622       TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1623 
1624   Pass *FoundPass = nullptr;
1625   if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1626     FoundPass =
1627       ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1628   }
1629   if (!FoundPass) {
1630     FoundPass = RequiredPass;
1631     // This should be guaranteed to add RequiredPass to the passmanager given
1632     // that we checked for an available analysis above.
1633     FPP->add(RequiredPass);
1634   }
1635   // Register P as the last user of FoundPass or RequiredPass.
1636   SmallVector<Pass *, 1> LU;
1637   LU.push_back(FoundPass);
1638   FPP->setLastUser(LU,  P);
1639 }
1640 
1641 /// Return function pass corresponding to PassInfo PI, that is
1642 /// required by module pass MP. Instantiate analysis pass, by using
1643 /// its runOnFunction() for function F.
1644 std::tuple<Pass *, bool> MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI,
1645                                                         Function &F) {
1646   legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1647   assert(FPP && "Unable to find on the fly pass");
1648 
1649   FPP->releaseMemoryOnTheFly();
1650   bool Changed = FPP->run(F);
1651   return std::make_tuple(((PMTopLevelManager *)FPP)->findAnalysisPass(PI),
1652                          Changed);
1653 }
1654 
1655 namespace llvm {
1656 namespace legacy {
1657 
1658 //===----------------------------------------------------------------------===//
1659 // PassManager implementation
1660 
1661 /// Create new pass manager
1662 PassManager::PassManager() {
1663   PM = new PassManagerImpl();
1664   // PM is the top level manager
1665   PM->setTopLevelManager(PM);
1666 }
1667 
1668 PassManager::~PassManager() {
1669   delete PM;
1670 }
1671 
1672 void PassManager::add(Pass *P) {
1673   PM->add(P);
1674 }
1675 
1676 /// run - Execute all of the passes scheduled for execution.  Keep track of
1677 /// whether any of the passes modifies the module, and if so, return true.
1678 bool PassManager::run(Module &M) {
1679   return PM->run(M);
1680 }
1681 } // namespace legacy
1682 } // namespace llvm
1683 
1684 //===----------------------------------------------------------------------===//
1685 // PMStack implementation
1686 //
1687 
1688 // Pop Pass Manager from the stack and clear its analysis info.
1689 void PMStack::pop() {
1690 
1691   PMDataManager *Top = this->top();
1692   Top->initializeAnalysisInfo();
1693 
1694   S.pop_back();
1695 }
1696 
1697 // Push PM on the stack and set its top level manager.
1698 void PMStack::push(PMDataManager *PM) {
1699   assert(PM && "Unable to push. Pass Manager expected");
1700   assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1701 
1702   if (!this->empty()) {
1703     assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1704            && "pushing bad pass manager to PMStack");
1705     PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1706 
1707     assert(TPM && "Unable to find top level manager");
1708     TPM->addIndirectPassManager(PM);
1709     PM->setTopLevelManager(TPM);
1710     PM->setDepth(this->top()->getDepth()+1);
1711   } else {
1712     assert((PM->getPassManagerType() == PMT_ModulePassManager
1713            || PM->getPassManagerType() == PMT_FunctionPassManager)
1714            && "pushing bad pass manager to PMStack");
1715     PM->setDepth(1);
1716   }
1717 
1718   S.push_back(PM);
1719 }
1720 
1721 // Dump content of the pass manager stack.
1722 LLVM_DUMP_METHOD void PMStack::dump() const {
1723   for (PMDataManager *Manager : S)
1724     dbgs() << Manager->getAsPass()->getPassName() << ' ';
1725 
1726   if (!S.empty())
1727     dbgs() << '\n';
1728 }
1729 
1730 /// Find appropriate Module Pass Manager in the PM Stack and
1731 /// add self into that manager.
1732 void ModulePass::assignPassManager(PMStack &PMS,
1733                                    PassManagerType PreferredType) {
1734   // Find Module Pass Manager
1735   PassManagerType T;
1736   while ((T = PMS.top()->getPassManagerType()) > PMT_ModulePassManager &&
1737          T != PreferredType)
1738     PMS.pop();
1739   PMS.top()->add(this);
1740 }
1741 
1742 /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1743 /// in the PM Stack and add self into that manager.
1744 void FunctionPass::assignPassManager(PMStack &PMS,
1745                                      PassManagerType /*PreferredType*/) {
1746   // Find Function Pass Manager
1747   PMDataManager *PM;
1748   while (PM = PMS.top(), PM->getPassManagerType() > PMT_FunctionPassManager)
1749     PMS.pop();
1750 
1751   // Create new Function Pass Manager if needed.
1752   if (PM->getPassManagerType() != PMT_FunctionPassManager) {
1753     // [1] Create new Function Pass Manager
1754     auto *FPP = new FPPassManager;
1755     FPP->populateInheritedAnalysis(PMS);
1756 
1757     // [2] Set up new manager's top level manager
1758     PM->getTopLevelManager()->addIndirectPassManager(FPP);
1759 
1760     // [3] Assign manager to manage this new manager. This may create
1761     // and push new managers into PMS
1762     FPP->assignPassManager(PMS, PM->getPassManagerType());
1763 
1764     // [4] Push new manager into PMS
1765     PMS.push(FPP);
1766     PM = FPP;
1767   }
1768 
1769   // Assign FPP as the manager of this pass.
1770   PM->add(this);
1771 }
1772 
1773 legacy::PassManagerBase::~PassManagerBase() {}
1774