Index: include/polly/ScopInfo.h =================================================================== --- include/polly/ScopInfo.h +++ include/polly/ScopInfo.h @@ -23,6 +23,7 @@ #include "polly/ScopDetection.h" #include "polly/Support/SCEVAffinator.h" +#include "llvm/IR/PassManager.h" #include "llvm/ADT/MapVector.h" #include "llvm/Analysis/RegionPass.h" #include "isl/aff.h" @@ -2531,6 +2532,7 @@ void getAnalysisUsage(AnalysisUsage &AU) const override; }; + //===----------------------------------------------------------------------===// /// @brief The legacy pass manager's analysis pass to compute scop information /// for the whole function. @@ -2541,6 +2543,10 @@ /// region pass manager. class ScopInfoWrapperPass : public FunctionPass { + /// New pass manager for Scop, we currently use it to cache/invalidate Scop at the + /// Function level. + using ScopAnalysisManager = llvm::AnalysisManager; + ScopAnalysisManager SAM; public: using RegionToScopMapTy = DenseMap>; using iterator = RegionToScopMapTy::iterator; @@ -2575,6 +2581,19 @@ const_iterator begin() const { return RegionToScopMap.begin(); } const_iterator end() const { return RegionToScopMap.end(); } + template + T getScopAnalysis(Region *R) { + auto *S = getScop(R); + assert(S && "Incorrect region!"); + return SAM.getResult(*R); + } + + void invalidateScopAnalysis(Region *R) { + auto *S = getScop(R); + assert(S && "Incorrect region!"); + SAM.invalidate(*S); + } + /// @brief Calculate all the polyhedral scops for a given function. bool runOnFunction(Function &F) override; Index: lib/Analysis/ScopInfo.cpp =================================================================== --- lib/Analysis/ScopInfo.cpp +++ lib/Analysis/ScopInfo.cpp @@ -4982,10 +4982,13 @@ void ScopInfoWrapperPass::print(raw_ostream &OS, const Module *) const { for (auto &It : RegionToScopMap) { - if (It.second) + if (It.second) { It.second->print(OS); - else - OS << "Invalid Scop!\n"; + getScopAnalysis(*It.second); + continue; + } + + OS << "Invalid Scop!\n"; } }