Index: polly/trunk/include/polly/DependenceInfo.h =================================================================== --- polly/trunk/include/polly/DependenceInfo.h +++ polly/trunk/include/polly/DependenceInfo.h @@ -148,6 +148,8 @@ /// /// To restrict access to the internal state, only the DependenceInfo class /// is able to call or modify a Dependences struct. + friend struct DependenceAnalysis; + friend struct DependenceInfoPrinterPass; friend class DependenceInfo; friend class DependenceInfoWrapperPass; @@ -196,6 +198,37 @@ const AnalysisLevel Level; }; +struct DependenceAnalysis : public AnalysisInfoMixin { + static AnalysisKey Key; + struct Result { + Scop &S; + std::unique_ptr D[Dependences::NumAnalysisLevels]; + + /// Return the dependence information for the current SCoP. + /// + /// @param Level The granularity of dependence analysis result. + /// + /// @return The dependence analysis result + /// + const Dependences &getDependences(Dependences::AnalysisLevel Level); + + /// Recompute dependences from schedule and memory accesses. + const Dependences &recomputeDependences(Dependences::AnalysisLevel Level); + }; + Result run(Scop &S, ScopAnalysisManager &SAM, + ScopStandardAnalysisResults &SAR); +}; + +struct DependenceInfoPrinterPass + : public PassInfoMixin { + DependenceInfoPrinterPass(raw_ostream &OS) : OS(OS) {} + + PreservedAnalyses run(Scop &S, ScopAnalysisManager &, + ScopStandardAnalysisResults &, SPMUpdater &); + + raw_ostream &OS; +}; + class DependenceInfo : public ScopPass { public: static char ID; Index: polly/trunk/lib/Analysis/DependenceInfo.cpp =================================================================== --- polly/trunk/lib/Analysis/DependenceInfo.cpp +++ polly/trunk/lib/Analysis/DependenceInfo.cpp @@ -912,6 +912,48 @@ } const Dependences & +DependenceAnalysis::Result::getDependences(Dependences::AnalysisLevel Level) { + if (Dependences *d = D[Level].get()) + return *d; + + return recomputeDependences(Level); +} + +const Dependences &DependenceAnalysis::Result::recomputeDependences( + Dependences::AnalysisLevel Level) { + D[Level].reset(new Dependences(S.getSharedIslCtx(), Level)); + D[Level]->calculateDependences(S); + return *D[Level]; +} + +DependenceAnalysis::Result +DependenceAnalysis::run(Scop &S, ScopAnalysisManager &SAM, + ScopStandardAnalysisResults &SAR) { + return {S, {}}; +} + +AnalysisKey DependenceAnalysis::Key; + +PreservedAnalyses +DependenceInfoPrinterPass::run(Scop &S, ScopAnalysisManager &SAM, + ScopStandardAnalysisResults &SAR, + SPMUpdater &U) { + auto &DI = SAM.getResult(S, SAR); + + if (auto d = DI.D[OptAnalysisLevel].get()) { + d->print(OS); + return PreservedAnalyses::all(); + } + + // Otherwise create the dependences on-the-fly and print it + Dependences D(S.getSharedIslCtx(), OptAnalysisLevel); + D.calculateDependences(S); + D.print(OS); + + return PreservedAnalyses::all(); +} + +const Dependences & DependenceInfo::getDependences(Dependences::AnalysisLevel Level) { if (Dependences *d = D[Level].get()) return *d;