PassManager.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //===- PassManager.h - Infrastructure for managing & running IR passes ----===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/ADT/STLExtras.h"
  10. #include "llvm/IR/PassManager.h"
  11. #include "llvm/Support/CommandLine.h"
  12. #include "llvm/Support/Debug.h"
  13. using namespace llvm;
  14. static cl::opt<bool>
  15. DebugPM("debug-pass-manager", cl::Hidden,
  16. cl::desc("Print pass management debugging information"));
  17. PreservedAnalyses ModulePassManager::run(Module *M, ModuleAnalysisManager *AM) {
  18. PreservedAnalyses PA = PreservedAnalyses::all();
  19. if (DebugPM)
  20. dbgs() << "Starting module pass manager run.\n";
  21. for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
  22. if (DebugPM)
  23. dbgs() << "Running module pass: " << Passes[Idx]->name() << "\n";
  24. PreservedAnalyses PassPA = Passes[Idx]->run(M, AM);
  25. if (AM)
  26. AM->invalidate(M, PassPA);
  27. PA.intersect(std::move(PassPA));
  28. }
  29. if (DebugPM)
  30. dbgs() << "Finished module pass manager run.\n";
  31. return PA;
  32. }
  33. ModuleAnalysisManager::ResultConceptT &
  34. ModuleAnalysisManager::getResultImpl(void *PassID, Module *M) {
  35. ModuleAnalysisResultMapT::iterator RI;
  36. bool Inserted;
  37. llvm::tie(RI, Inserted) = ModuleAnalysisResults.insert(std::make_pair(
  38. PassID, polymorphic_ptr<detail::AnalysisResultConcept<Module *> >()));
  39. // If we don't have a cached result for this module, look up the pass and run
  40. // it to produce a result, which we then add to the cache.
  41. if (Inserted)
  42. RI->second = lookupPass(PassID).run(M, this);
  43. return *RI->second;
  44. }
  45. ModuleAnalysisManager::ResultConceptT *
  46. ModuleAnalysisManager::getCachedResultImpl(void *PassID, Module *M) const {
  47. ModuleAnalysisResultMapT::const_iterator RI = ModuleAnalysisResults.find(PassID);
  48. return RI == ModuleAnalysisResults.end() ? 0 : &*RI->second;
  49. }
  50. void ModuleAnalysisManager::invalidateImpl(void *PassID, Module *M) {
  51. ModuleAnalysisResults.erase(PassID);
  52. }
  53. void ModuleAnalysisManager::invalidateImpl(Module *M,
  54. const PreservedAnalyses &PA) {
  55. // FIXME: This is a total hack based on the fact that erasure doesn't
  56. // invalidate iteration for DenseMap.
  57. for (ModuleAnalysisResultMapT::iterator I = ModuleAnalysisResults.begin(),
  58. E = ModuleAnalysisResults.end();
  59. I != E; ++I)
  60. if (I->second->invalidate(M, PA))
  61. ModuleAnalysisResults.erase(I);
  62. }
  63. PreservedAnalyses FunctionPassManager::run(Function *F, FunctionAnalysisManager *AM) {
  64. PreservedAnalyses PA = PreservedAnalyses::all();
  65. if (DebugPM)
  66. dbgs() << "Starting function pass manager run.\n";
  67. for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
  68. if (DebugPM)
  69. dbgs() << "Running function pass: " << Passes[Idx]->name() << "\n";
  70. PreservedAnalyses PassPA = Passes[Idx]->run(F, AM);
  71. if (AM)
  72. AM->invalidate(F, PassPA);
  73. PA.intersect(std::move(PassPA));
  74. }
  75. if (DebugPM)
  76. dbgs() << "Finished function pass manager run.\n";
  77. return PA;
  78. }
  79. bool FunctionAnalysisManager::empty() const {
  80. assert(FunctionAnalysisResults.empty() ==
  81. FunctionAnalysisResultLists.empty() &&
  82. "The storage and index of analysis results disagree on how many there "
  83. "are!");
  84. return FunctionAnalysisResults.empty();
  85. }
  86. void FunctionAnalysisManager::clear() {
  87. FunctionAnalysisResults.clear();
  88. FunctionAnalysisResultLists.clear();
  89. }
  90. FunctionAnalysisManager::ResultConceptT &
  91. FunctionAnalysisManager::getResultImpl(void *PassID, Function *F) {
  92. FunctionAnalysisResultMapT::iterator RI;
  93. bool Inserted;
  94. llvm::tie(RI, Inserted) = FunctionAnalysisResults.insert(std::make_pair(
  95. std::make_pair(PassID, F), FunctionAnalysisResultListT::iterator()));
  96. // If we don't have a cached result for this function, look up the pass and
  97. // run it to produce a result, which we then add to the cache.
  98. if (Inserted) {
  99. FunctionAnalysisResultListT &ResultList = FunctionAnalysisResultLists[F];
  100. ResultList.push_back(std::make_pair(PassID, lookupPass(PassID).run(F, this)));
  101. RI->second = std::prev(ResultList.end());
  102. }
  103. return *RI->second->second;
  104. }
  105. FunctionAnalysisManager::ResultConceptT *
  106. FunctionAnalysisManager::getCachedResultImpl(void *PassID, Function *F) const {
  107. FunctionAnalysisResultMapT::const_iterator RI =
  108. FunctionAnalysisResults.find(std::make_pair(PassID, F));
  109. return RI == FunctionAnalysisResults.end() ? 0 : &*RI->second->second;
  110. }
  111. void FunctionAnalysisManager::invalidateImpl(void *PassID, Function *F) {
  112. FunctionAnalysisResultMapT::iterator RI =
  113. FunctionAnalysisResults.find(std::make_pair(PassID, F));
  114. if (RI == FunctionAnalysisResults.end())
  115. return;
  116. FunctionAnalysisResultLists[F].erase(RI->second);
  117. }
  118. void FunctionAnalysisManager::invalidateImpl(Function *F,
  119. const PreservedAnalyses &PA) {
  120. // Clear all the invalidated results associated specifically with this
  121. // function.
  122. SmallVector<void *, 8> InvalidatedPassIDs;
  123. FunctionAnalysisResultListT &ResultsList = FunctionAnalysisResultLists[F];
  124. for (FunctionAnalysisResultListT::iterator I = ResultsList.begin(),
  125. E = ResultsList.end();
  126. I != E;)
  127. if (I->second->invalidate(F, PA)) {
  128. InvalidatedPassIDs.push_back(I->first);
  129. I = ResultsList.erase(I);
  130. } else {
  131. ++I;
  132. }
  133. while (!InvalidatedPassIDs.empty())
  134. FunctionAnalysisResults.erase(
  135. std::make_pair(InvalidatedPassIDs.pop_back_val(), F));
  136. }
  137. char FunctionAnalysisManagerModuleProxy::PassID;
  138. FunctionAnalysisManagerModuleProxy::Result
  139. FunctionAnalysisManagerModuleProxy::run(Module *M) {
  140. assert(FAM.empty() && "Function analyses ran prior to the module proxy!");
  141. return Result(FAM);
  142. }
  143. FunctionAnalysisManagerModuleProxy::Result::~Result() {
  144. // Clear out the analysis manager if we're being destroyed -- it means we
  145. // didn't even see an invalidate call when we got invalidated.
  146. FAM.clear();
  147. }
  148. bool FunctionAnalysisManagerModuleProxy::Result::invalidate(
  149. Module *M, const PreservedAnalyses &PA) {
  150. // If this proxy isn't marked as preserved, then we can't even invalidate
  151. // individual function analyses, there may be an invalid set of Function
  152. // objects in the cache making it impossible to incrementally preserve them.
  153. // Just clear the entire manager.
  154. if (!PA.preserved(ID()))
  155. FAM.clear();
  156. // Return false to indicate that this result is still a valid proxy.
  157. return false;
  158. }
  159. char ModuleAnalysisManagerFunctionProxy::PassID;