summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/DependenceInfo.h33
-rw-r--r--polly/lib/Analysis/DependenceInfo.cpp42
2 files changed, 75 insertions, 0 deletions
diff --git a/polly/include/polly/DependenceInfo.h b/polly/include/polly/DependenceInfo.h
index 012153ca405..cb734fd59fb 100644
--- a/polly/include/polly/DependenceInfo.h
+++ b/polly/include/polly/DependenceInfo.h
@@ -148,6 +148,8 @@ struct Dependences {
///
/// 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 @@ private:
const AnalysisLevel Level;
};
+struct DependenceAnalysis : public AnalysisInfoMixin<DependenceAnalysis> {
+ static AnalysisKey Key;
+ struct Result {
+ Scop &S;
+ std::unique_ptr<Dependences> 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> {
+ DependenceInfoPrinterPass(raw_ostream &OS) : OS(OS) {}
+
+ PreservedAnalyses run(Scop &S, ScopAnalysisManager &,
+ ScopStandardAnalysisResults &, SPMUpdater &);
+
+ raw_ostream &OS;
+};
+
class DependenceInfo : public ScopPass {
public:
static char ID;
diff --git a/polly/lib/Analysis/DependenceInfo.cpp b/polly/lib/Analysis/DependenceInfo.cpp
index 079fc2733b3..e7a3dfcc630 100644
--- a/polly/lib/Analysis/DependenceInfo.cpp
+++ b/polly/lib/Analysis/DependenceInfo.cpp
@@ -912,6 +912,48 @@ void Dependences::setReductionDependences(MemoryAccess *MA, isl_map *D) {
}
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<DependenceAnalysis>(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;
OpenPOWER on IntegriCloud