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