summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/PolyhedralInfo.h4
-rw-r--r--polly/include/polly/ScopInfo.h53
-rw-r--r--polly/lib/Analysis/DependenceInfo.cpp2
-rw-r--r--polly/lib/Analysis/PolyhedralInfo.cpp2
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp66
5 files changed, 90 insertions, 37 deletions
diff --git a/polly/include/polly/PolyhedralInfo.h b/polly/include/polly/PolyhedralInfo.h
index f4ea28f8aca..ae6d44e5a2e 100644
--- a/polly/include/polly/PolyhedralInfo.h
+++ b/polly/include/polly/PolyhedralInfo.h
@@ -27,7 +27,7 @@ class Loop;
namespace polly {
class Scop;
-class ScopInfoWrapperPass;
+class ScopInfo;
class DependenceInfoWrapperPass;
class PolyhedralInfo : public llvm::FunctionPass {
@@ -87,7 +87,7 @@ private:
bool checkParallel(llvm::Loop *L,
__isl_give isl_pw_aff **MinDepDistPtr = nullptr) const;
- ScopInfoWrapperPass *SI;
+ ScopInfo *SI;
DependenceInfoWrapperPass *DI;
};
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index 66e26586536..c56fa7c56c1 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -2762,16 +2762,7 @@ public:
void getAnalysisUsage(AnalysisUsage &AU) const override;
};
-//===----------------------------------------------------------------------===//
-/// The legacy pass manager's analysis pass to compute scop information
-/// for the whole function.
-///
-/// This pass will maintain a map of the maximal region within a scop to its
-/// scop object for all the feasible scops present in a function.
-/// This pass is an alternative to the ScopInfoRegionPass in order to avoid a
-/// region pass manager.
-class ScopInfoWrapperPass : public FunctionPass {
-
+class ScopInfo {
public:
using RegionToScopMapTy = DenseMap<Region *, std::unique_ptr<Scop>>;
using iterator = RegionToScopMapTy::iterator;
@@ -2783,10 +2774,9 @@ private:
RegionToScopMapTy RegionToScopMap;
public:
- static char ID; // Pass identification, replacement for typeid
-
- ScopInfoWrapperPass() : FunctionPass(ID) {}
- ~ScopInfoWrapperPass() {}
+ ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,
+ LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT,
+ AssumptionCache &AC);
/// Get the Scop object for the given Region
///
@@ -2805,11 +2795,44 @@ public:
iterator end() { return RegionToScopMap.end(); }
const_iterator begin() const { return RegionToScopMap.begin(); }
const_iterator end() const { return RegionToScopMap.end(); }
+};
+
+struct ScopInfoAnalysis : public AnalysisInfoMixin<ScopInfoAnalysis> {
+ static AnalysisKey Key;
+ using Result = ScopInfo;
+ Result run(Function &, FunctionAnalysisManager &);
+};
+
+struct ScopInfoPrinterPass : public PassInfoMixin<ScopInfoPrinterPass> {
+ ScopInfoPrinterPass(raw_ostream &O) : Stream(O) {}
+ PreservedAnalyses run(Function &, FunctionAnalysisManager &);
+ raw_ostream &Stream;
+};
+
+//===----------------------------------------------------------------------===//
+/// The legacy pass manager's analysis pass to compute scop information
+/// for the whole function.
+///
+/// This pass will maintain a map of the maximal region within a scop to its
+/// scop object for all the feasible scops present in a function.
+/// This pass is an alternative to the ScopInfoRegionPass in order to avoid a
+/// region pass manager.
+class ScopInfoWrapperPass : public FunctionPass {
+ std::unique_ptr<ScopInfo> Result;
+
+public:
+ ScopInfoWrapperPass() : FunctionPass(ID) {}
+ ~ScopInfoWrapperPass() = default;
+
+ static char ID; // Pass identification, replacement for typeid
+
+ ScopInfo *getSI() { return Result.get(); }
+ const ScopInfo *getSI() const { return Result.get(); }
/// Calculate all the polyhedral scops for a given function.
bool runOnFunction(Function &F) override;
- void releaseMemory() override { RegionToScopMap.clear(); }
+ void releaseMemory() override { Result.reset(); }
void print(raw_ostream &O, const Module *M = nullptr) const override;
diff --git a/polly/lib/Analysis/DependenceInfo.cpp b/polly/lib/Analysis/DependenceInfo.cpp
index 8aa9f8dd379..079fc2733b3 100644
--- a/polly/lib/Analysis/DependenceInfo.cpp
+++ b/polly/lib/Analysis/DependenceInfo.cpp
@@ -982,7 +982,7 @@ const Dependences &DependenceInfoWrapperPass::recomputeDependences(
}
bool DependenceInfoWrapperPass::runOnFunction(Function &F) {
- auto &SI = getAnalysis<ScopInfoWrapperPass>();
+ auto &SI = *getAnalysis<ScopInfoWrapperPass>().getSI();
for (auto &It : SI) {
assert(It.second && "Invalid SCoP object!");
recomputeDependences(It.second.get(), Dependences::AL_Access);
diff --git a/polly/lib/Analysis/PolyhedralInfo.cpp b/polly/lib/Analysis/PolyhedralInfo.cpp
index b40aee2455b..96f03a79479 100644
--- a/polly/lib/Analysis/PolyhedralInfo.cpp
+++ b/polly/lib/Analysis/PolyhedralInfo.cpp
@@ -53,7 +53,7 @@ void PolyhedralInfo::getAnalysisUsage(AnalysisUsage &AU) const {
bool PolyhedralInfo::runOnFunction(Function &F) {
DI = &getAnalysis<DependenceInfoWrapperPass>();
- SI = &getAnalysis<ScopInfoWrapperPass>();
+ SI = getAnalysis<ScopInfoWrapperPass>().getSI();
return false;
}
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index c89b6e8e078..5e566fb3a41 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -4810,6 +4810,52 @@ INITIALIZE_PASS_END(ScopInfoRegionPass, "polly-scops",
false)
//===----------------------------------------------------------------------===//
+ScopInfo::ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,
+ LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT,
+ AssumptionCache &AC) {
+ /// Create polyhedral descripton of scops for all the valid regions of a
+ /// function.
+ for (auto &It : SD) {
+ Region *R = const_cast<Region *>(It);
+ if (!SD.isMaxRegionInScop(*R))
+ continue;
+
+ ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE);
+ std::unique_ptr<Scop> S = SB.getScop();
+ if (!S)
+ continue;
+ bool Inserted = RegionToScopMap.insert({R, std::move(S)}).second;
+ assert(Inserted && "Building Scop for the same region twice!");
+ (void)Inserted;
+ }
+}
+
+AnalysisKey ScopInfoAnalysis::Key;
+
+ScopInfoAnalysis::Result ScopInfoAnalysis::run(Function &F,
+ FunctionAnalysisManager &FAM) {
+ auto &SD = FAM.getResult<ScopAnalysis>(F);
+ auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);
+ auto &LI = FAM.getResult<LoopAnalysis>(F);
+ auto &AA = FAM.getResult<AAManager>(F);
+ auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
+ auto &AC = FAM.getResult<AssumptionAnalysis>(F);
+ auto &DL = F.getParent()->getDataLayout();
+ return {DL, SD, SE, LI, AA, DT, AC};
+}
+
+PreservedAnalyses ScopInfoPrinterPass::run(Function &F,
+ FunctionAnalysisManager &FAM) {
+ auto &SI = FAM.getResult<ScopInfoAnalysis>(F);
+ for (auto &It : SI) {
+ if (It.second)
+ It.second->print(Stream);
+ else
+ Stream << "Invalid Scop!\n";
+ }
+ return PreservedAnalyses::all();
+}
+
void ScopInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfoWrapperPass>();
AU.addRequired<RegionInfoPass>();
@@ -4823,7 +4869,6 @@ void ScopInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
bool ScopInfoWrapperPass::runOnFunction(Function &F) {
auto &SD = getAnalysis<ScopDetectionWrapperPass>().getSD();
-
auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
@@ -4831,27 +4876,12 @@ bool ScopInfoWrapperPass::runOnFunction(Function &F) {
auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
- /// Create polyhedral descripton of scops for all the valid regions of a
- /// function.
- for (auto &It : SD) {
- Region *R = const_cast<Region *>(It);
- if (!SD.isMaxRegionInScop(*R))
- continue;
-
- ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE);
- std::unique_ptr<Scop> S = SB.getScop();
- if (!S)
- continue;
- bool Inserted =
- RegionToScopMap.insert(std::make_pair(R, std::move(S))).second;
- assert(Inserted && "Building Scop for the same region twice!");
- (void)Inserted;
- }
+ Result.reset(new ScopInfo{DL, SD, SE, LI, AA, DT, AC});
return false;
}
void ScopInfoWrapperPass::print(raw_ostream &OS, const Module *) const {
- for (auto &It : RegionToScopMap) {
+ for (auto &It : *Result) {
if (It.second)
It.second->print(OS);
else
OpenPOWER on IntegriCloud