diff options
author | Michael Kruse <llvm@meinersbur.de> | 2016-12-15 09:25:14 +0000 |
---|---|---|
committer | Michael Kruse <llvm@meinersbur.de> | 2016-12-15 09:25:14 +0000 |
commit | 7037fde42736440312406fee6b3f96daa4271c96 (patch) | |
tree | 583a4dde8fbf94c92128575d98b6de974c10ee04 | |
parent | 8b54739328413e5931862225ff122905ccb530f0 (diff) | |
download | bcm5719-llvm-7037fde42736440312406fee6b3f96daa4271c96.tar.gz bcm5719-llvm-7037fde42736440312406fee6b3f96daa4271c96.zip |
Remove references to AssumptionCache. NFC.
The AssumptionCache was removed in r289756 after being replaced by the an
addtional operand list of affected values in r289755. The absence of that cache
means that we have now have to manually search for llvm.assume intrinsics as
now done by other passes (LazyValueInfo, CodeMetrics) do not take into
account an llvm::Instruction's user lists (ScalarEvolution).
llvm-svn: 289791
-rw-r--r-- | polly/include/polly/ScopBuilder.h | 8 | ||||
-rw-r--r-- | polly/include/polly/ScopInfo.h | 6 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopBuilder.cpp | 12 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 135 |
4 files changed, 79 insertions, 82 deletions
diff --git a/polly/include/polly/ScopBuilder.h b/polly/include/polly/ScopBuilder.h index 203ff861f41..8dc9677c87b 100644 --- a/polly/include/polly/ScopBuilder.h +++ b/polly/include/polly/ScopBuilder.h @@ -55,7 +55,7 @@ class ScopBuilder { std::unique_ptr<Scop> scop; // Build the SCoP for Region @p R. - void buildScop(Region &R, AssumptionCache &AC); + void buildScop(Region &R); /// Try to build a multi-dimensional fixed sized MemoryAccess from the /// Load/Store instruction. @@ -242,9 +242,9 @@ class ScopBuilder { void addPHIReadAccess(PHINode *PHI); public: - explicit ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA, - const DataLayout &DL, DominatorTree &DT, LoopInfo &LI, - ScopDetection &SD, ScalarEvolution &SE); + explicit ScopBuilder(Region *R, AliasAnalysis &AA, const DataLayout &DL, + DominatorTree &DT, LoopInfo &LI, ScopDetection &SD, + ScalarEvolution &SE); ~ScopBuilder() {} /// Try to build the Polly IR of static control part on the current diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index c84d3281b88..4f511683986 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -33,7 +33,6 @@ using namespace llvm; namespace llvm { -class AssumptionCache; class Loop; class LoopInfo; class PHINode; @@ -1670,8 +1669,7 @@ private: //@} /// Initialize this ScopBuilder. - void init(AliasAnalysis &AA, AssumptionCache &AC, DominatorTree &DT, - LoopInfo &LI); + void init(AliasAnalysis &AA, DominatorTree &DT, LoopInfo &LI); /// Propagate domains that are known due to graph properties. /// @@ -1845,7 +1843,7 @@ private: void buildContext(); /// Add user provided parameter constraints to context (source code). - void addUserAssumptions(AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI); + void addUserAssumptions(DominatorTree &DT, LoopInfo &LI); /// Add user provided parameter constraints to context (command line). void addUserContext(); diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index 81f503f914b..8be724b3a32 100644 --- a/polly/lib/Analysis/ScopBuilder.cpp +++ b/polly/lib/Analysis/ScopBuilder.cpp @@ -645,7 +645,7 @@ void ScopBuilder::addPHIReadAccess(PHINode *PHI) { ArrayRef<const SCEV *>(), ScopArrayInfo::MK_PHI); } -void ScopBuilder::buildScop(Region &R, AssumptionCache &AC) { +void ScopBuilder::buildScop(Region &R) { scop.reset(new Scop(R, SE, LI, *SD.getDetectionContext(&R))); buildStmts(R); @@ -669,12 +669,12 @@ void ScopBuilder::buildScop(Region &R, AssumptionCache &AC) { addArrayAccess(MemAccInst(GlobalRead), MemoryAccess::READ, BP, BP->getType(), false, {AF}, {nullptr}, GlobalRead); - scop->init(AA, AC, DT, LI); + scop->init(AA, DT, LI); } -ScopBuilder::ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA, - const DataLayout &DL, DominatorTree &DT, LoopInfo &LI, - ScopDetection &SD, ScalarEvolution &SE) +ScopBuilder::ScopBuilder(Region *R, AliasAnalysis &AA, const DataLayout &DL, + DominatorTree &DT, LoopInfo &LI, ScopDetection &SD, + ScalarEvolution &SE) : AA(AA), DL(DL), DT(DT), LI(LI), SD(SD), SE(SE) { Function *F = R->getEntry()->getParent(); @@ -684,7 +684,7 @@ ScopBuilder::ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA, std::string Msg = "SCoP begins here."; emitOptimizationRemarkAnalysis(F->getContext(), DEBUG_TYPE, *F, Beg, Msg); - buildScop(*R, AC); + buildScop(*R); DEBUG(scop->print(dbgs())); diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index a45593b4889..3533f156e84 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -29,10 +29,10 @@ #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/AliasAnalysis.h" -#include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/Loads.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopIterator.h" @@ -1849,76 +1849,82 @@ bool Scop::isDominatedBy(const DominatorTree &DT, BasicBlock *BB) const { return DT.dominates(BB, getEntry()); } -void Scop::addUserAssumptions(AssumptionCache &AC, DominatorTree &DT, - LoopInfo &LI) { +void Scop::addUserAssumptions(DominatorTree &DT, LoopInfo &LI) { auto &F = getFunction(); - for (auto &Assumption : AC.assumptions()) { - auto *CI = dyn_cast_or_null<CallInst>(Assumption); - if (!CI || CI->getNumArgOperands() != 1) - continue; - bool InScop = contains(CI); - if (!InScop && !isDominatedBy(DT, CI->getParent())) + // TODO: Walk the DominatorTree from getRegion().getExit() to its root in + // order to not iterate over blocks we skip anyways. + for (auto &BB : F) { + bool InScop = contains(&BB); + if (!InScop && !isDominatedBy(DT, &BB)) continue; - auto *L = LI.getLoopFor(CI->getParent()); - auto *Val = CI->getArgOperand(0); - ParameterSetTy DetectedParams; - if (!isAffineConstraint(Val, &R, L, *SE, DetectedParams)) { - emitOptimizationRemarkAnalysis(F.getContext(), DEBUG_TYPE, F, - CI->getDebugLoc(), - "Non-affine user assumption ignored."); - continue; - } + for (auto &Assumption : BB) { + auto *CI = dyn_cast_or_null<IntrinsicInst>(&Assumption); + if (!CI || CI->getNumArgOperands() != 1 || + CI->getIntrinsicID() != Intrinsic::assume) + continue; - // Collect all newly introduced parameters. - ParameterSetTy NewParams; - for (auto *Param : DetectedParams) { - Param = extractConstantFactor(Param, *SE).second; - Param = getRepresentingInvariantLoadSCEV(Param); - if (Parameters.count(Param)) + auto *L = LI.getLoopFor(CI->getParent()); + auto *Val = CI->getArgOperand(0); + ParameterSetTy DetectedParams; + if (!isAffineConstraint(Val, &R, L, *SE, DetectedParams)) { + emitOptimizationRemarkAnalysis(F.getContext(), DEBUG_TYPE, F, + CI->getDebugLoc(), + "Non-affine user assumption ignored."); continue; - NewParams.insert(Param); - } + } - SmallVector<isl_set *, 2> ConditionSets; - auto *TI = InScop ? CI->getParent()->getTerminator() : nullptr; - auto &Stmt = InScop ? *getStmtFor(CI->getParent()) : *Stmts.begin(); - auto *Dom = InScop ? getDomainConditions(&Stmt) : isl_set_copy(Context); - bool Valid = buildConditionSets(Stmt, Val, TI, L, Dom, ConditionSets); - isl_set_free(Dom); + // Collect all newly introduced parameters. + ParameterSetTy NewParams; + for (auto *Param : DetectedParams) { + Param = extractConstantFactor(Param, *SE).second; + Param = getRepresentingInvariantLoadSCEV(Param); + if (Parameters.count(Param)) + continue; + NewParams.insert(Param); + } - if (!Valid) - continue; + SmallVector<isl_set *, 2> ConditionSets; + auto *TI = InScop ? CI->getParent()->getTerminator() : nullptr; + auto &Stmt = InScop ? *getStmtFor(CI->getParent()) : *Stmts.begin(); + auto *Dom = InScop ? getDomainConditions(&Stmt) : isl_set_copy(Context); + bool Valid = buildConditionSets(Stmt, Val, TI, L, Dom, ConditionSets); + isl_set_free(Dom); - isl_set *AssumptionCtx = nullptr; - if (InScop) { - AssumptionCtx = isl_set_complement(isl_set_params(ConditionSets[1])); - isl_set_free(ConditionSets[0]); - } else { - AssumptionCtx = isl_set_complement(ConditionSets[1]); - AssumptionCtx = isl_set_intersect(AssumptionCtx, ConditionSets[0]); - } + if (!Valid) + continue; - // Project out newly introduced parameters as they are not otherwise useful. - if (!NewParams.empty()) { - for (unsigned u = 0; u < isl_set_n_param(AssumptionCtx); u++) { - auto *Id = isl_set_get_dim_id(AssumptionCtx, isl_dim_param, u); - auto *Param = static_cast<const SCEV *>(isl_id_get_user(Id)); - isl_id_free(Id); + isl_set *AssumptionCtx = nullptr; + if (InScop) { + AssumptionCtx = isl_set_complement(isl_set_params(ConditionSets[1])); + isl_set_free(ConditionSets[0]); + } else { + AssumptionCtx = isl_set_complement(ConditionSets[1]); + AssumptionCtx = isl_set_intersect(AssumptionCtx, ConditionSets[0]); + } - if (!NewParams.count(Param)) - continue; + // Project out newly introduced parameters as they are not otherwise + // useful. + if (!NewParams.empty()) { + for (unsigned u = 0; u < isl_set_n_param(AssumptionCtx); u++) { + auto *Id = isl_set_get_dim_id(AssumptionCtx, isl_dim_param, u); + auto *Param = static_cast<const SCEV *>(isl_id_get_user(Id)); + isl_id_free(Id); - AssumptionCtx = - isl_set_project_out(AssumptionCtx, isl_dim_param, u--, 1); + if (!NewParams.count(Param)) + continue; + + AssumptionCtx = + isl_set_project_out(AssumptionCtx, isl_dim_param, u--, 1); + } } - } - emitOptimizationRemarkAnalysis( - F.getContext(), DEBUG_TYPE, F, CI->getDebugLoc(), - "Use user assumption: " + stringFromIslObj(AssumptionCtx)); - Context = isl_set_intersect(Context, AssumptionCtx); + emitOptimizationRemarkAnalysis( + F.getContext(), DEBUG_TYPE, F, CI->getDebugLoc(), + "Use user assumption: " + stringFromIslObj(AssumptionCtx)); + Context = isl_set_intersect(Context, AssumptionCtx); + } } } @@ -3238,14 +3244,13 @@ void Scop::finalizeAccesses() { assumeNoOutOfBounds(); } -void Scop::init(AliasAnalysis &AA, AssumptionCache &AC, DominatorTree &DT, - LoopInfo &LI) { +void Scop::init(AliasAnalysis &AA, DominatorTree &DT, LoopInfo &LI) { buildInvariantEquivalenceClasses(); if (!buildDomains(&R, DT, LI)) return; - addUserAssumptions(AC, DT, LI); + addUserAssumptions(DT, LI); // Remove empty statements. // Exit early in case there are no executable statements left in this scop. @@ -4518,7 +4523,6 @@ void ScopInfoRegionPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); AU.addRequiredTransitive<ScopDetection>(); AU.addRequired<AAResultsWrapperPass>(); - AU.addRequired<AssumptionCacheTracker>(); AU.setPreservesAll(); } @@ -4534,9 +4538,8 @@ bool ScopInfoRegionPass::runOnRegion(Region *R, RGPassManager &RGM) { auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); auto const &DL = F->getParent()->getDataLayout(); auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); - auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(*F); - ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE); + ScopBuilder SB(R, AA, DL, DT, LI, SD, SE); S = SB.getScop(); // take ownership of scop object return false; } @@ -4556,7 +4559,6 @@ INITIALIZE_PASS_BEGIN(ScopInfoRegionPass, "polly-scops", "Polly - Create polyhedral description of Scops", false, false); INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass); -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker); INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); @@ -4574,7 +4576,6 @@ void ScopInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); AU.addRequiredTransitive<ScopDetection>(); AU.addRequired<AAResultsWrapperPass>(); - AU.addRequired<AssumptionCacheTracker>(); AU.setPreservesAll(); } @@ -4586,7 +4587,6 @@ bool ScopInfoWrapperPass::runOnFunction(Function &F) { auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); auto const &DL = F.getParent()->getDataLayout(); auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); - auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); /// Create polyhedral descripton of scops for all the valid regions of a /// function. @@ -4595,7 +4595,7 @@ bool ScopInfoWrapperPass::runOnFunction(Function &F) { if (!SD.isMaxRegionInScop(*R)) continue; - ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE); + ScopBuilder SB(R, AA, DL, DT, LI, SD, SE); std::unique_ptr<Scop> S = SB.getScop(); if (!S) continue; @@ -4627,7 +4627,6 @@ INITIALIZE_PASS_BEGIN( "Polly - Create polyhedral description of all Scops of a function", false, false); INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass); -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker); INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); |