Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / lib / IR / LegacyPassManager.cpp
blob6c223d4ec3817624d52c0b9f092ac6bc72634059
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.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/IR/LegacyPassManager.h"
14 #include "llvm/ADT/MapVector.h"
15 #include "llvm/IR/DiagnosticInfo.h"
16 #include "llvm/IR/IRPrintingPasses.h"
17 #include "llvm/IR/LLVMContext.h"
18 #include "llvm/IR/LegacyPassManagers.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/IR/PassTimingInfo.h"
21 #include "llvm/IR/PrintPasses.h"
22 #include "llvm/Support/Chrono.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/Error.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/TimeProfiler.h"
28 #include "llvm/Support/Timer.h"
29 #include "llvm/Support/raw_ostream.h"
30 #include <algorithm>
32 using namespace llvm;
34 // See PassManagers.h for Pass Manager infrastructure overview.
36 //===----------------------------------------------------------------------===//
37 // Pass debugging information. Often it is useful to find out what pass is
38 // running when a crash occurs in a utility. When this library is compiled with
39 // debugging on, a command line option (--debug-pass) is enabled that causes the
40 // pass name to be printed before it executes.
43 namespace {
44 // Different debug levels that can be enabled...
45 enum PassDebugLevel {
46 Disabled, Arguments, Structure, Executions, Details
48 } // namespace
50 static cl::opt<enum PassDebugLevel> PassDebugging(
51 "debug-pass", cl::Hidden,
52 cl::desc("Print legacy PassManager debugging information"),
53 cl::values(clEnumVal(Disabled, "disable debug output"),
54 clEnumVal(Arguments, "print pass arguments to pass to 'opt'"),
55 clEnumVal(Structure, "print pass structure before run()"),
56 clEnumVal(Executions, "print pass name before it is executed"),
57 clEnumVal(Details, "print pass details when it is executed")));
59 /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
60 /// or higher is specified.
61 bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
62 return PassDebugging >= Executions;
65 unsigned PMDataManager::initSizeRemarkInfo(
66 Module &M, StringMap<std::pair<unsigned, unsigned>> &FunctionToInstrCount) {
67 // Only calculate getInstructionCount if the size-info remark is requested.
68 unsigned InstrCount = 0;
70 // Collect instruction counts for every function. We'll use this to emit
71 // per-function size remarks later.
72 for (Function &F : M) {
73 unsigned FCount = F.getInstructionCount();
75 // Insert a record into FunctionToInstrCount keeping track of the current
76 // size of the function as the first member of a pair. Set the second
77 // member to 0; if the function is deleted by the pass, then when we get
78 // here, we'll be able to let the user know that F no longer contributes to
79 // the module.
80 FunctionToInstrCount[F.getName().str()] =
81 std::pair<unsigned, unsigned>(FCount, 0);
82 InstrCount += FCount;
84 return InstrCount;
87 void PMDataManager::emitInstrCountChangedRemark(
88 Pass *P, Module &M, int64_t Delta, unsigned CountBefore,
89 StringMap<std::pair<unsigned, unsigned>> &FunctionToInstrCount,
90 Function *F) {
91 // If it's a pass manager, don't emit a remark. (This hinges on the assumption
92 // that the only passes that return non-null with getAsPMDataManager are pass
93 // managers.) The reason we have to do this is to avoid emitting remarks for
94 // CGSCC passes.
95 if (P->getAsPMDataManager())
96 return;
98 // Set to true if this isn't a module pass or CGSCC pass.
99 bool CouldOnlyImpactOneFunction = (F != nullptr);
101 // Helper lambda that updates the changes to the size of some function.
102 auto UpdateFunctionChanges =
103 [&FunctionToInstrCount](Function &MaybeChangedFn) {
104 // Update the total module count.
105 unsigned FnSize = MaybeChangedFn.getInstructionCount();
106 auto It = FunctionToInstrCount.find(MaybeChangedFn.getName());
108 // If we created a new function, then we need to add it to the map and
109 // say that it changed from 0 instructions to FnSize.
110 if (It == FunctionToInstrCount.end()) {
111 FunctionToInstrCount[MaybeChangedFn.getName()] =
112 std::pair<unsigned, unsigned>(0, FnSize);
113 return;
115 // Insert the new function size into the second member of the pair. This
116 // tells us whether or not this function changed in size.
117 It->second.second = FnSize;
120 // We need to initially update all of the function sizes.
121 // If no function was passed in, then we're either a module pass or an
122 // CGSCC pass.
123 if (!CouldOnlyImpactOneFunction)
124 std::for_each(M.begin(), M.end(), UpdateFunctionChanges);
125 else
126 UpdateFunctionChanges(*F);
128 // Do we have a function we can use to emit a remark?
129 if (!CouldOnlyImpactOneFunction) {
130 // We need a function containing at least one basic block in order to output
131 // remarks. Since it's possible that the first function in the module
132 // doesn't actually contain a basic block, we have to go and find one that's
133 // suitable for emitting remarks.
134 auto It = llvm::find_if(M, [](const Function &Fn) { return !Fn.empty(); });
136 // Didn't find a function. Quit.
137 if (It == M.end())
138 return;
140 // We found a function containing at least one basic block.
141 F = &*It;
143 int64_t CountAfter = static_cast<int64_t>(CountBefore) + Delta;
144 BasicBlock &BB = *F->begin();
145 OptimizationRemarkAnalysis R("size-info", "IRSizeChange",
146 DiagnosticLocation(), &BB);
147 // FIXME: Move ore namespace to DiagnosticInfo so that we can use it. This
148 // would let us use NV instead of DiagnosticInfoOptimizationBase::Argument.
149 R << DiagnosticInfoOptimizationBase::Argument("Pass", P->getPassName())
150 << ": IR instruction count changed from "
151 << DiagnosticInfoOptimizationBase::Argument("IRInstrsBefore", CountBefore)
152 << " to "
153 << DiagnosticInfoOptimizationBase::Argument("IRInstrsAfter", CountAfter)
154 << "; Delta: "
155 << DiagnosticInfoOptimizationBase::Argument("DeltaInstrCount", Delta);
156 F->getContext().diagnose(R); // Not using ORE for layering reasons.
158 // Emit per-function size change remarks separately.
159 std::string PassName = P->getPassName().str();
161 // Helper lambda that emits a remark when the size of a function has changed.
162 auto EmitFunctionSizeChangedRemark = [&FunctionToInstrCount, &F, &BB,
163 &PassName](StringRef Fname) {
164 unsigned FnCountBefore, FnCountAfter;
165 std::pair<unsigned, unsigned> &Change = FunctionToInstrCount[Fname];
166 std::tie(FnCountBefore, FnCountAfter) = Change;
167 int64_t FnDelta = static_cast<int64_t>(FnCountAfter) -
168 static_cast<int64_t>(FnCountBefore);
170 if (FnDelta == 0)
171 return;
173 // FIXME: We shouldn't use BB for the location here. Unfortunately, because
174 // the function that we're looking at could have been deleted, we can't use
175 // it for the source location. We *want* remarks when a function is deleted
176 // though, so we're kind of stuck here as is. (This remark, along with the
177 // whole-module size change remarks really ought not to have source
178 // locations at all.)
179 OptimizationRemarkAnalysis FR("size-info", "FunctionIRSizeChange",
180 DiagnosticLocation(), &BB);
181 FR << DiagnosticInfoOptimizationBase::Argument("Pass", PassName)
182 << ": Function: "
183 << DiagnosticInfoOptimizationBase::Argument("Function", Fname)
184 << ": IR instruction count changed from "
185 << DiagnosticInfoOptimizationBase::Argument("IRInstrsBefore",
186 FnCountBefore)
187 << " to "
188 << DiagnosticInfoOptimizationBase::Argument("IRInstrsAfter",
189 FnCountAfter)
190 << "; Delta: "
191 << DiagnosticInfoOptimizationBase::Argument("DeltaInstrCount", FnDelta);
192 F->getContext().diagnose(FR);
194 // Update the function size.
195 Change.first = FnCountAfter;
198 // Are we looking at more than one function? If so, emit remarks for all of
199 // the functions in the module. Otherwise, only emit one remark.
200 if (!CouldOnlyImpactOneFunction)
201 std::for_each(FunctionToInstrCount.keys().begin(),
202 FunctionToInstrCount.keys().end(),
203 EmitFunctionSizeChangedRemark);
204 else
205 EmitFunctionSizeChangedRemark(F->getName().str());
208 void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
209 if (!V && !M)
210 OS << "Releasing pass '";
211 else
212 OS << "Running pass '";
214 OS << P->getPassName() << "'";
216 if (M) {
217 OS << " on module '" << M->getModuleIdentifier() << "'.\n";
218 return;
220 if (!V) {
221 OS << '\n';
222 return;
225 OS << " on ";
226 if (isa<Function>(V))
227 OS << "function";
228 else if (isa<BasicBlock>(V))
229 OS << "basic block";
230 else
231 OS << "value";
233 OS << " '";
234 V->printAsOperand(OS, /*PrintType=*/false, M);
235 OS << "'\n";
238 namespace llvm {
239 namespace legacy {
240 bool debugPassSpecified() { return PassDebugging != Disabled; }
242 //===----------------------------------------------------------------------===//
243 // FunctionPassManagerImpl
245 /// FunctionPassManagerImpl manages FPPassManagers
246 class FunctionPassManagerImpl : public Pass,
247 public PMDataManager,
248 public PMTopLevelManager {
249 virtual void anchor();
250 private:
251 bool wasRun;
252 public:
253 static char ID;
254 explicit FunctionPassManagerImpl()
255 : Pass(PT_PassManager, ID), PMTopLevelManager(new FPPassManager()),
256 wasRun(false) {}
258 /// \copydoc FunctionPassManager::add()
259 void add(Pass *P) {
260 schedulePass(P);
263 /// createPrinterPass - Get a function printer pass.
264 Pass *createPrinterPass(raw_ostream &O,
265 const std::string &Banner) const override {
266 return createPrintFunctionPass(O, Banner);
269 // Prepare for running an on the fly pass, freeing memory if needed
270 // from a previous run.
271 void releaseMemoryOnTheFly();
273 /// run - Execute all of the passes scheduled for execution. Keep track of
274 /// whether any of the passes modifies the module, and if so, return true.
275 bool run(Function &F);
277 /// doInitialization - Run all of the initializers for the function passes.
279 bool doInitialization(Module &M) override;
281 /// doFinalization - Run all of the finalizers for the function passes.
283 bool doFinalization(Module &M) override;
286 PMDataManager *getAsPMDataManager() override { return this; }
287 Pass *getAsPass() override { return this; }
288 PassManagerType getTopLevelPassManagerType() override {
289 return PMT_FunctionPassManager;
292 /// Pass Manager itself does not invalidate any analysis info.
293 void getAnalysisUsage(AnalysisUsage &Info) const override {
294 Info.setPreservesAll();
297 FPPassManager *getContainedManager(unsigned N) {
298 assert(N < PassManagers.size() && "Pass number out of range!");
299 FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
300 return FP;
303 void dumpPassStructure(unsigned Offset) override {
304 for (unsigned I = 0; I < getNumContainedManagers(); ++I)
305 getContainedManager(I)->dumpPassStructure(Offset);
309 void FunctionPassManagerImpl::anchor() {}
311 char FunctionPassManagerImpl::ID = 0;
313 //===----------------------------------------------------------------------===//
314 // FunctionPassManagerImpl implementation
316 bool FunctionPassManagerImpl::doInitialization(Module &M) {
317 bool Changed = false;
319 dumpArguments();
320 dumpPasses();
322 for (ImmutablePass *ImPass : getImmutablePasses())
323 Changed |= ImPass->doInitialization(M);
325 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
326 Changed |= getContainedManager(Index)->doInitialization(M);
328 return Changed;
331 bool FunctionPassManagerImpl::doFinalization(Module &M) {
332 bool Changed = false;
334 for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index)
335 Changed |= getContainedManager(Index)->doFinalization(M);
337 for (ImmutablePass *ImPass : getImmutablePasses())
338 Changed |= ImPass->doFinalization(M);
340 return Changed;
343 void FunctionPassManagerImpl::releaseMemoryOnTheFly() {
344 if (!wasRun)
345 return;
346 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
347 FPPassManager *FPPM = getContainedManager(Index);
348 for (unsigned Index = 0; Index < FPPM->getNumContainedPasses(); ++Index) {
349 FPPM->getContainedPass(Index)->releaseMemory();
352 wasRun = false;
355 // Execute all the passes managed by this top level manager.
356 // Return true if any function is modified by a pass.
357 bool FunctionPassManagerImpl::run(Function &F) {
358 bool Changed = false;
360 initializeAllAnalysisInfo();
361 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
362 Changed |= getContainedManager(Index)->runOnFunction(F);
363 F.getContext().yield();
366 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
367 getContainedManager(Index)->cleanup();
369 wasRun = true;
370 return Changed;
372 } // namespace legacy
373 } // namespace llvm
375 namespace {
376 //===----------------------------------------------------------------------===//
377 // MPPassManager
379 /// MPPassManager manages ModulePasses and function pass managers.
380 /// It batches all Module passes and function pass managers together and
381 /// sequences them to process one module.
382 class MPPassManager : public Pass, public PMDataManager {
383 public:
384 static char ID;
385 explicit MPPassManager() : Pass(PT_PassManager, ID) {}
387 // Delete on the fly managers.
388 ~MPPassManager() override {
389 for (auto &OnTheFlyManager : OnTheFlyManagers) {
390 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
391 delete FPP;
395 /// createPrinterPass - Get a module printer pass.
396 Pass *createPrinterPass(raw_ostream &O,
397 const std::string &Banner) const override {
398 return createPrintModulePass(O, Banner);
401 /// run - Execute all of the passes scheduled for execution. Keep track of
402 /// whether any of the passes modifies the module, and if so, return true.
403 bool runOnModule(Module &M);
405 using llvm::Pass::doInitialization;
406 using llvm::Pass::doFinalization;
408 /// Pass Manager itself does not invalidate any analysis info.
409 void getAnalysisUsage(AnalysisUsage &Info) const override {
410 Info.setPreservesAll();
413 /// Add RequiredPass into list of lower level passes required by pass P.
414 /// RequiredPass is run on the fly by Pass Manager when P requests it
415 /// through getAnalysis interface.
416 void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override;
418 /// Return function pass corresponding to PassInfo PI, that is
419 /// required by module pass MP. Instantiate analysis pass, by using
420 /// its runOnFunction() for function F.
421 std::tuple<Pass *, bool> getOnTheFlyPass(Pass *MP, AnalysisID PI,
422 Function &F) override;
424 StringRef getPassName() const override { return "Module Pass Manager"; }
426 PMDataManager *getAsPMDataManager() override { return this; }
427 Pass *getAsPass() override { return this; }
429 // Print passes managed by this manager
430 void dumpPassStructure(unsigned Offset) override {
431 dbgs().indent(Offset*2) << "ModulePass Manager\n";
432 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
433 ModulePass *MP = getContainedPass(Index);
434 MP->dumpPassStructure(Offset + 1);
435 MapVector<Pass *, legacy::FunctionPassManagerImpl *>::const_iterator I =
436 OnTheFlyManagers.find(MP);
437 if (I != OnTheFlyManagers.end())
438 I->second->dumpPassStructure(Offset + 2);
439 dumpLastUses(MP, Offset+1);
443 ModulePass *getContainedPass(unsigned N) {
444 assert(N < PassVector.size() && "Pass number out of range!");
445 return static_cast<ModulePass *>(PassVector[N]);
448 PassManagerType getPassManagerType() const override {
449 return PMT_ModulePassManager;
452 private:
453 /// Collection of on the fly FPPassManagers. These managers manage
454 /// function passes that are required by module passes.
455 MapVector<Pass *, legacy::FunctionPassManagerImpl *> OnTheFlyManagers;
458 char MPPassManager::ID = 0;
459 } // End anonymous namespace
461 namespace llvm {
462 namespace legacy {
463 //===----------------------------------------------------------------------===//
464 // PassManagerImpl
467 /// PassManagerImpl manages MPPassManagers
468 class PassManagerImpl : public Pass,
469 public PMDataManager,
470 public PMTopLevelManager {
471 virtual void anchor();
473 public:
474 static char ID;
475 explicit PassManagerImpl()
476 : Pass(PT_PassManager, ID), PMTopLevelManager(new MPPassManager()) {}
478 /// \copydoc PassManager::add()
479 void add(Pass *P) {
480 schedulePass(P);
483 /// createPrinterPass - Get a module printer pass.
484 Pass *createPrinterPass(raw_ostream &O,
485 const std::string &Banner) const override {
486 return createPrintModulePass(O, Banner);
489 /// run - Execute all of the passes scheduled for execution. Keep track of
490 /// whether any of the passes modifies the module, and if so, return true.
491 bool run(Module &M);
493 using llvm::Pass::doInitialization;
494 using llvm::Pass::doFinalization;
496 /// Pass Manager itself does not invalidate any analysis info.
497 void getAnalysisUsage(AnalysisUsage &Info) const override {
498 Info.setPreservesAll();
501 PMDataManager *getAsPMDataManager() override { return this; }
502 Pass *getAsPass() override { return this; }
503 PassManagerType getTopLevelPassManagerType() override {
504 return PMT_ModulePassManager;
507 MPPassManager *getContainedManager(unsigned N) {
508 assert(N < PassManagers.size() && "Pass number out of range!");
509 MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
510 return MP;
514 void PassManagerImpl::anchor() {}
516 char PassManagerImpl::ID = 0;
518 //===----------------------------------------------------------------------===//
519 // PassManagerImpl implementation
522 /// run - Execute all of the passes scheduled for execution. Keep track of
523 /// whether any of the passes modifies the module, and if so, return true.
524 bool PassManagerImpl::run(Module &M) {
525 bool Changed = false;
527 dumpArguments();
528 dumpPasses();
530 for (ImmutablePass *ImPass : getImmutablePasses())
531 Changed |= ImPass->doInitialization(M);
533 initializeAllAnalysisInfo();
534 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
535 Changed |= getContainedManager(Index)->runOnModule(M);
536 M.getContext().yield();
539 for (ImmutablePass *ImPass : getImmutablePasses())
540 Changed |= ImPass->doFinalization(M);
542 return Changed;
544 } // namespace legacy
545 } // namespace llvm
547 //===----------------------------------------------------------------------===//
548 // PMTopLevelManager implementation
550 /// Initialize top level manager. Create first pass manager.
551 PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) {
552 PMDM->setTopLevelManager(this);
553 addPassManager(PMDM);
554 activeStack.push(PMDM);
557 /// Set pass P as the last user of the given analysis passes.
558 void
559 PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) {
560 unsigned PDepth = 0;
561 if (P->getResolver())
562 PDepth = P->getResolver()->getPMDataManager().getDepth();
564 for (Pass *AP : AnalysisPasses) {
565 // Record P as the new last user of AP.
566 auto &LastUserOfAP = LastUser[AP];
567 if (LastUserOfAP)
568 InversedLastUser[LastUserOfAP].erase(AP);
569 LastUserOfAP = P;
570 InversedLastUser[P].insert(AP);
572 if (P == AP)
573 continue;
575 // Update the last users of passes that are required transitive by AP.
576 AnalysisUsage *AnUsage = findAnalysisUsage(AP);
577 const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet();
578 SmallVector<Pass *, 12> LastUses;
579 SmallVector<Pass *, 12> LastPMUses;
580 for (AnalysisID ID : IDs) {
581 Pass *AnalysisPass = findAnalysisPass(ID);
582 assert(AnalysisPass && "Expected analysis pass to exist.");
583 AnalysisResolver *AR = AnalysisPass->getResolver();
584 assert(AR && "Expected analysis resolver to exist.");
585 unsigned APDepth = AR->getPMDataManager().getDepth();
587 if (PDepth == APDepth)
588 LastUses.push_back(AnalysisPass);
589 else if (PDepth > APDepth)
590 LastPMUses.push_back(AnalysisPass);
593 setLastUser(LastUses, P);
595 // If this pass has a corresponding pass manager, push higher level
596 // analysis to this pass manager.
597 if (P->getResolver())
598 setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass());
600 // If AP is the last user of other passes then make P last user of
601 // such passes.
602 auto &LastUsedByAP = InversedLastUser[AP];
603 for (Pass *L : LastUsedByAP)
604 LastUser[L] = P;
605 InversedLastUser[P].insert(LastUsedByAP.begin(), LastUsedByAP.end());
606 LastUsedByAP.clear();
610 /// Collect passes whose last user is P
611 void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses,
612 Pass *P) {
613 auto DMI = InversedLastUser.find(P);
614 if (DMI == InversedLastUser.end())
615 return;
617 auto &LU = DMI->second;
618 LastUses.append(LU.begin(), LU.end());
621 AnalysisUsage *PMTopLevelManager::findAnalysisUsage(Pass *P) {
622 AnalysisUsage *AnUsage = nullptr;
623 auto DMI = AnUsageMap.find(P);
624 if (DMI != AnUsageMap.end())
625 AnUsage = DMI->second;
626 else {
627 // Look up the analysis usage from the pass instance (different instances
628 // of the same pass can produce different results), but unique the
629 // resulting object to reduce memory usage. This helps to greatly reduce
630 // memory usage when we have many instances of only a few pass types
631 // (e.g. instcombine, simplifycfg, etc...) which tend to share a fixed set
632 // of dependencies.
633 AnalysisUsage AU;
634 P->getAnalysisUsage(AU);
636 AUFoldingSetNode* Node = nullptr;
637 FoldingSetNodeID ID;
638 AUFoldingSetNode::Profile(ID, AU);
639 void *IP = nullptr;
640 if (auto *N = UniqueAnalysisUsages.FindNodeOrInsertPos(ID, IP))
641 Node = N;
642 else {
643 Node = new (AUFoldingSetNodeAllocator.Allocate()) AUFoldingSetNode(AU);
644 UniqueAnalysisUsages.InsertNode(Node, IP);
646 assert(Node && "cached analysis usage must be non null");
648 AnUsageMap[P] = &Node->AU;
649 AnUsage = &Node->AU;
651 return AnUsage;
654 /// Schedule pass P for execution. Make sure that passes required by
655 /// P are run before P is run. Update analysis info maintained by
656 /// the manager. Remove dead passes. This is a recursive function.
657 void PMTopLevelManager::schedulePass(Pass *P) {
659 // TODO : Allocate function manager for this pass, other wise required set
660 // may be inserted into previous function manager
662 // Give pass a chance to prepare the stage.
663 P->preparePassManager(activeStack);
665 // If P is an analysis pass and it is available then do not
666 // generate the analysis again. Stale analysis info should not be
667 // available at this point.
668 const PassInfo *PI = findAnalysisPassInfo(P->getPassID());
669 if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) {
670 // Remove any cached AnalysisUsage information.
671 AnUsageMap.erase(P);
672 delete P;
673 return;
676 AnalysisUsage *AnUsage = findAnalysisUsage(P);
678 bool checkAnalysis = true;
679 while (checkAnalysis) {
680 checkAnalysis = false;
682 const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet();
683 for (const AnalysisID ID : RequiredSet) {
685 Pass *AnalysisPass = findAnalysisPass(ID);
686 if (!AnalysisPass) {
687 const PassInfo *PI = findAnalysisPassInfo(ID);
689 if (!PI) {
690 // Pass P is not in the global PassRegistry
691 dbgs() << "Pass '" << P->getPassName() << "' is not initialized." << "\n";
692 dbgs() << "Verify if there is a pass dependency cycle." << "\n";
693 dbgs() << "Required Passes:" << "\n";
694 for (const AnalysisID ID2 : RequiredSet) {
695 if (ID == ID2)
696 break;
697 Pass *AnalysisPass2 = findAnalysisPass(ID2);
698 if (AnalysisPass2) {
699 dbgs() << "\t" << AnalysisPass2->getPassName() << "\n";
700 } else {
701 dbgs() << "\t" << "Error: Required pass not found! Possible causes:" << "\n";
702 dbgs() << "\t\t" << "- Pass misconfiguration (e.g.: missing macros)" << "\n";
703 dbgs() << "\t\t" << "- Corruption of the global PassRegistry" << "\n";
708 assert(PI && "Expected required passes to be initialized");
709 AnalysisPass = PI->createPass();
710 if (P->getPotentialPassManagerType () ==
711 AnalysisPass->getPotentialPassManagerType())
712 // Schedule analysis pass that is managed by the same pass manager.
713 schedulePass(AnalysisPass);
714 else if (P->getPotentialPassManagerType () >
715 AnalysisPass->getPotentialPassManagerType()) {
716 // Schedule analysis pass that is managed by a new manager.
717 schedulePass(AnalysisPass);
718 // Recheck analysis passes to ensure that required analyses that
719 // are already checked are still available.
720 checkAnalysis = true;
721 } else
722 // Do not schedule this analysis. Lower level analysis
723 // passes are run on the fly.
724 delete AnalysisPass;
729 // Now all required passes are available.
730 if (ImmutablePass *IP = P->getAsImmutablePass()) {
731 // P is a immutable pass and it will be managed by this
732 // top level manager. Set up analysis resolver to connect them.
733 PMDataManager *DM = getAsPMDataManager();
734 AnalysisResolver *AR = new AnalysisResolver(*DM);
735 P->setResolver(AR);
736 DM->initializeAnalysisImpl(P);
737 addImmutablePass(IP);
738 DM->recordAvailableAnalysis(IP);
739 return;
742 if (PI && !PI->isAnalysis() && shouldPrintBeforePass(PI->getPassArgument())) {
743 Pass *PP =
744 P->createPrinterPass(dbgs(), ("*** IR Dump Before " + P->getPassName() +
745 " (" + PI->getPassArgument() + ") ***")
746 .str());
747 PP->assignPassManager(activeStack, getTopLevelPassManagerType());
750 // Add the requested pass to the best available pass manager.
751 P->assignPassManager(activeStack, getTopLevelPassManagerType());
753 if (PI && !PI->isAnalysis() && shouldPrintAfterPass(PI->getPassArgument())) {
754 Pass *PP =
755 P->createPrinterPass(dbgs(), ("*** IR Dump After " + P->getPassName() +
756 " (" + PI->getPassArgument() + ") ***")
757 .str());
758 PP->assignPassManager(activeStack, getTopLevelPassManagerType());
762 /// Find the pass that implements Analysis AID. Search immutable
763 /// passes and all pass managers. If desired pass is not found
764 /// then return NULL.
765 Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
766 // For immutable passes we have a direct mapping from ID to pass, so check
767 // that first.
768 if (Pass *P = ImmutablePassMap.lookup(AID))
769 return P;
771 // Check pass managers
772 for (PMDataManager *PassManager : PassManagers)
773 if (Pass *P = PassManager->findAnalysisPass(AID, false))
774 return P;
776 // Check other pass managers
777 for (PMDataManager *IndirectPassManager : IndirectPassManagers)
778 if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
779 return P;
781 return nullptr;
784 const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const {
785 const PassInfo *&PI = AnalysisPassInfos[AID];
786 if (!PI)
787 PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
788 else
789 assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) &&
790 "The pass info pointer changed for an analysis ID!");
792 return PI;
795 void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
796 P->initializePass();
797 ImmutablePasses.push_back(P);
799 // Add this pass to the map from its analysis ID. We clobber any prior runs
800 // of the pass in the map so that the last one added is the one found when
801 // doing lookups.
802 AnalysisID AID = P->getPassID();
803 ImmutablePassMap[AID] = P;
805 // Also add any interfaces implemented by the immutable pass to the map for
806 // fast lookup.
807 const PassInfo *PassInf = findAnalysisPassInfo(AID);
808 assert(PassInf && "Expected all immutable passes to be initialized");
809 for (const PassInfo *ImmPI : PassInf->getInterfacesImplemented())
810 ImmutablePassMap[ImmPI->getTypeInfo()] = P;
813 // Print passes managed by this top level manager.
814 void PMTopLevelManager::dumpPasses() const {
816 if (PassDebugging < Structure)
817 return;
819 // Print out the immutable passes
820 for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
821 ImmutablePasses[i]->dumpPassStructure(0);
824 // Every class that derives from PMDataManager also derives from Pass
825 // (sometimes indirectly), but there's no inheritance relationship
826 // between PMDataManager and Pass, so we have to getAsPass to get
827 // from a PMDataManager* to a Pass*.
828 for (PMDataManager *Manager : PassManagers)
829 Manager->getAsPass()->dumpPassStructure(1);
832 void PMTopLevelManager::dumpArguments() const {
834 if (PassDebugging < Arguments)
835 return;
837 dbgs() << "Pass Arguments: ";
838 for (ImmutablePass *P : ImmutablePasses)
839 if (const PassInfo *PI = findAnalysisPassInfo(P->getPassID())) {
840 assert(PI && "Expected all immutable passes to be initialized");
841 if (!PI->isAnalysisGroup())
842 dbgs() << " -" << PI->getPassArgument();
844 for (PMDataManager *PM : PassManagers)
845 PM->dumpPassArguments();
846 dbgs() << "\n";
849 void PMTopLevelManager::initializeAllAnalysisInfo() {
850 for (PMDataManager *PM : PassManagers)
851 PM->initializeAnalysisInfo();
853 // Initailize other pass managers
854 for (PMDataManager *IPM : IndirectPassManagers)
855 IPM->initializeAnalysisInfo();
858 /// Destructor
859 PMTopLevelManager::~PMTopLevelManager() {
860 for (PMDataManager *PM : PassManagers)
861 delete PM;
863 for (ImmutablePass *P : ImmutablePasses)
864 delete P;
867 //===----------------------------------------------------------------------===//
868 // PMDataManager implementation
870 /// Augement AvailableAnalysis by adding analysis made available by pass P.
871 void PMDataManager::recordAvailableAnalysis(Pass *P) {
872 AnalysisID PI = P->getPassID();
874 AvailableAnalysis[PI] = P;
876 assert(!AvailableAnalysis.empty());
878 // This pass is the current implementation of all of the interfaces it
879 // implements as well.
880 const PassInfo *PInf = TPM->findAnalysisPassInfo(PI);
881 if (!PInf) return;
882 for (const PassInfo *PI : PInf->getInterfacesImplemented())
883 AvailableAnalysis[PI->getTypeInfo()] = P;
886 // Return true if P preserves high level analysis used by other
887 // passes managed by this manager
888 bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
889 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
890 if (AnUsage->getPreservesAll())
891 return true;
893 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
894 for (Pass *P1 : HigherLevelAnalysis) {
895 if (P1->getAsImmutablePass() == nullptr &&
896 !is_contained(PreservedSet, P1->getPassID()))
897 return false;
900 return true;
903 /// verifyPreservedAnalysis -- Verify analysis preserved by pass P.
904 void PMDataManager::verifyPreservedAnalysis(Pass *P) {
905 // Don't do this unless assertions are enabled.
906 #ifdef NDEBUG
907 return;
908 #endif
909 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
910 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
912 // Verify preserved analysis
913 for (AnalysisID AID : PreservedSet) {
914 if (Pass *AP = findAnalysisPass(AID, true)) {
915 TimeRegion PassTimer(getPassTimer(AP));
916 AP->verifyAnalysis();
921 /// Remove Analysis not preserved by Pass P
922 void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
923 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
924 if (AnUsage->getPreservesAll())
925 return;
927 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet();
928 for (DenseMap<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
929 E = AvailableAnalysis.end(); I != E; ) {
930 DenseMap<AnalysisID, Pass*>::iterator Info = I++;
931 if (Info->second->getAsImmutablePass() == nullptr &&
932 !is_contained(PreservedSet, Info->first)) {
933 // Remove this analysis
934 if (PassDebugging >= Details) {
935 Pass *S = Info->second;
936 dbgs() << " -- '" << P->getPassName() << "' is not preserving '";
937 dbgs() << S->getPassName() << "'\n";
939 AvailableAnalysis.erase(Info);
943 // Check inherited analysis also. If P is not preserving analysis
944 // provided by parent manager then remove it here.
945 for (DenseMap<AnalysisID, Pass *> *IA : InheritedAnalysis) {
946 if (!IA)
947 continue;
949 for (DenseMap<AnalysisID, Pass *>::iterator I = IA->begin(),
950 E = IA->end();
951 I != E;) {
952 DenseMap<AnalysisID, Pass *>::iterator Info = I++;
953 if (Info->second->getAsImmutablePass() == nullptr &&
954 !is_contained(PreservedSet, Info->first)) {
955 // Remove this analysis
956 if (PassDebugging >= Details) {
957 Pass *S = Info->second;
958 dbgs() << " -- '" << P->getPassName() << "' is not preserving '";
959 dbgs() << S->getPassName() << "'\n";
961 IA->erase(Info);
967 /// Remove analysis passes that are not used any longer
968 void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
969 enum PassDebuggingString DBG_STR) {
971 SmallVector<Pass *, 12> DeadPasses;
973 // If this is a on the fly manager then it does not have TPM.
974 if (!TPM)
975 return;
977 TPM->collectLastUses(DeadPasses, P);
979 if (PassDebugging >= Details && !DeadPasses.empty()) {
980 dbgs() << " -*- '" << P->getPassName();
981 dbgs() << "' is the last user of following pass instances.";
982 dbgs() << " Free these instances\n";
985 for (Pass *P : DeadPasses)
986 freePass(P, Msg, DBG_STR);
989 void PMDataManager::freePass(Pass *P, StringRef Msg,
990 enum PassDebuggingString DBG_STR) {
991 dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
994 // If the pass crashes releasing memory, remember this.
995 PassManagerPrettyStackEntry X(P);
996 TimeRegion PassTimer(getPassTimer(P));
998 P->releaseMemory();
1001 AnalysisID PI = P->getPassID();
1002 if (const PassInfo *PInf = TPM->findAnalysisPassInfo(PI)) {
1003 // Remove the pass itself (if it is not already removed).
1004 AvailableAnalysis.erase(PI);
1006 // Remove all interfaces this pass implements, for which it is also
1007 // listed as the available implementation.
1008 for (const PassInfo *PI : PInf->getInterfacesImplemented()) {
1009 DenseMap<AnalysisID, Pass *>::iterator Pos =
1010 AvailableAnalysis.find(PI->getTypeInfo());
1011 if (Pos != AvailableAnalysis.end() && Pos->second == P)
1012 AvailableAnalysis.erase(Pos);
1017 /// Add pass P into the PassVector. Update
1018 /// AvailableAnalysis appropriately if ProcessAnalysis is true.
1019 void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
1020 // This manager is going to manage pass P. Set up analysis resolver
1021 // to connect them.
1022 AnalysisResolver *AR = new AnalysisResolver(*this);
1023 P->setResolver(AR);
1025 // If a FunctionPass F is the last user of ModulePass info M
1026 // then the F's manager, not F, records itself as a last user of M.
1027 SmallVector<Pass *, 12> TransferLastUses;
1029 if (!ProcessAnalysis) {
1030 // Add pass
1031 PassVector.push_back(P);
1032 return;
1035 // At the moment, this pass is the last user of all required passes.
1036 SmallVector<Pass *, 12> LastUses;
1037 SmallVector<Pass *, 8> UsedPasses;
1038 SmallVector<AnalysisID, 8> ReqAnalysisNotAvailable;
1040 unsigned PDepth = this->getDepth();
1042 collectRequiredAndUsedAnalyses(UsedPasses, ReqAnalysisNotAvailable, P);
1043 for (Pass *PUsed : UsedPasses) {
1044 unsigned RDepth = 0;
1046 assert(PUsed->getResolver() && "Analysis Resolver is not set");
1047 PMDataManager &DM = PUsed->getResolver()->getPMDataManager();
1048 RDepth = DM.getDepth();
1050 if (PDepth == RDepth)
1051 LastUses.push_back(PUsed);
1052 else if (PDepth > RDepth) {
1053 // Let the parent claim responsibility of last use
1054 TransferLastUses.push_back(PUsed);
1055 // Keep track of higher level analysis used by this manager.
1056 HigherLevelAnalysis.push_back(PUsed);
1057 } else
1058 llvm_unreachable("Unable to accommodate Used Pass");
1061 // Set P as P's last user until someone starts using P.
1062 // However, if P is a Pass Manager then it does not need
1063 // to record its last user.
1064 if (!P->getAsPMDataManager())
1065 LastUses.push_back(P);
1066 TPM->setLastUser(LastUses, P);
1068 if (!TransferLastUses.empty()) {
1069 Pass *My_PM = getAsPass();
1070 TPM->setLastUser(TransferLastUses, My_PM);
1071 TransferLastUses.clear();
1074 // Now, take care of required analyses that are not available.
1075 for (AnalysisID ID : ReqAnalysisNotAvailable) {
1076 const PassInfo *PI = TPM->findAnalysisPassInfo(ID);
1077 Pass *AnalysisPass = PI->createPass();
1078 this->addLowerLevelRequiredPass(P, AnalysisPass);
1081 // Take a note of analysis required and made available by this pass.
1082 // Remove the analysis not preserved by this pass
1083 removeNotPreservedAnalysis(P);
1084 recordAvailableAnalysis(P);
1086 // Add pass
1087 PassVector.push_back(P);
1091 /// Populate UP with analysis pass that are used or required by
1092 /// pass P and are available. Populate RP_NotAvail with analysis
1093 /// pass that are required by pass P but are not available.
1094 void PMDataManager::collectRequiredAndUsedAnalyses(
1095 SmallVectorImpl<Pass *> &UP, SmallVectorImpl<AnalysisID> &RP_NotAvail,
1096 Pass *P) {
1097 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1099 for (const auto &UsedID : AnUsage->getUsedSet())
1100 if (Pass *AnalysisPass = findAnalysisPass(UsedID, true))
1101 UP.push_back(AnalysisPass);
1103 for (const auto &RequiredID : AnUsage->getRequiredSet())
1104 if (Pass *AnalysisPass = findAnalysisPass(RequiredID, true))
1105 UP.push_back(AnalysisPass);
1106 else
1107 RP_NotAvail.push_back(RequiredID);
1110 // All Required analyses should be available to the pass as it runs! Here
1111 // we fill in the AnalysisImpls member of the pass so that it can
1112 // successfully use the getAnalysis() method to retrieve the
1113 // implementations it needs.
1115 void PMDataManager::initializeAnalysisImpl(Pass *P) {
1116 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1118 for (const AnalysisID ID : AnUsage->getRequiredSet()) {
1119 Pass *Impl = findAnalysisPass(ID, true);
1120 if (!Impl)
1121 // This may be analysis pass that is initialized on the fly.
1122 // If that is not the case then it will raise an assert when it is used.
1123 continue;
1124 AnalysisResolver *AR = P->getResolver();
1125 assert(AR && "Analysis Resolver is not set");
1126 AR->addAnalysisImplsPair(ID, Impl);
1130 /// Find the pass that implements Analysis AID. If desired pass is not found
1131 /// then return NULL.
1132 Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
1134 // Check if AvailableAnalysis map has one entry.
1135 DenseMap<AnalysisID, Pass*>::const_iterator I = AvailableAnalysis.find(AID);
1137 if (I != AvailableAnalysis.end())
1138 return I->second;
1140 // Search Parents through TopLevelManager
1141 if (SearchParent)
1142 return TPM->findAnalysisPass(AID);
1144 return nullptr;
1147 // Print list of passes that are last used by P.
1148 void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
1149 if (PassDebugging < Details)
1150 return;
1152 SmallVector<Pass *, 12> LUses;
1154 // If this is a on the fly manager then it does not have TPM.
1155 if (!TPM)
1156 return;
1158 TPM->collectLastUses(LUses, P);
1160 for (Pass *P : LUses) {
1161 dbgs() << "--" << std::string(Offset*2, ' ');
1162 P->dumpPassStructure(0);
1166 void PMDataManager::dumpPassArguments() const {
1167 for (Pass *P : PassVector) {
1168 if (PMDataManager *PMD = P->getAsPMDataManager())
1169 PMD->dumpPassArguments();
1170 else
1171 if (const PassInfo *PI =
1172 TPM->findAnalysisPassInfo(P->getPassID()))
1173 if (!PI->isAnalysisGroup())
1174 dbgs() << " -" << PI->getPassArgument();
1178 void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1,
1179 enum PassDebuggingString S2,
1180 StringRef Msg) {
1181 if (PassDebugging < Executions)
1182 return;
1183 dbgs() << "[" << std::chrono::system_clock::now() << "] " << (void *)this
1184 << std::string(getDepth() * 2 + 1, ' ');
1185 switch (S1) {
1186 case EXECUTION_MSG:
1187 dbgs() << "Executing Pass '" << P->getPassName();
1188 break;
1189 case MODIFICATION_MSG:
1190 dbgs() << "Made Modification '" << P->getPassName();
1191 break;
1192 case FREEING_MSG:
1193 dbgs() << " Freeing Pass '" << P->getPassName();
1194 break;
1195 default:
1196 break;
1198 switch (S2) {
1199 case ON_FUNCTION_MSG:
1200 dbgs() << "' on Function '" << Msg << "'...\n";
1201 break;
1202 case ON_MODULE_MSG:
1203 dbgs() << "' on Module '" << Msg << "'...\n";
1204 break;
1205 case ON_REGION_MSG:
1206 dbgs() << "' on Region '" << Msg << "'...\n";
1207 break;
1208 case ON_LOOP_MSG:
1209 dbgs() << "' on Loop '" << Msg << "'...\n";
1210 break;
1211 case ON_CG_MSG:
1212 dbgs() << "' on Call Graph Nodes '" << Msg << "'...\n";
1213 break;
1214 default:
1215 break;
1219 void PMDataManager::dumpRequiredSet(const Pass *P) const {
1220 if (PassDebugging < Details)
1221 return;
1223 AnalysisUsage analysisUsage;
1224 P->getAnalysisUsage(analysisUsage);
1225 dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet());
1228 void PMDataManager::dumpPreservedSet(const Pass *P) const {
1229 if (PassDebugging < Details)
1230 return;
1232 AnalysisUsage analysisUsage;
1233 P->getAnalysisUsage(analysisUsage);
1234 dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet());
1237 void PMDataManager::dumpUsedSet(const Pass *P) const {
1238 if (PassDebugging < Details)
1239 return;
1241 AnalysisUsage analysisUsage;
1242 P->getAnalysisUsage(analysisUsage);
1243 dumpAnalysisUsage("Used", P, analysisUsage.getUsedSet());
1246 void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,
1247 const AnalysisUsage::VectorType &Set) const {
1248 assert(PassDebugging >= Details);
1249 if (Set.empty())
1250 return;
1251 dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
1252 for (unsigned i = 0; i != Set.size(); ++i) {
1253 if (i) dbgs() << ',';
1254 const PassInfo *PInf = TPM->findAnalysisPassInfo(Set[i]);
1255 if (!PInf) {
1256 // Some preserved passes, such as AliasAnalysis, may not be initialized by
1257 // all drivers.
1258 dbgs() << " Uninitialized Pass";
1259 continue;
1261 dbgs() << ' ' << PInf->getPassName();
1263 dbgs() << '\n';
1266 /// Add RequiredPass into list of lower level passes required by pass P.
1267 /// RequiredPass is run on the fly by Pass Manager when P requests it
1268 /// through getAnalysis interface.
1269 /// This should be handled by specific pass manager.
1270 void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1271 if (TPM) {
1272 TPM->dumpArguments();
1273 TPM->dumpPasses();
1276 // Module Level pass may required Function Level analysis info
1277 // (e.g. dominator info). Pass manager uses on the fly function pass manager
1278 // to provide this on demand. In that case, in Pass manager terminology,
1279 // module level pass is requiring lower level analysis info managed by
1280 // lower level pass manager.
1282 // When Pass manager is not able to order required analysis info, Pass manager
1283 // checks whether any lower level manager will be able to provide this
1284 // analysis info on demand or not.
1285 #ifndef NDEBUG
1286 dbgs() << "Unable to schedule '" << RequiredPass->getPassName();
1287 dbgs() << "' required by '" << P->getPassName() << "'\n";
1288 #endif
1289 llvm_unreachable("Unable to schedule pass");
1292 std::tuple<Pass *, bool> PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI,
1293 Function &F) {
1294 llvm_unreachable("Unable to find on the fly pass");
1297 // Destructor
1298 PMDataManager::~PMDataManager() {
1299 for (Pass *P : PassVector)
1300 delete P;
1303 //===----------------------------------------------------------------------===//
1304 // NOTE: Is this the right place to define this method ?
1305 // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist.
1306 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID) const {
1307 return PM.findAnalysisPass(ID, true);
1310 std::tuple<Pass *, bool>
1311 AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI, Function &F) {
1312 return PM.getOnTheFlyPass(P, AnalysisPI, F);
1315 namespace llvm {
1316 namespace legacy {
1318 //===----------------------------------------------------------------------===//
1319 // FunctionPassManager implementation
1321 /// Create new Function pass manager
1322 FunctionPassManager::FunctionPassManager(Module *m) : M(m) {
1323 FPM = new legacy::FunctionPassManagerImpl();
1324 // FPM is the top level manager.
1325 FPM->setTopLevelManager(FPM);
1327 AnalysisResolver *AR = new AnalysisResolver(*FPM);
1328 FPM->setResolver(AR);
1331 FunctionPassManager::~FunctionPassManager() {
1332 delete FPM;
1335 void FunctionPassManager::add(Pass *P) {
1336 FPM->add(P);
1339 /// run - Execute all of the passes scheduled for execution. Keep
1340 /// track of whether any of the passes modifies the function, and if
1341 /// so, return true.
1343 bool FunctionPassManager::run(Function &F) {
1344 handleAllErrors(F.materialize(), [&](ErrorInfoBase &EIB) {
1345 report_fatal_error(Twine("Error reading bitcode file: ") + EIB.message());
1347 return FPM->run(F);
1351 /// doInitialization - Run all of the initializers for the function passes.
1353 bool FunctionPassManager::doInitialization() {
1354 return FPM->doInitialization(*M);
1357 /// doFinalization - Run all of the finalizers for the function passes.
1359 bool FunctionPassManager::doFinalization() {
1360 return FPM->doFinalization(*M);
1362 } // namespace legacy
1363 } // namespace llvm
1365 /// cleanup - After running all passes, clean up pass manager cache.
1366 void FPPassManager::cleanup() {
1367 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1368 FunctionPass *FP = getContainedPass(Index);
1369 AnalysisResolver *AR = FP->getResolver();
1370 assert(AR && "Analysis Resolver is not set");
1371 AR->clearAnalysisImpls();
1376 //===----------------------------------------------------------------------===//
1377 // FPPassManager implementation
1379 char FPPassManager::ID = 0;
1380 /// Print passes managed by this manager
1381 void FPPassManager::dumpPassStructure(unsigned Offset) {
1382 dbgs().indent(Offset*2) << "FunctionPass Manager\n";
1383 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1384 FunctionPass *FP = getContainedPass(Index);
1385 FP->dumpPassStructure(Offset + 1);
1386 dumpLastUses(FP, Offset+1);
1390 /// Execute all of the passes scheduled for execution by invoking
1391 /// runOnFunction method. Keep track of whether any of the passes modifies
1392 /// the function, and if so, return true.
1393 bool FPPassManager::runOnFunction(Function &F) {
1394 if (F.isDeclaration())
1395 return false;
1397 bool Changed = false;
1398 Module &M = *F.getParent();
1399 // Collect inherited analysis from Module level pass manager.
1400 populateInheritedAnalysis(TPM->activeStack);
1402 unsigned InstrCount, FunctionSize = 0;
1403 StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1404 bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1405 // Collect the initial size of the module.
1406 if (EmitICRemark) {
1407 InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1408 FunctionSize = F.getInstructionCount();
1411 // Store name outside of loop to avoid redundant calls.
1412 const StringRef Name = F.getName();
1413 llvm::TimeTraceScope FunctionScope("OptFunction", Name);
1415 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1416 FunctionPass *FP = getContainedPass(Index);
1417 bool LocalChanged = false;
1419 // Call getPassName only when required. The call itself is fairly cheap, but
1420 // still virtual and repeated calling adds unnecessary overhead.
1421 llvm::TimeTraceScope PassScope(
1422 "RunPass", [FP]() { return std::string(FP->getPassName()); });
1424 dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, Name);
1425 dumpRequiredSet(FP);
1427 initializeAnalysisImpl(FP);
1430 PassManagerPrettyStackEntry X(FP, F);
1431 TimeRegion PassTimer(getPassTimer(FP));
1432 #ifdef EXPENSIVE_CHECKS
1433 uint64_t RefHash = FP->structuralHash(F);
1434 #endif
1435 LocalChanged |= FP->runOnFunction(F);
1437 #if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
1438 if (!LocalChanged && (RefHash != FP->structuralHash(F))) {
1439 llvm::errs() << "Pass modifies its input and doesn't report it: "
1440 << FP->getPassName() << "\n";
1441 llvm_unreachable("Pass modifies its input and doesn't report it");
1443 #endif
1445 if (EmitICRemark) {
1446 unsigned NewSize = F.getInstructionCount();
1448 // Update the size of the function, emit a remark, and update the size
1449 // of the module.
1450 if (NewSize != FunctionSize) {
1451 int64_t Delta = static_cast<int64_t>(NewSize) -
1452 static_cast<int64_t>(FunctionSize);
1453 emitInstrCountChangedRemark(FP, M, Delta, InstrCount,
1454 FunctionToInstrCount, &F);
1455 InstrCount = static_cast<int64_t>(InstrCount) + Delta;
1456 FunctionSize = NewSize;
1461 Changed |= LocalChanged;
1462 if (LocalChanged)
1463 dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, Name);
1464 dumpPreservedSet(FP);
1465 dumpUsedSet(FP);
1467 verifyPreservedAnalysis(FP);
1468 if (LocalChanged)
1469 removeNotPreservedAnalysis(FP);
1470 recordAvailableAnalysis(FP);
1471 removeDeadPasses(FP, Name, ON_FUNCTION_MSG);
1474 return Changed;
1477 bool FPPassManager::runOnModule(Module &M) {
1478 bool Changed = false;
1480 for (Function &F : M)
1481 Changed |= runOnFunction(F);
1483 return Changed;
1486 bool FPPassManager::doInitialization(Module &M) {
1487 bool Changed = false;
1489 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1490 Changed |= getContainedPass(Index)->doInitialization(M);
1492 return Changed;
1495 bool FPPassManager::doFinalization(Module &M) {
1496 bool Changed = false;
1498 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1499 Changed |= getContainedPass(Index)->doFinalization(M);
1501 return Changed;
1504 //===----------------------------------------------------------------------===//
1505 // MPPassManager implementation
1507 /// Execute all of the passes scheduled for execution by invoking
1508 /// runOnModule method. Keep track of whether any of the passes modifies
1509 /// the module, and if so, return true.
1510 bool
1511 MPPassManager::runOnModule(Module &M) {
1512 llvm::TimeTraceScope TimeScope("OptModule", M.getName());
1514 bool Changed = false;
1516 // Initialize on-the-fly passes
1517 for (auto &OnTheFlyManager : OnTheFlyManagers) {
1518 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1519 Changed |= FPP->doInitialization(M);
1522 // Initialize module passes
1523 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1524 Changed |= getContainedPass(Index)->doInitialization(M);
1526 unsigned InstrCount;
1527 StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1528 bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1529 // Collect the initial size of the module.
1530 if (EmitICRemark)
1531 InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1533 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1534 ModulePass *MP = getContainedPass(Index);
1535 bool LocalChanged = false;
1537 dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1538 dumpRequiredSet(MP);
1540 initializeAnalysisImpl(MP);
1543 PassManagerPrettyStackEntry X(MP, M);
1544 TimeRegion PassTimer(getPassTimer(MP));
1546 #ifdef EXPENSIVE_CHECKS
1547 uint64_t RefHash = MP->structuralHash(M);
1548 #endif
1550 LocalChanged |= MP->runOnModule(M);
1552 #ifdef EXPENSIVE_CHECKS
1553 assert((LocalChanged || (RefHash == MP->structuralHash(M))) &&
1554 "Pass modifies its input and doesn't report it.");
1555 #endif
1557 if (EmitICRemark) {
1558 // Update the size of the module.
1559 unsigned ModuleCount = M.getInstructionCount();
1560 if (ModuleCount != InstrCount) {
1561 int64_t Delta = static_cast<int64_t>(ModuleCount) -
1562 static_cast<int64_t>(InstrCount);
1563 emitInstrCountChangedRemark(MP, M, Delta, InstrCount,
1564 FunctionToInstrCount);
1565 InstrCount = ModuleCount;
1570 Changed |= LocalChanged;
1571 if (LocalChanged)
1572 dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1573 M.getModuleIdentifier());
1574 dumpPreservedSet(MP);
1575 dumpUsedSet(MP);
1577 verifyPreservedAnalysis(MP);
1578 if (LocalChanged)
1579 removeNotPreservedAnalysis(MP);
1580 recordAvailableAnalysis(MP);
1581 removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1584 // Finalize module passes
1585 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1586 Changed |= getContainedPass(Index)->doFinalization(M);
1588 // Finalize on-the-fly passes
1589 for (auto &OnTheFlyManager : OnTheFlyManagers) {
1590 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1591 // We don't know when is the last time an on-the-fly pass is run,
1592 // so we need to releaseMemory / finalize here
1593 FPP->releaseMemoryOnTheFly();
1594 Changed |= FPP->doFinalization(M);
1597 return Changed;
1600 /// Add RequiredPass into list of lower level passes required by pass P.
1601 /// RequiredPass is run on the fly by Pass Manager when P requests it
1602 /// through getAnalysis interface.
1603 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1604 assert(RequiredPass && "No required pass?");
1605 assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1606 "Unable to handle Pass that requires lower level Analysis pass");
1607 assert((P->getPotentialPassManagerType() <
1608 RequiredPass->getPotentialPassManagerType()) &&
1609 "Unable to handle Pass that requires lower level Analysis pass");
1611 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1612 if (!FPP) {
1613 FPP = new legacy::FunctionPassManagerImpl();
1614 // FPP is the top level manager.
1615 FPP->setTopLevelManager(FPP);
1617 OnTheFlyManagers[P] = FPP;
1619 const PassInfo *RequiredPassPI =
1620 TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1622 Pass *FoundPass = nullptr;
1623 if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1624 FoundPass =
1625 ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1627 if (!FoundPass) {
1628 FoundPass = RequiredPass;
1629 // This should be guaranteed to add RequiredPass to the passmanager given
1630 // that we checked for an available analysis above.
1631 FPP->add(RequiredPass);
1633 // Register P as the last user of FoundPass or RequiredPass.
1634 SmallVector<Pass *, 1> LU;
1635 LU.push_back(FoundPass);
1636 FPP->setLastUser(LU, P);
1639 /// Return function pass corresponding to PassInfo PI, that is
1640 /// required by module pass MP. Instantiate analysis pass, by using
1641 /// its runOnFunction() for function F.
1642 std::tuple<Pass *, bool> MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI,
1643 Function &F) {
1644 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1645 assert(FPP && "Unable to find on the fly pass");
1647 FPP->releaseMemoryOnTheFly();
1648 bool Changed = FPP->run(F);
1649 return std::make_tuple(((PMTopLevelManager *)FPP)->findAnalysisPass(PI),
1650 Changed);
1653 namespace llvm {
1654 namespace legacy {
1656 //===----------------------------------------------------------------------===//
1657 // PassManager implementation
1659 /// Create new pass manager
1660 PassManager::PassManager() {
1661 PM = new PassManagerImpl();
1662 // PM is the top level manager
1663 PM->setTopLevelManager(PM);
1666 PassManager::~PassManager() {
1667 delete PM;
1670 void PassManager::add(Pass *P) {
1671 PM->add(P);
1674 /// run - Execute all of the passes scheduled for execution. Keep track of
1675 /// whether any of the passes modifies the module, and if so, return true.
1676 bool PassManager::run(Module &M) {
1677 return PM->run(M);
1679 } // namespace legacy
1680 } // namespace llvm
1682 //===----------------------------------------------------------------------===//
1683 // PMStack implementation
1686 // Pop Pass Manager from the stack and clear its analysis info.
1687 void PMStack::pop() {
1689 PMDataManager *Top = this->top();
1690 Top->initializeAnalysisInfo();
1692 S.pop_back();
1695 // Push PM on the stack and set its top level manager.
1696 void PMStack::push(PMDataManager *PM) {
1697 assert(PM && "Unable to push. Pass Manager expected");
1698 assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1700 if (!this->empty()) {
1701 assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1702 && "pushing bad pass manager to PMStack");
1703 PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1705 assert(TPM && "Unable to find top level manager");
1706 TPM->addIndirectPassManager(PM);
1707 PM->setTopLevelManager(TPM);
1708 PM->setDepth(this->top()->getDepth()+1);
1709 } else {
1710 assert((PM->getPassManagerType() == PMT_ModulePassManager
1711 || PM->getPassManagerType() == PMT_FunctionPassManager)
1712 && "pushing bad pass manager to PMStack");
1713 PM->setDepth(1);
1716 S.push_back(PM);
1719 // Dump content of the pass manager stack.
1720 LLVM_DUMP_METHOD void PMStack::dump() const {
1721 for (PMDataManager *Manager : S)
1722 dbgs() << Manager->getAsPass()->getPassName() << ' ';
1724 if (!S.empty())
1725 dbgs() << '\n';
1728 /// Find appropriate Module Pass Manager in the PM Stack and
1729 /// add self into that manager.
1730 void ModulePass::assignPassManager(PMStack &PMS,
1731 PassManagerType PreferredType) {
1732 // Find Module Pass Manager
1733 PassManagerType T;
1734 while ((T = PMS.top()->getPassManagerType()) > PMT_ModulePassManager &&
1735 T != PreferredType)
1736 PMS.pop();
1737 PMS.top()->add(this);
1740 /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1741 /// in the PM Stack and add self into that manager.
1742 void FunctionPass::assignPassManager(PMStack &PMS,
1743 PassManagerType /*PreferredType*/) {
1744 // Find Function Pass Manager
1745 PMDataManager *PM;
1746 while (PM = PMS.top(), PM->getPassManagerType() > PMT_FunctionPassManager)
1747 PMS.pop();
1749 // Create new Function Pass Manager if needed.
1750 if (PM->getPassManagerType() != PMT_FunctionPassManager) {
1751 // [1] Create new Function Pass Manager
1752 auto *FPP = new FPPassManager;
1753 FPP->populateInheritedAnalysis(PMS);
1755 // [2] Set up new manager's top level manager
1756 PM->getTopLevelManager()->addIndirectPassManager(FPP);
1758 // [3] Assign manager to manage this new manager. This may create
1759 // and push new managers into PMS
1760 FPP->assignPassManager(PMS, PM->getPassManagerType());
1762 // [4] Push new manager into PMS
1763 PMS.push(FPP);
1764 PM = FPP;
1767 // Assign FPP as the manager of this pass.
1768 PM->add(this);
1771 legacy::PassManagerBase::~PassManagerBase() = default;