diff options
Diffstat (limited to 'include/llvm/IR/PassManager.h')
-rw-r--r-- | include/llvm/IR/PassManager.h | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/include/llvm/IR/PassManager.h b/include/llvm/IR/PassManager.h index 2625768492645..4166babd63e52 100644 --- a/include/llvm/IR/PassManager.h +++ b/include/llvm/IR/PassManager.h @@ -46,6 +46,7 @@ #include "llvm/IR/PassManagerInternal.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/Support/type_traits.h" #include <list> #include <memory> @@ -241,8 +242,8 @@ public: private: typedef detail::PassConcept<IRUnitT> PassConceptT; - PassManager(const PassManager &) LLVM_DELETED_FUNCTION; - PassManager &operator=(const PassManager &) LLVM_DELETED_FUNCTION; + PassManager(const PassManager &) = delete; + PassManager &operator=(const PassManager &) = delete; std::vector<std::unique_ptr<PassConceptT>> Passes; @@ -281,9 +282,9 @@ template <typename DerivedT, typename IRUnitT> class AnalysisManagerBase { return static_cast<const DerivedT *>(this); } - AnalysisManagerBase(const AnalysisManagerBase &) LLVM_DELETED_FUNCTION; + AnalysisManagerBase(const AnalysisManagerBase &) = delete; AnalysisManagerBase & - operator=(const AnalysisManagerBase &) LLVM_DELETED_FUNCTION; + operator=(const AnalysisManagerBase &) = delete; protected: typedef detail::AnalysisResultConcept<IRUnitT> ResultConceptT; @@ -453,8 +454,8 @@ public: } private: - AnalysisManager(const AnalysisManager &) LLVM_DELETED_FUNCTION; - AnalysisManager &operator=(const AnalysisManager &) LLVM_DELETED_FUNCTION; + AnalysisManager(const AnalysisManager &) = delete; + AnalysisManager &operator=(const AnalysisManager &) = delete; /// \brief Get an analysis result, running the pass if necessary. ResultConceptT &getResultImpl(void *PassID, IRUnitT &IR) { @@ -471,6 +472,12 @@ private: dbgs() << "Running analysis: " << P.name() << "\n"; AnalysisResultListT &ResultList = AnalysisResultLists[&IR]; ResultList.emplace_back(PassID, P.run(IR, this)); + + // P.run may have inserted elements into AnalysisResults and invalidated + // RI. + RI = AnalysisResults.find(std::make_pair(PassID, &IR)); + assert(RI != AnalysisResults.end() && "we just inserted it!"); + RI->second = std::prev(ResultList.end()); } @@ -502,7 +509,7 @@ private: PreservedAnalyses invalidateImpl(IRUnitT &IR, PreservedAnalyses PA) { // Short circuit for a common case of all analyses being preserved. if (PA.areAllPreserved()) - return std::move(PA); + return PA; if (DebugLogging) dbgs() << "Invalidating all non-preserved analyses for: " @@ -542,7 +549,7 @@ private: if (ResultsList.empty()) AnalysisResultLists.erase(&IR); - return std::move(PA); + return PA; } /// \brief List of function analysis pass IDs and associated concept pointers. @@ -782,8 +789,11 @@ public: FAM = &AM->getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); PreservedAnalyses PA = PreservedAnalyses::all(); - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { - PreservedAnalyses PassPA = Pass.run(*I, FAM); + for (Function &F : M) { + if (F.isDeclaration()) + continue; + + PreservedAnalyses PassPA = Pass.run(F, FAM); // We know that the function pass couldn't have invalidated any other // function's analyses (that's the contract of a function pass), so @@ -791,7 +801,7 @@ public: // update our preserved set to reflect that these have already been // handled. if (FAM) - PassPA = FAM->invalidate(*I, std::move(PassPA)); + PassPA = FAM->invalidate(F, std::move(PassPA)); // Then intersect the preserved set so that invalidation of module // analyses will eventually occur when the module pass completes. @@ -817,7 +827,7 @@ private: template <typename FunctionPassT> ModuleToFunctionPassAdaptor<FunctionPassT> createModuleToFunctionPassAdaptor(FunctionPassT Pass) { - return std::move(ModuleToFunctionPassAdaptor<FunctionPassT>(std::move(Pass))); + return ModuleToFunctionPassAdaptor<FunctionPassT>(std::move(Pass)); } /// \brief A template utility pass to force an analysis result to be available. |