Skip to content

Commit f43e7c2

Browse files
committedAug 10, 2017
[Polly][PM] Improve invalidation in the Scop-Pipeline
Summary: During code generation for a Scop we modify the IR of a function. While this shouldn't affect a Scop in the formal sense, the implementation caches various information about the IR such as SCEV expressions for bounds or parameters. This cached information needs to be updated or invalidated. To this end, SPMUpdater allows passes to report when they've invalidated a Scop to the PassManager, which will then flush and recompute all Scops. This in turn invalidates all iterators, so references to Scops shouldn't be held. Reviewers: grosser, Meinersbur, bollu Reviewed By: grosser Subscribers: llvm-commits, pollydev Differential Revision: https://reviews.llvm.org/D36524 llvm-svn: 310551
1 parent 2f4e2e2 commit f43e7c2

File tree

5 files changed

+77
-21
lines changed

5 files changed

+77
-21
lines changed
 

‎polly/include/polly/ScopInfo.h

+16
Original file line numberDiff line numberDiff line change
@@ -3044,6 +3044,13 @@ class ScopInfo {
30443044
/// A map of Region to its Scop object containing
30453045
/// Polly IR of static control part.
30463046
RegionToScopMapTy RegionToScopMap;
3047+
const DataLayout &DL;
3048+
ScopDetection &SD;
3049+
ScalarEvolution &SE;
3050+
LoopInfo &LI;
3051+
AliasAnalysis &AA;
3052+
DominatorTree &DT;
3053+
AssumptionCache ∾
30473054

30483055
public:
30493056
ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,
@@ -3063,6 +3070,15 @@ class ScopInfo {
30633070
return nullptr;
30643071
}
30653072

3073+
/// Recompute the Scop-Information for a function.
3074+
///
3075+
/// This invalidates any iterators.
3076+
void recompute();
3077+
3078+
/// Handle invalidation explicitly
3079+
bool invalidate(Function &F, const PreservedAnalyses &PA,
3080+
FunctionAnalysisManager::Invalidator &Inv);
3081+
30663082
iterator begin() { return RegionToScopMap.begin(); }
30673083
iterator end() { return RegionToScopMap.end(); }
30683084
const_iterator begin() const { return RegionToScopMap.begin(); }

‎polly/include/polly/ScopPass.h

+32-14
Original file line numberDiff line numberDiff line change
@@ -180,18 +180,26 @@ struct ScopStandardAnalysisResults {
180180

181181
class SPMUpdater {
182182
public:
183-
SPMUpdater(SmallPriorityWorklist<Scop *, 4> &Worklist,
183+
SPMUpdater(SmallPriorityWorklist<Region *, 4> &Worklist,
184184
ScopAnalysisManager &SAM)
185-
: Worklist(Worklist), SAM(SAM) {}
185+
: Worklist(Worklist), SAM(SAM), InvalidateCurrentScop(false) {}
186186

187-
void SkipScop(Scop &S) {
188-
if (Worklist.erase(&S))
189-
SAM.clear(S);
187+
bool invalidateCurrentScop() const { return InvalidateCurrentScop; }
188+
189+
void invalidateScop(Scop &S) {
190+
if (&S == CurrentScop)
191+
InvalidateCurrentScop = true;
192+
193+
Worklist.erase(&S.getRegion());
194+
SAM.clear(S);
190195
}
191196

192197
private:
193-
SmallPriorityWorklist<Scop *, 4> &Worklist;
198+
Scop *CurrentScop;
199+
bool InvalidateCurrentScop;
200+
SmallPriorityWorklist<Region *, 4> &Worklist;
194201
ScopAnalysisManager &SAM;
202+
template <typename ScopPassT> friend class FunctionToScopPassAdaptor;
195203
};
196204

197205
template <typename ScopPassT>
@@ -202,10 +210,16 @@ class FunctionToScopPassAdaptor
202210

203211
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) {
204212
PreservedAnalyses PA = PreservedAnalyses::all();
205-
auto &Scops = AM.getResult<ScopInfoAnalysis>(F);
206-
if (Scops.empty())
213+
auto &SD = AM.getResult<ScopAnalysis>(F);
214+
auto &SI = AM.getResult<ScopInfoAnalysis>(F);
215+
if (SI.empty())
207216
return PA;
208217

218+
SmallPriorityWorklist<Region *, 4> Worklist;
219+
for (auto &S : SI)
220+
if (S.second)
221+
Worklist.insert(S.first);
222+
209223
ScopStandardAnalysisResults AR = {AM.getResult<DominatorTreeAnalysis>(F),
210224
AM.getResult<ScopInfoAnalysis>(F),
211225
AM.getResult<ScalarEvolutionAnalysis>(F),
@@ -215,19 +229,23 @@ class FunctionToScopPassAdaptor
215229
ScopAnalysisManager &SAM =
216230
AM.getResult<ScopAnalysisManagerFunctionProxy>(F).getManager();
217231

218-
SmallPriorityWorklist<Scop *, 4> Worklist;
219232
SPMUpdater Updater{Worklist, SAM};
220233

221-
for (auto &S : Scops)
222-
if (auto *scop = S.second.get())
223-
Worklist.insert(scop);
224-
225234
while (!Worklist.empty()) {
226-
Scop *scop = Worklist.pop_back_val();
235+
Region *R = Worklist.pop_back_val();
236+
if (!SD.isMaxRegionInScop(*R))
237+
continue;
238+
Scop *scop = SI.getScop(R);
239+
if (!scop)
240+
continue;
241+
Updater.CurrentScop = scop;
242+
Updater.InvalidateCurrentScop = false;
227243
PreservedAnalyses PassPA = Pass.run(*scop, SAM, AR, Updater);
228244

229245
SAM.invalidate(*scop, PassPA);
230246
PA.intersect(std::move(PassPA));
247+
if (Updater.invalidateCurrentScop())
248+
SI.recompute();
231249
};
232250

233251
PA.preserveSet<AllAnalysesOn<Scop>>();

‎polly/lib/Analysis/ScopInfo.cpp

+21-1
Original file line numberDiff line numberDiff line change
@@ -5227,7 +5227,13 @@ INITIALIZE_PASS_END(ScopInfoRegionPass, "polly-scops",
52275227
//===----------------------------------------------------------------------===//
52285228
ScopInfo::ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,
52295229
LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT,
5230-
AssumptionCache &AC) {
5230+
AssumptionCache &AC)
5231+
: DL(DL), SD(SD), SE(SE), LI(LI), AA(AA), DT(DT), AC(AC) {
5232+
recompute();
5233+
}
5234+
5235+
void ScopInfo::recompute() {
5236+
RegionToScopMap.clear();
52315237
/// Create polyhedral description of scops for all the valid regions of a
52325238
/// function.
52335239
for (auto &It : SD) {
@@ -5248,6 +5254,20 @@ ScopInfo::ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,
52485254
}
52495255
}
52505256

5257+
bool ScopInfo::invalidate(Function &F, const PreservedAnalyses &PA,
5258+
FunctionAnalysisManager::Invalidator &Inv) {
5259+
// Check whether the analysis, all analyses on functions have been preserved
5260+
// or anything we're holding references to is being invalidated
5261+
auto PAC = PA.getChecker<ScopInfoAnalysis>();
5262+
return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>()) ||
5263+
Inv.invalidate<ScopAnalysis>(F, PA) ||
5264+
Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
5265+
Inv.invalidate<LoopAnalysis>(F, PA) ||
5266+
Inv.invalidate<AAManager>(F, PA) ||
5267+
Inv.invalidate<DominatorTreeAnalysis>(F, PA) ||
5268+
Inv.invalidate<AssumptionAnalysis>(F, PA);
5269+
}
5270+
52515271
AnalysisKey ScopInfoAnalysis::Key;
52525272

52535273
ScopInfoAnalysis::Result ScopInfoAnalysis::run(Function &F,

‎polly/lib/Analysis/ScopPass.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ bool ScopAnalysisManagerFunctionProxy::Result::invalidate(
7979

8080
// First, check whether our ScopInfo is about to be invalidated
8181
auto PAC = PA.getChecker<ScopAnalysisManagerFunctionProxy>();
82-
if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
83-
Inv.invalidate<ScopInfoAnalysis>(F, PA) ||
84-
Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
85-
Inv.invalidate<LoopAnalysis>(F, PA) ||
86-
Inv.invalidate<DominatorTreeAnalysis>(F, PA))) {
82+
if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>()) ||
83+
Inv.invalidate<ScopInfoAnalysis>(F, PA) ||
84+
Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
85+
Inv.invalidate<LoopAnalysis>(F, PA) ||
86+
Inv.invalidate<DominatorTreeAnalysis>(F, PA)) {
8787

8888
// As everything depends on ScopInfo, we must drop all existing results
8989
for (auto &S : *SI)

‎polly/lib/CodeGen/CodeGeneration.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,10 @@ PreservedAnalyses
328328
polly::CodeGenerationPass::run(Scop &S, ScopAnalysisManager &SAM,
329329
ScopStandardAnalysisResults &AR, SPMUpdater &U) {
330330
auto &AI = SAM.getResult<IslAstAnalysis>(S, AR);
331-
if (CodeGen(S, AI, AR.LI, AR.DT, AR.SE, AR.RI))
331+
if (CodeGen(S, AI, AR.LI, AR.DT, AR.SE, AR.RI)) {
332+
U.invalidateScop(S);
332333
return PreservedAnalyses::none();
334+
}
333335

334336
return PreservedAnalyses::all();
335337
}

0 commit comments

Comments
 (0)
Please sign in to comment.