Index: polly/trunk/include/polly/ScopBuilder.h =================================================================== --- polly/trunk/include/polly/ScopBuilder.h +++ polly/trunk/include/polly/ScopBuilder.h @@ -143,7 +143,8 @@ // @} // Build the SCoP for Region @p R. - void buildScop(Region &R, AssumptionCache &AC); + void buildScop(Region &R, AssumptionCache &AC, + OptimizationRemarkEmitter &ORE); /// Try to build a multi-dimensional fixed sized MemoryAccess from the /// Load/Store instruction. @@ -337,7 +338,8 @@ public: explicit ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA, const DataLayout &DL, DominatorTree &DT, LoopInfo &LI, - ScopDetection &SD, ScalarEvolution &SE); + ScopDetection &SD, ScalarEvolution &SE, + OptimizationRemarkEmitter &ORE); ScopBuilder(const ScopBuilder &) = delete; ScopBuilder &operator=(const ScopBuilder &) = delete; ~ScopBuilder() = default; Index: polly/trunk/include/polly/ScopDetection.h =================================================================== --- polly/trunk/include/polly/ScopDetection.h +++ polly/trunk/include/polly/ScopDetection.h @@ -630,6 +630,7 @@ countBeneficialLoops(Region *R, ScalarEvolution &SE, LoopInfo &LI, unsigned MinProfitableTrips); +private: /// OptimizationRemarkEmitter object used to emit diagnostic remarks OptimizationRemarkEmitter &ORE; }; Index: polly/trunk/include/polly/ScopInfo.h =================================================================== --- polly/trunk/include/polly/ScopInfo.h +++ polly/trunk/include/polly/ScopInfo.h @@ -3096,11 +3096,12 @@ AliasAnalysis &AA; DominatorTree &DT; AssumptionCache &AC; + OptimizationRemarkEmitter &ORE; public: ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE, LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT, - AssumptionCache &AC); + AssumptionCache &AC, OptimizationRemarkEmitter &ORE); /// Get the Scop object for the given Region. /// Index: polly/trunk/lib/Analysis/ScopBuilder.cpp =================================================================== --- polly/trunk/lib/Analysis/ScopBuilder.cpp +++ polly/trunk/lib/Analysis/ScopBuilder.cpp @@ -964,8 +964,9 @@ : RN->getNodeAs(); } -void ScopBuilder::buildScop(Region &R, AssumptionCache &AC) { - scop.reset(new Scop(R, SE, LI, *SD.getDetectionContext(&R), SD.ORE)); +void ScopBuilder::buildScop(Region &R, AssumptionCache &AC, + OptimizationRemarkEmitter &ORE) { + scop.reset(new Scop(R, SE, LI, *SD.getDetectionContext(&R), ORE)); buildStmts(R); buildAccessFunctions(); @@ -1064,17 +1065,18 @@ ScopBuilder::ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA, const DataLayout &DL, DominatorTree &DT, LoopInfo &LI, - ScopDetection &SD, ScalarEvolution &SE) + ScopDetection &SD, ScalarEvolution &SE, + OptimizationRemarkEmitter &ORE) : AA(AA), DL(DL), DT(DT), LI(LI), SD(SD), SE(SE) { DebugLoc Beg, End; auto P = getBBPairForRegion(R); getDebugLocations(P, Beg, End); std::string Msg = "SCoP begins here."; - SD.ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEntry", Beg, P.first) - << Msg); + ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEntry", Beg, P.first) + << Msg); - buildScop(*R, AC); + buildScop(*R, AC, ORE); DEBUG(dbgs() << *scop); @@ -1090,9 +1092,9 @@ } if (R->isTopLevelRegion()) - SD.ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEnd", End, P.first) - << Msg); + ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEnd", End, P.first) + << Msg); else - SD.ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEnd", End, P.second) - << Msg); + ORE.emit(OptimizationRemarkAnalysis(DEBUG_TYPE, "ScopEnd", End, P.second) + << Msg); } Index: polly/trunk/lib/Analysis/ScopInfo.cpp =================================================================== --- polly/trunk/lib/Analysis/ScopInfo.cpp +++ polly/trunk/lib/Analysis/ScopInfo.cpp @@ -5230,6 +5230,7 @@ AU.addRequiredTransitive(); AU.addRequired(); AU.addRequired(); + AU.addRequired(); AU.setPreservesAll(); } @@ -5279,8 +5280,9 @@ auto const &DL = F->getParent()->getDataLayout(); auto &DT = getAnalysis().getDomTree(); auto &AC = getAnalysis().getAssumptionCache(*F); + auto &ORE = getAnalysis().getORE(); - ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE); + ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE, ORE); S = SB.getScop(); // take ownership of scop object #if !defined(NDEBUG) || defined(LLVM_ENABLE_STATS) @@ -5322,8 +5324,8 @@ //===----------------------------------------------------------------------===// ScopInfo::ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE, LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT, - AssumptionCache &AC) - : DL(DL), SD(SD), SE(SE), LI(LI), AA(AA), DT(DT), AC(AC) { + AssumptionCache &AC, OptimizationRemarkEmitter &ORE) + : DL(DL), SD(SD), SE(SE), LI(LI), AA(AA), DT(DT), AC(AC), ORE(ORE) { recompute(); } @@ -5336,7 +5338,7 @@ if (!SD.isMaxRegionInScop(*R)) continue; - ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE); + ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE, ORE); std::unique_ptr S = SB.getScop(); if (!S) continue; @@ -5376,7 +5378,8 @@ auto &DT = FAM.getResult(F); auto &AC = FAM.getResult(F); auto &DL = F.getParent()->getDataLayout(); - return {DL, SD, SE, LI, AA, DT, AC}; + auto &ORE = FAM.getResult(F); + return {DL, SD, SE, LI, AA, DT, AC, ORE}; } PreservedAnalyses ScopInfoPrinterPass::run(Function &F, @@ -5401,6 +5404,7 @@ AU.addRequiredTransitive(); AU.addRequired(); AU.addRequired(); + AU.addRequired(); AU.setPreservesAll(); } @@ -5412,8 +5416,9 @@ auto const &DL = F.getParent()->getDataLayout(); auto &DT = getAnalysis().getDomTree(); auto &AC = getAnalysis().getAssumptionCache(F); + auto &ORE = getAnalysis().getORE(); - Result.reset(new ScopInfo{DL, SD, SE, LI, AA, DT, AC}); + Result.reset(new ScopInfo{DL, SD, SE, LI, AA, DT, AC, ORE}); return false; } Index: polly/trunk/lib/Analysis/ScopPass.cpp =================================================================== --- polly/trunk/lib/Analysis/ScopPass.cpp +++ polly/trunk/lib/Analysis/ScopPass.cpp @@ -15,6 +15,11 @@ #include "polly/ScopInfo.h" #include "llvm/Analysis/AssumptionCache.h" +#include "llvm/Analysis/BasicAliasAnalysis.h" +#include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/Analysis/OptimizationDiagnosticInfo.h" +#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" +#include "llvm/Analysis/TargetTransformInfo.h" using namespace llvm; using namespace polly; @@ -38,7 +43,19 @@ void ScopPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); - AU.setPreservesAll(); + + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); } namespace polly { Index: polly/trunk/lib/CodeGen/CodeGeneration.cpp =================================================================== --- polly/trunk/lib/CodeGen/CodeGeneration.cpp +++ polly/trunk/lib/CodeGen/CodeGeneration.cpp @@ -333,6 +333,8 @@ /// Register all analyses and transformation required. void getAnalysisUsage(AnalysisUsage &AU) const override { + ScopPass::getAnalysisUsage(AU); + AU.addRequired(); AU.addRequired(); AU.addRequired(); @@ -342,21 +344,10 @@ AU.addRequired(); AU.addPreserved(); - - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); // FIXME: We do not yet add regions for the newly generated code to the // region tree. - AU.addPreserved(); - AU.addPreserved(); } }; Index: polly/trunk/lib/CodeGen/IslAst.cpp =================================================================== --- polly/trunk/lib/CodeGen/IslAst.cpp +++ polly/trunk/lib/CodeGen/IslAst.cpp @@ -771,6 +771,8 @@ ScopPass::getAnalysisUsage(AU); AU.addRequired(); AU.addRequired(); + + AU.addPreserved(); } void IslAstInfoWrapperPass::printScop(raw_ostream &OS, Scop &S) const { Index: polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp =================================================================== --- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp +++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp @@ -3520,6 +3520,8 @@ void printScop(raw_ostream &, Scop &) const override {} void getAnalysisUsage(AnalysisUsage &AU) const override { + ScopPass::getAnalysisUsage(AU); + AU.addRequired(); AU.addRequired(); AU.addRequired(); @@ -3527,19 +3529,8 @@ AU.addRequired(); AU.addRequired(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - AU.addPreserved(); - // FIXME: We do not yet add regions for the newly generated code to the // region tree. - AU.addPreserved(); - AU.addPreserved(); } }; } // namespace Index: polly/trunk/lib/Exchange/JSONExporter.cpp =================================================================== --- polly/trunk/lib/Exchange/JSONExporter.cpp +++ polly/trunk/lib/Exchange/JSONExporter.cpp @@ -792,6 +792,9 @@ void JSONImporter::getAnalysisUsage(AnalysisUsage &AU) const { ScopPass::getAnalysisUsage(AU); AU.addRequired(); + + // TODO: JSONImporter should throw away DependenceInfo. + AU.addPreserved(); } Pass *polly::createJSONImporterPass() { return new JSONImporter(); } Index: polly/trunk/lib/Transform/ScheduleOptimizer.cpp =================================================================== --- polly/trunk/lib/Transform/ScheduleOptimizer.cpp +++ polly/trunk/lib/Transform/ScheduleOptimizer.cpp @@ -1591,6 +1591,8 @@ ScopPass::getAnalysisUsage(AU); AU.addRequired(); AU.addRequired(); + + AU.addPreserved(); } Pass *polly::createIslScheduleOptimizerPass() {