1 //===- LegacyPassManager.cpp - LLVM Pass Infrastructure Implementation ----===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the legacy LLVM Pass Manager infrastructure.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "llvm/IR/LegacyPassManager.h"
14 #include "llvm/ADT/MapVector.h"
15 #include "llvm/IR/DiagnosticInfo.h"
16 #include "llvm/IR/IRPrintingPasses.h"
17 #include "llvm/IR/LLVMContext.h"
18 #include "llvm/IR/LegacyPassManagers.h"
19 #include "llvm/IR/Module.h"
20 #include "llvm/IR/PassTimingInfo.h"
21 #include "llvm/IR/PrintPasses.h"
22 #include "llvm/Support/Chrono.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/Error.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/TimeProfiler.h"
28 #include "llvm/Support/Timer.h"
29 #include "llvm/Support/raw_ostream.h"
30 #include <algorithm>
31
32 using namespace llvm;
33
34 // See PassManagers.h for Pass Manager infrastructure overview.
35
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.
41 //
42
43 namespace {
44 // Different debug levels that can be enabled...
45 enum PassDebugLevel {
46 Disabled, Arguments, Structure, Executions, Details
47 };
48 } // namespace
49
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")));
58
59 /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
60 /// or higher is specified.
isPassDebuggingExecutionsOrMore() const61 bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
62 return PassDebugging >= Executions;
63 }
64
initSizeRemarkInfo(Module & M,StringMap<std::pair<unsigned,unsigned>> & FunctionToInstrCount)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;
69
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();
74
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;
83 }
84 return InstrCount;
85 }
86
emitInstrCountChangedRemark(Pass * P,Module & M,int64_t Delta,unsigned CountBefore,StringMap<std::pair<unsigned,unsigned>> & FunctionToInstrCount,Function * F)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;
97
98 // Set to true if this isn't a module pass or CGSCC pass.
99 bool CouldOnlyImpactOneFunction = (F != nullptr);
100
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());
107
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;
114 }
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;
118 };
119
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);
127
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(); });
135
136 // Didn't find a function. Quit.
137 if (It == M.end())
138 return;
139
140 // We found a function containing at least one basic block.
141 F = &*It;
142 }
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.
157
158 // Emit per-function size change remarks separately.
159 std::string PassName = P->getPassName().str();
160
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);
169
170 if (FnDelta == 0)
171 return;
172
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);
193
194 // Update the function size.
195 Change.first = FnCountAfter;
196 };
197
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());
206 }
207
print(raw_ostream & OS) const208 void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
209 if (!V && !M)
210 OS << "Releasing pass '";
211 else
212 OS << "Running pass '";
213
214 OS << P->getPassName() << "'";
215
216 if (M) {
217 OS << " on module '" << M->getModuleIdentifier() << "'.\n";
218 return;
219 }
220 if (!V) {
221 OS << '\n';
222 return;
223 }
224
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";
232
233 OS << " '";
234 V->printAsOperand(OS, /*PrintType=*/false, M);
235 OS << "'\n";
236 }
237
238 namespace llvm {
239 namespace legacy {
debugPassSpecified()240 bool debugPassSpecified() { return PassDebugging != Disabled; }
241
242 //===----------------------------------------------------------------------===//
243 // FunctionPassManagerImpl
244 //
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;
FunctionPassManagerImpl()254 explicit FunctionPassManagerImpl()
255 : Pass(PT_PassManager, ID), PMTopLevelManager(new FPPassManager()),
256 wasRun(false) {}
257
258 /// \copydoc FunctionPassManager::add()
add(Pass * P)259 void add(Pass *P) {
260 schedulePass(P);
261 }
262
263 /// createPrinterPass - Get a function printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const264 Pass *createPrinterPass(raw_ostream &O,
265 const std::string &Banner) const override {
266 return createPrintFunctionPass(O, Banner);
267 }
268
269 // Prepare for running an on the fly pass, freeing memory if needed
270 // from a previous run.
271 void releaseMemoryOnTheFly();
272
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);
276
277 /// doInitialization - Run all of the initializers for the function passes.
278 ///
279 bool doInitialization(Module &M) override;
280
281 /// doFinalization - Run all of the finalizers for the function passes.
282 ///
283 bool doFinalization(Module &M) override;
284
285
getAsPMDataManager()286 PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()287 Pass *getAsPass() override { return this; }
getTopLevelPassManagerType()288 PassManagerType getTopLevelPassManagerType() override {
289 return PMT_FunctionPassManager;
290 }
291
292 /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const293 void getAnalysisUsage(AnalysisUsage &Info) const override {
294 Info.setPreservesAll();
295 }
296
getContainedManager(unsigned N)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;
301 }
302
dumpPassStructure(unsigned Offset)303 void dumpPassStructure(unsigned Offset) override {
304 for (unsigned I = 0; I < getNumContainedManagers(); ++I)
305 getContainedManager(I)->dumpPassStructure(Offset);
306 }
307 };
308
anchor()309 void FunctionPassManagerImpl::anchor() {}
310
311 char FunctionPassManagerImpl::ID = 0;
312
313 //===----------------------------------------------------------------------===//
314 // FunctionPassManagerImpl implementation
315 //
doInitialization(Module & M)316 bool FunctionPassManagerImpl::doInitialization(Module &M) {
317 bool Changed = false;
318
319 dumpArguments();
320 dumpPasses();
321
322 for (ImmutablePass *ImPass : getImmutablePasses())
323 Changed |= ImPass->doInitialization(M);
324
325 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
326 Changed |= getContainedManager(Index)->doInitialization(M);
327
328 return Changed;
329 }
330
doFinalization(Module & M)331 bool FunctionPassManagerImpl::doFinalization(Module &M) {
332 bool Changed = false;
333
334 for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index)
335 Changed |= getContainedManager(Index)->doFinalization(M);
336
337 for (ImmutablePass *ImPass : getImmutablePasses())
338 Changed |= ImPass->doFinalization(M);
339
340 return Changed;
341 }
342
releaseMemoryOnTheFly()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();
350 }
351 }
352 wasRun = false;
353 }
354
355 // Execute all the passes managed by this top level manager.
356 // Return true if any function is modified by a pass.
run(Function & F)357 bool FunctionPassManagerImpl::run(Function &F) {
358 bool Changed = false;
359
360 initializeAllAnalysisInfo();
361 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
362 Changed |= getContainedManager(Index)->runOnFunction(F);
363 F.getContext().yield();
364 }
365
366 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
367 getContainedManager(Index)->cleanup();
368
369 wasRun = true;
370 return Changed;
371 }
372 } // namespace legacy
373 } // namespace llvm
374
375 namespace {
376 //===----------------------------------------------------------------------===//
377 // MPPassManager
378 //
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;
MPPassManager()385 explicit MPPassManager() : Pass(PT_PassManager, ID) {}
386
387 // Delete on the fly managers.
~MPPassManager()388 ~MPPassManager() override {
389 for (auto &OnTheFlyManager : OnTheFlyManagers) {
390 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
391 delete FPP;
392 }
393 }
394
395 /// createPrinterPass - Get a module printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const396 Pass *createPrinterPass(raw_ostream &O,
397 const std::string &Banner) const override {
398 return createPrintModulePass(O, Banner);
399 }
400
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);
404
405 using llvm::Pass::doInitialization;
406 using llvm::Pass::doFinalization;
407
408 /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const409 void getAnalysisUsage(AnalysisUsage &Info) const override {
410 Info.setPreservesAll();
411 }
412
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;
417
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;
423
getPassName() const424 StringRef getPassName() const override { return "Module Pass Manager"; }
425
getAsPMDataManager()426 PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()427 Pass *getAsPass() override { return this; }
428
429 // Print passes managed by this manager
dumpPassStructure(unsigned Offset)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);
440 }
441 }
442
getContainedPass(unsigned N)443 ModulePass *getContainedPass(unsigned N) {
444 assert(N < PassVector.size() && "Pass number out of range!");
445 return static_cast<ModulePass *>(PassVector[N]);
446 }
447
getPassManagerType() const448 PassManagerType getPassManagerType() const override {
449 return PMT_ModulePassManager;
450 }
451
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;
456 };
457
458 char MPPassManager::ID = 0;
459 } // End anonymous namespace
460
461 namespace llvm {
462 namespace legacy {
463 //===----------------------------------------------------------------------===//
464 // PassManagerImpl
465 //
466
467 /// PassManagerImpl manages MPPassManagers
468 class PassManagerImpl : public Pass,
469 public PMDataManager,
470 public PMTopLevelManager {
471 virtual void anchor();
472
473 public:
474 static char ID;
PassManagerImpl()475 explicit PassManagerImpl()
476 : Pass(PT_PassManager, ID), PMTopLevelManager(new MPPassManager()) {}
477
478 /// \copydoc PassManager::add()
add(Pass * P)479 void add(Pass *P) {
480 schedulePass(P);
481 }
482
483 /// createPrinterPass - Get a module printer pass.
createPrinterPass(raw_ostream & O,const std::string & Banner) const484 Pass *createPrinterPass(raw_ostream &O,
485 const std::string &Banner) const override {
486 return createPrintModulePass(O, Banner);
487 }
488
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);
492
493 using llvm::Pass::doInitialization;
494 using llvm::Pass::doFinalization;
495
496 /// Pass Manager itself does not invalidate any analysis info.
getAnalysisUsage(AnalysisUsage & Info) const497 void getAnalysisUsage(AnalysisUsage &Info) const override {
498 Info.setPreservesAll();
499 }
500
getAsPMDataManager()501 PMDataManager *getAsPMDataManager() override { return this; }
getAsPass()502 Pass *getAsPass() override { return this; }
getTopLevelPassManagerType()503 PassManagerType getTopLevelPassManagerType() override {
504 return PMT_ModulePassManager;
505 }
506
getContainedManager(unsigned N)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;
511 }
512 };
513
anchor()514 void PassManagerImpl::anchor() {}
515
516 char PassManagerImpl::ID = 0;
517
518 //===----------------------------------------------------------------------===//
519 // PassManagerImpl implementation
520
521 //
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.
run(Module & M)524 bool PassManagerImpl::run(Module &M) {
525 bool Changed = false;
526
527 dumpArguments();
528 dumpPasses();
529
530 for (ImmutablePass *ImPass : getImmutablePasses())
531 Changed |= ImPass->doInitialization(M);
532
533 initializeAllAnalysisInfo();
534 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
535 Changed |= getContainedManager(Index)->runOnModule(M);
536 M.getContext().yield();
537 }
538
539 for (ImmutablePass *ImPass : getImmutablePasses())
540 Changed |= ImPass->doFinalization(M);
541
542 return Changed;
543 }
544 } // namespace legacy
545 } // namespace llvm
546
547 //===----------------------------------------------------------------------===//
548 // PMTopLevelManager implementation
549
550 /// Initialize top level manager. Create first pass manager.
PMTopLevelManager(PMDataManager * PMDM)551 PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) {
552 PMDM->setTopLevelManager(this);
553 addPassManager(PMDM);
554 activeStack.push(PMDM);
555 }
556
557 /// Set pass P as the last user of the given analysis passes.
558 void
setLastUser(ArrayRef<Pass * > AnalysisPasses,Pass * P)559 PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) {
560 unsigned PDepth = 0;
561 if (P->getResolver())
562 PDepth = P->getResolver()->getPMDataManager().getDepth();
563
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);
571
572 if (P == AP)
573 continue;
574
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();
586
587 if (PDepth == APDepth)
588 LastUses.push_back(AnalysisPass);
589 else if (PDepth > APDepth)
590 LastPMUses.push_back(AnalysisPass);
591 }
592
593 setLastUser(LastUses, P);
594
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());
599
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();
607 }
608 }
609
610 /// Collect passes whose last user is P
collectLastUses(SmallVectorImpl<Pass * > & LastUses,Pass * P)611 void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses,
612 Pass *P) {
613 auto DMI = InversedLastUser.find(P);
614 if (DMI == InversedLastUser.end())
615 return;
616
617 auto &LU = DMI->second;
618 LastUses.append(LU.begin(), LU.end());
619 }
620
findAnalysisUsage(Pass * P)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);
635
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);
645 }
646 assert(Node && "cached analysis usage must be non null");
647
648 AnUsageMap[P] = &Node->AU;
649 AnUsage = &Node->AU;
650 }
651 return AnUsage;
652 }
653
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.
schedulePass(Pass * P)657 void PMTopLevelManager::schedulePass(Pass *P) {
658
659 // TODO : Allocate function manager for this pass, other wise required set
660 // may be inserted into previous function manager
661
662 // Give pass a chance to prepare the stage.
663 P->preparePassManager(activeStack);
664
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;
674 }
675
676 AnalysisUsage *AnUsage = findAnalysisUsage(P);
677
678 bool checkAnalysis = true;
679 while (checkAnalysis) {
680 checkAnalysis = false;
681
682 const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet();
683 for (const AnalysisID ID : RequiredSet) {
684
685 Pass *AnalysisPass = findAnalysisPass(ID);
686 if (!AnalysisPass) {
687 const PassInfo *PI = findAnalysisPassInfo(ID);
688
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";
704 }
705 }
706 }
707
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;
725 }
726 }
727 }
728
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;
740 }
741
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());
748 }
749
750 // Add the requested pass to the best available pass manager.
751 P->assignPassManager(activeStack, getTopLevelPassManagerType());
752
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());
759 }
760 }
761
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.
findAnalysisPass(AnalysisID AID)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;
770
771 // Check pass managers
772 for (PMDataManager *PassManager : PassManagers)
773 if (Pass *P = PassManager->findAnalysisPass(AID, false))
774 return P;
775
776 // Check other pass managers
777 for (PMDataManager *IndirectPassManager : IndirectPassManagers)
778 if (Pass *P = IndirectPassManager->findAnalysisPass(AID, false))
779 return P;
780
781 return nullptr;
782 }
783
findAnalysisPassInfo(AnalysisID AID) const784 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!");
791
792 return PI;
793 }
794
addImmutablePass(ImmutablePass * P)795 void PMTopLevelManager::addImmutablePass(ImmutablePass *P) {
796 P->initializePass();
797 ImmutablePasses.push_back(P);
798
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;
804
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;
811 }
812
813 // Print passes managed by this top level manager.
dumpPasses() const814 void PMTopLevelManager::dumpPasses() const {
815
816 if (PassDebugging < Structure)
817 return;
818
819 // Print out the immutable passes
820 for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
821 ImmutablePasses[i]->dumpPassStructure(0);
822 }
823
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);
830 }
831
dumpArguments() const832 void PMTopLevelManager::dumpArguments() const {
833
834 if (PassDebugging < Arguments)
835 return;
836
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();
843 }
844 for (PMDataManager *PM : PassManagers)
845 PM->dumpPassArguments();
846 dbgs() << "\n";
847 }
848
initializeAllAnalysisInfo()849 void PMTopLevelManager::initializeAllAnalysisInfo() {
850 for (PMDataManager *PM : PassManagers)
851 PM->initializeAnalysisInfo();
852
853 // Initailize other pass managers
854 for (PMDataManager *IPM : IndirectPassManagers)
855 IPM->initializeAnalysisInfo();
856 }
857
858 /// Destructor
~PMTopLevelManager()859 PMTopLevelManager::~PMTopLevelManager() {
860 for (PMDataManager *PM : PassManagers)
861 delete PM;
862
863 for (ImmutablePass *P : ImmutablePasses)
864 delete P;
865 }
866
867 //===----------------------------------------------------------------------===//
868 // PMDataManager implementation
869
870 /// Augement AvailableAnalysis by adding analysis made available by pass P.
recordAvailableAnalysis(Pass * P)871 void PMDataManager::recordAvailableAnalysis(Pass *P) {
872 AnalysisID PI = P->getPassID();
873
874 AvailableAnalysis[PI] = P;
875
876 assert(!AvailableAnalysis.empty());
877
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;
884 }
885
886 // Return true if P preserves high level analysis used by other
887 // passes managed by this manager
preserveHigherLevelAnalysis(Pass * P)888 bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) {
889 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
890 if (AnUsage->getPreservesAll())
891 return true;
892
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;
898 }
899
900 return true;
901 }
902
903 /// verifyPreservedAnalysis -- Verify analysis preserved by pass P.
verifyPreservedAnalysis(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();
911
912 // Verify preserved analysis
913 for (AnalysisID AID : PreservedSet) {
914 if (Pass *AP = findAnalysisPass(AID, true)) {
915 TimeRegion PassTimer(getPassTimer(AP));
916 AP->verifyAnalysis();
917 }
918 }
919 }
920
921 /// Remove Analysis not preserved by Pass P
removeNotPreservedAnalysis(Pass * P)922 void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
923 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
924 if (AnUsage->getPreservesAll())
925 return;
926
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";
938 }
939 AvailableAnalysis.erase(Info);
940 }
941 }
942
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;
948
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";
960 }
961 IA->erase(Info);
962 }
963 }
964 }
965 }
966
967 /// Remove analysis passes that are not used any longer
removeDeadPasses(Pass * P,StringRef Msg,enum PassDebuggingString DBG_STR)968 void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg,
969 enum PassDebuggingString DBG_STR) {
970
971 SmallVector<Pass *, 12> DeadPasses;
972
973 // If this is a on the fly manager then it does not have TPM.
974 if (!TPM)
975 return;
976
977 TPM->collectLastUses(DeadPasses, P);
978
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";
983 }
984
985 for (Pass *P : DeadPasses)
986 freePass(P, Msg, DBG_STR);
987 }
988
freePass(Pass * P,StringRef Msg,enum PassDebuggingString DBG_STR)989 void PMDataManager::freePass(Pass *P, StringRef Msg,
990 enum PassDebuggingString DBG_STR) {
991 dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg);
992
993 {
994 // If the pass crashes releasing memory, remember this.
995 PassManagerPrettyStackEntry X(P);
996 TimeRegion PassTimer(getPassTimer(P));
997
998 P->releaseMemory();
999 }
1000
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);
1005
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);
1013 }
1014 }
1015 }
1016
1017 /// Add pass P into the PassVector. Update
1018 /// AvailableAnalysis appropriately if ProcessAnalysis is true.
add(Pass * P,bool ProcessAnalysis)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);
1024
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;
1028
1029 if (!ProcessAnalysis) {
1030 // Add pass
1031 PassVector.push_back(P);
1032 return;
1033 }
1034
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;
1039
1040 unsigned PDepth = this->getDepth();
1041
1042 collectRequiredAndUsedAnalyses(UsedPasses, ReqAnalysisNotAvailable, P);
1043 for (Pass *PUsed : UsedPasses) {
1044 unsigned RDepth = 0;
1045
1046 assert(PUsed->getResolver() && "Analysis Resolver is not set");
1047 PMDataManager &DM = PUsed->getResolver()->getPMDataManager();
1048 RDepth = DM.getDepth();
1049
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");
1059 }
1060
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);
1067
1068 if (!TransferLastUses.empty()) {
1069 Pass *My_PM = getAsPass();
1070 TPM->setLastUser(TransferLastUses, My_PM);
1071 TransferLastUses.clear();
1072 }
1073
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);
1079 }
1080
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);
1085
1086 // Add pass
1087 PassVector.push_back(P);
1088 }
1089
1090
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.
collectRequiredAndUsedAnalyses(SmallVectorImpl<Pass * > & UP,SmallVectorImpl<AnalysisID> & RP_NotAvail,Pass * P)1094 void PMDataManager::collectRequiredAndUsedAnalyses(
1095 SmallVectorImpl<Pass *> &UP, SmallVectorImpl<AnalysisID> &RP_NotAvail,
1096 Pass *P) {
1097 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1098
1099 for (const auto &UsedID : AnUsage->getUsedSet())
1100 if (Pass *AnalysisPass = findAnalysisPass(UsedID, true))
1101 UP.push_back(AnalysisPass);
1102
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);
1108 }
1109
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.
1114 //
initializeAnalysisImpl(Pass * P)1115 void PMDataManager::initializeAnalysisImpl(Pass *P) {
1116 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P);
1117
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);
1127 }
1128 }
1129
1130 /// Find the pass that implements Analysis AID. If desired pass is not found
1131 /// then return NULL.
findAnalysisPass(AnalysisID AID,bool SearchParent)1132 Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
1133
1134 // Check if AvailableAnalysis map has one entry.
1135 DenseMap<AnalysisID, Pass*>::const_iterator I = AvailableAnalysis.find(AID);
1136
1137 if (I != AvailableAnalysis.end())
1138 return I->second;
1139
1140 // Search Parents through TopLevelManager
1141 if (SearchParent)
1142 return TPM->findAnalysisPass(AID);
1143
1144 return nullptr;
1145 }
1146
1147 // Print list of passes that are last used by P.
dumpLastUses(Pass * P,unsigned Offset) const1148 void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
1149 if (PassDebugging < Details)
1150 return;
1151
1152 SmallVector<Pass *, 12> LUses;
1153
1154 // If this is a on the fly manager then it does not have TPM.
1155 if (!TPM)
1156 return;
1157
1158 TPM->collectLastUses(LUses, P);
1159
1160 for (Pass *P : LUses) {
1161 dbgs() << "--" << std::string(Offset*2, ' ');
1162 P->dumpPassStructure(0);
1163 }
1164 }
1165
dumpPassArguments() const1166 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();
1175 }
1176 }
1177
dumpPassInfo(Pass * P,enum PassDebuggingString S1,enum PassDebuggingString S2,StringRef Msg)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;
1197 }
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;
1216 }
1217 }
1218
dumpRequiredSet(const Pass * P) const1219 void PMDataManager::dumpRequiredSet(const Pass *P) const {
1220 if (PassDebugging < Details)
1221 return;
1222
1223 AnalysisUsage analysisUsage;
1224 P->getAnalysisUsage(analysisUsage);
1225 dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet());
1226 }
1227
dumpPreservedSet(const Pass * P) const1228 void PMDataManager::dumpPreservedSet(const Pass *P) const {
1229 if (PassDebugging < Details)
1230 return;
1231
1232 AnalysisUsage analysisUsage;
1233 P->getAnalysisUsage(analysisUsage);
1234 dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet());
1235 }
1236
dumpUsedSet(const Pass * P) const1237 void PMDataManager::dumpUsedSet(const Pass *P) const {
1238 if (PassDebugging < Details)
1239 return;
1240
1241 AnalysisUsage analysisUsage;
1242 P->getAnalysisUsage(analysisUsage);
1243 dumpAnalysisUsage("Used", P, analysisUsage.getUsedSet());
1244 }
1245
dumpAnalysisUsage(StringRef Msg,const Pass * P,const AnalysisUsage::VectorType & Set) const1246 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;
1260 }
1261 dbgs() << ' ' << PInf->getPassName();
1262 }
1263 dbgs() << '\n';
1264 }
1265
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.
addLowerLevelRequiredPass(Pass * P,Pass * RequiredPass)1270 void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1271 if (TPM) {
1272 TPM->dumpArguments();
1273 TPM->dumpPasses();
1274 }
1275
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.
1281
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");
1290 }
1291
getOnTheFlyPass(Pass * P,AnalysisID PI,Function & F)1292 std::tuple<Pass *, bool> PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI,
1293 Function &F) {
1294 llvm_unreachable("Unable to find on the fly pass");
1295 }
1296
1297 // Destructor
~PMDataManager()1298 PMDataManager::~PMDataManager() {
1299 for (Pass *P : PassVector)
1300 delete P;
1301 }
1302
1303 //===----------------------------------------------------------------------===//
1304 // NOTE: Is this the right place to define this method ?
1305 // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist.
getAnalysisIfAvailable(AnalysisID ID) const1306 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID) const {
1307 return PM.findAnalysisPass(ID, true);
1308 }
1309
1310 std::tuple<Pass *, bool>
findImplPass(Pass * P,AnalysisID AnalysisPI,Function & F)1311 AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI, Function &F) {
1312 return PM.getOnTheFlyPass(P, AnalysisPI, F);
1313 }
1314
1315 namespace llvm {
1316 namespace legacy {
1317
1318 //===----------------------------------------------------------------------===//
1319 // FunctionPassManager implementation
1320
1321 /// Create new Function pass manager
FunctionPassManager(Module * m)1322 FunctionPassManager::FunctionPassManager(Module *m) : M(m) {
1323 FPM = new legacy::FunctionPassManagerImpl();
1324 // FPM is the top level manager.
1325 FPM->setTopLevelManager(FPM);
1326
1327 AnalysisResolver *AR = new AnalysisResolver(*FPM);
1328 FPM->setResolver(AR);
1329 }
1330
~FunctionPassManager()1331 FunctionPassManager::~FunctionPassManager() {
1332 delete FPM;
1333 }
1334
add(Pass * P)1335 void FunctionPassManager::add(Pass *P) {
1336 FPM->add(P);
1337 }
1338
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.
1342 ///
run(Function & F)1343 bool FunctionPassManager::run(Function &F) {
1344 handleAllErrors(F.materialize(), [&](ErrorInfoBase &EIB) {
1345 report_fatal_error(Twine("Error reading bitcode file: ") + EIB.message());
1346 });
1347 return FPM->run(F);
1348 }
1349
1350
1351 /// doInitialization - Run all of the initializers for the function passes.
1352 ///
doInitialization()1353 bool FunctionPassManager::doInitialization() {
1354 return FPM->doInitialization(*M);
1355 }
1356
1357 /// doFinalization - Run all of the finalizers for the function passes.
1358 ///
doFinalization()1359 bool FunctionPassManager::doFinalization() {
1360 return FPM->doFinalization(*M);
1361 }
1362 } // namespace legacy
1363 } // namespace llvm
1364
1365 /// cleanup - After running all passes, clean up pass manager cache.
cleanup()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();
1372 }
1373 }
1374
1375
1376 //===----------------------------------------------------------------------===//
1377 // FPPassManager implementation
1378
1379 char FPPassManager::ID = 0;
1380 /// Print passes managed by this manager
dumpPassStructure(unsigned Offset)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);
1387 }
1388 }
1389
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.
runOnFunction(Function & F)1393 bool FPPassManager::runOnFunction(Function &F) {
1394 if (F.isDeclaration())
1395 return false;
1396
1397 bool Changed = false;
1398 Module &M = *F.getParent();
1399 // Collect inherited analysis from Module level pass manager.
1400 populateInheritedAnalysis(TPM->activeStack);
1401
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();
1409 }
1410
1411 llvm::TimeTraceScope FunctionScope("OptFunction", F.getName());
1412
1413 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1414 FunctionPass *FP = getContainedPass(Index);
1415 bool LocalChanged = false;
1416
1417 llvm::TimeTraceScope PassScope("RunPass", FP->getPassName());
1418
1419 dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName());
1420 dumpRequiredSet(FP);
1421
1422 initializeAnalysisImpl(FP);
1423
1424 {
1425 PassManagerPrettyStackEntry X(FP, F);
1426 TimeRegion PassTimer(getPassTimer(FP));
1427 #ifdef EXPENSIVE_CHECKS
1428 uint64_t RefHash = FP->structuralHash(F);
1429 #endif
1430 LocalChanged |= FP->runOnFunction(F);
1431
1432 #if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
1433 if (!LocalChanged && (RefHash != FP->structuralHash(F))) {
1434 llvm::errs() << "Pass modifies its input and doesn't report it: "
1435 << FP->getPassName() << "\n";
1436 llvm_unreachable("Pass modifies its input and doesn't report it");
1437 }
1438 #endif
1439
1440 if (EmitICRemark) {
1441 unsigned NewSize = F.getInstructionCount();
1442
1443 // Update the size of the function, emit a remark, and update the size
1444 // of the module.
1445 if (NewSize != FunctionSize) {
1446 int64_t Delta = static_cast<int64_t>(NewSize) -
1447 static_cast<int64_t>(FunctionSize);
1448 emitInstrCountChangedRemark(FP, M, Delta, InstrCount,
1449 FunctionToInstrCount, &F);
1450 InstrCount = static_cast<int64_t>(InstrCount) + Delta;
1451 FunctionSize = NewSize;
1452 }
1453 }
1454 }
1455
1456 Changed |= LocalChanged;
1457 if (LocalChanged)
1458 dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName());
1459 dumpPreservedSet(FP);
1460 dumpUsedSet(FP);
1461
1462 verifyPreservedAnalysis(FP);
1463 if (LocalChanged)
1464 removeNotPreservedAnalysis(FP);
1465 recordAvailableAnalysis(FP);
1466 removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG);
1467 }
1468
1469 return Changed;
1470 }
1471
runOnModule(Module & M)1472 bool FPPassManager::runOnModule(Module &M) {
1473 bool Changed = false;
1474
1475 for (Function &F : M)
1476 Changed |= runOnFunction(F);
1477
1478 return Changed;
1479 }
1480
doInitialization(Module & M)1481 bool FPPassManager::doInitialization(Module &M) {
1482 bool Changed = false;
1483
1484 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1485 Changed |= getContainedPass(Index)->doInitialization(M);
1486
1487 return Changed;
1488 }
1489
doFinalization(Module & M)1490 bool FPPassManager::doFinalization(Module &M) {
1491 bool Changed = false;
1492
1493 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1494 Changed |= getContainedPass(Index)->doFinalization(M);
1495
1496 return Changed;
1497 }
1498
1499 //===----------------------------------------------------------------------===//
1500 // MPPassManager implementation
1501
1502 /// Execute all of the passes scheduled for execution by invoking
1503 /// runOnModule method. Keep track of whether any of the passes modifies
1504 /// the module, and if so, return true.
1505 bool
runOnModule(Module & M)1506 MPPassManager::runOnModule(Module &M) {
1507 llvm::TimeTraceScope TimeScope("OptModule", M.getName());
1508
1509 bool Changed = false;
1510
1511 // Initialize on-the-fly passes
1512 for (auto &OnTheFlyManager : OnTheFlyManagers) {
1513 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1514 Changed |= FPP->doInitialization(M);
1515 }
1516
1517 // Initialize module passes
1518 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
1519 Changed |= getContainedPass(Index)->doInitialization(M);
1520
1521 unsigned InstrCount;
1522 StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
1523 bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
1524 // Collect the initial size of the module.
1525 if (EmitICRemark)
1526 InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
1527
1528 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1529 ModulePass *MP = getContainedPass(Index);
1530 bool LocalChanged = false;
1531
1532 dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier());
1533 dumpRequiredSet(MP);
1534
1535 initializeAnalysisImpl(MP);
1536
1537 {
1538 PassManagerPrettyStackEntry X(MP, M);
1539 TimeRegion PassTimer(getPassTimer(MP));
1540
1541 #ifdef EXPENSIVE_CHECKS
1542 uint64_t RefHash = MP->structuralHash(M);
1543 #endif
1544
1545 LocalChanged |= MP->runOnModule(M);
1546
1547 #ifdef EXPENSIVE_CHECKS
1548 assert((LocalChanged || (RefHash == MP->structuralHash(M))) &&
1549 "Pass modifies its input and doesn't report it.");
1550 #endif
1551
1552 if (EmitICRemark) {
1553 // Update the size of the module.
1554 unsigned ModuleCount = M.getInstructionCount();
1555 if (ModuleCount != InstrCount) {
1556 int64_t Delta = static_cast<int64_t>(ModuleCount) -
1557 static_cast<int64_t>(InstrCount);
1558 emitInstrCountChangedRemark(MP, M, Delta, InstrCount,
1559 FunctionToInstrCount);
1560 InstrCount = ModuleCount;
1561 }
1562 }
1563 }
1564
1565 Changed |= LocalChanged;
1566 if (LocalChanged)
1567 dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG,
1568 M.getModuleIdentifier());
1569 dumpPreservedSet(MP);
1570 dumpUsedSet(MP);
1571
1572 verifyPreservedAnalysis(MP);
1573 if (LocalChanged)
1574 removeNotPreservedAnalysis(MP);
1575 recordAvailableAnalysis(MP);
1576 removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
1577 }
1578
1579 // Finalize module passes
1580 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index)
1581 Changed |= getContainedPass(Index)->doFinalization(M);
1582
1583 // Finalize on-the-fly passes
1584 for (auto &OnTheFlyManager : OnTheFlyManagers) {
1585 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManager.second;
1586 // We don't know when is the last time an on-the-fly pass is run,
1587 // so we need to releaseMemory / finalize here
1588 FPP->releaseMemoryOnTheFly();
1589 Changed |= FPP->doFinalization(M);
1590 }
1591
1592 return Changed;
1593 }
1594
1595 /// Add RequiredPass into list of lower level passes required by pass P.
1596 /// RequiredPass is run on the fly by Pass Manager when P requests it
1597 /// through getAnalysis interface.
addLowerLevelRequiredPass(Pass * P,Pass * RequiredPass)1598 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {
1599 assert(RequiredPass && "No required pass?");
1600 assert(P->getPotentialPassManagerType() == PMT_ModulePassManager &&
1601 "Unable to handle Pass that requires lower level Analysis pass");
1602 assert((P->getPotentialPassManagerType() <
1603 RequiredPass->getPotentialPassManagerType()) &&
1604 "Unable to handle Pass that requires lower level Analysis pass");
1605
1606 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[P];
1607 if (!FPP) {
1608 FPP = new legacy::FunctionPassManagerImpl();
1609 // FPP is the top level manager.
1610 FPP->setTopLevelManager(FPP);
1611
1612 OnTheFlyManagers[P] = FPP;
1613 }
1614 const PassInfo *RequiredPassPI =
1615 TPM->findAnalysisPassInfo(RequiredPass->getPassID());
1616
1617 Pass *FoundPass = nullptr;
1618 if (RequiredPassPI && RequiredPassPI->isAnalysis()) {
1619 FoundPass =
1620 ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID());
1621 }
1622 if (!FoundPass) {
1623 FoundPass = RequiredPass;
1624 // This should be guaranteed to add RequiredPass to the passmanager given
1625 // that we checked for an available analysis above.
1626 FPP->add(RequiredPass);
1627 }
1628 // Register P as the last user of FoundPass or RequiredPass.
1629 SmallVector<Pass *, 1> LU;
1630 LU.push_back(FoundPass);
1631 FPP->setLastUser(LU, P);
1632 }
1633
1634 /// Return function pass corresponding to PassInfo PI, that is
1635 /// required by module pass MP. Instantiate analysis pass, by using
1636 /// its runOnFunction() for function F.
getOnTheFlyPass(Pass * MP,AnalysisID PI,Function & F)1637 std::tuple<Pass *, bool> MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI,
1638 Function &F) {
1639 legacy::FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP];
1640 assert(FPP && "Unable to find on the fly pass");
1641
1642 FPP->releaseMemoryOnTheFly();
1643 bool Changed = FPP->run(F);
1644 return std::make_tuple(((PMTopLevelManager *)FPP)->findAnalysisPass(PI),
1645 Changed);
1646 }
1647
1648 namespace llvm {
1649 namespace legacy {
1650
1651 //===----------------------------------------------------------------------===//
1652 // PassManager implementation
1653
1654 /// Create new pass manager
PassManager()1655 PassManager::PassManager() {
1656 PM = new PassManagerImpl();
1657 // PM is the top level manager
1658 PM->setTopLevelManager(PM);
1659 }
1660
~PassManager()1661 PassManager::~PassManager() {
1662 delete PM;
1663 }
1664
add(Pass * P)1665 void PassManager::add(Pass *P) {
1666 PM->add(P);
1667 }
1668
1669 /// run - Execute all of the passes scheduled for execution. Keep track of
1670 /// whether any of the passes modifies the module, and if so, return true.
run(Module & M)1671 bool PassManager::run(Module &M) {
1672 return PM->run(M);
1673 }
1674 } // namespace legacy
1675 } // namespace llvm
1676
1677 //===----------------------------------------------------------------------===//
1678 // PMStack implementation
1679 //
1680
1681 // Pop Pass Manager from the stack and clear its analysis info.
pop()1682 void PMStack::pop() {
1683
1684 PMDataManager *Top = this->top();
1685 Top->initializeAnalysisInfo();
1686
1687 S.pop_back();
1688 }
1689
1690 // Push PM on the stack and set its top level manager.
push(PMDataManager * PM)1691 void PMStack::push(PMDataManager *PM) {
1692 assert(PM && "Unable to push. Pass Manager expected");
1693 assert(PM->getDepth()==0 && "Pass Manager depth set too early");
1694
1695 if (!this->empty()) {
1696 assert(PM->getPassManagerType() > this->top()->getPassManagerType()
1697 && "pushing bad pass manager to PMStack");
1698 PMTopLevelManager *TPM = this->top()->getTopLevelManager();
1699
1700 assert(TPM && "Unable to find top level manager");
1701 TPM->addIndirectPassManager(PM);
1702 PM->setTopLevelManager(TPM);
1703 PM->setDepth(this->top()->getDepth()+1);
1704 } else {
1705 assert((PM->getPassManagerType() == PMT_ModulePassManager
1706 || PM->getPassManagerType() == PMT_FunctionPassManager)
1707 && "pushing bad pass manager to PMStack");
1708 PM->setDepth(1);
1709 }
1710
1711 S.push_back(PM);
1712 }
1713
1714 // Dump content of the pass manager stack.
dump() const1715 LLVM_DUMP_METHOD void PMStack::dump() const {
1716 for (PMDataManager *Manager : S)
1717 dbgs() << Manager->getAsPass()->getPassName() << ' ';
1718
1719 if (!S.empty())
1720 dbgs() << '\n';
1721 }
1722
1723 /// Find appropriate Module Pass Manager in the PM Stack and
1724 /// add self into that manager.
assignPassManager(PMStack & PMS,PassManagerType PreferredType)1725 void ModulePass::assignPassManager(PMStack &PMS,
1726 PassManagerType PreferredType) {
1727 // Find Module Pass Manager
1728 PassManagerType T;
1729 while ((T = PMS.top()->getPassManagerType()) > PMT_ModulePassManager &&
1730 T != PreferredType)
1731 PMS.pop();
1732 PMS.top()->add(this);
1733 }
1734
1735 /// Find appropriate Function Pass Manager or Call Graph Pass Manager
1736 /// in the PM Stack and add self into that manager.
assignPassManager(PMStack & PMS,PassManagerType)1737 void FunctionPass::assignPassManager(PMStack &PMS,
1738 PassManagerType /*PreferredType*/) {
1739 // Find Function Pass Manager
1740 PMDataManager *PM;
1741 while (PM = PMS.top(), PM->getPassManagerType() > PMT_FunctionPassManager)
1742 PMS.pop();
1743
1744 // Create new Function Pass Manager if needed.
1745 if (PM->getPassManagerType() != PMT_FunctionPassManager) {
1746 // [1] Create new Function Pass Manager
1747 auto *FPP = new FPPassManager;
1748 FPP->populateInheritedAnalysis(PMS);
1749
1750 // [2] Set up new manager's top level manager
1751 PM->getTopLevelManager()->addIndirectPassManager(FPP);
1752
1753 // [3] Assign manager to manage this new manager. This may create
1754 // and push new managers into PMS
1755 FPP->assignPassManager(PMS, PM->getPassManagerType());
1756
1757 // [4] Push new manager into PMS
1758 PMS.push(FPP);
1759 PM = FPP;
1760 }
1761
1762 // Assign FPP as the manager of this pass.
1763 PM->add(this);
1764 }
1765
1766 legacy::PassManagerBase::~PassManagerBase() = default;
1767