[PATCH] D18834: [PM][DA] Port of the DependenceAnalysis to the new PM
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed May 4 10:42:59 PDT 2016
Philip Pfaffe <philip.pfaffe at gmail.com> writes:
> philip.pfaffe updated this revision to Diff 55798.
> philip.pfaffe added a comment.
>
> Turned the check whether the Wrapper Pass has been run correctly into an assert.
>
> Side Note: Other Analysis Wrapper Passes even completely omit this
> check (e.g. scev), so it might be worth consideration to either omit
> the check entirely or to update other Wrapper Passes to perform the
> check as well.
Yeah, we should probably be consistent one way or the other. I'd
probably just drop it.
Did you need someone to commit this for you?
>
> Repository:
> rL LLVM
>
> http://reviews.llvm.org/D18834
>
> Files:
> include/llvm/Analysis/DependenceAnalysis.h
> include/llvm/Analysis/Passes.h
> include/llvm/InitializePasses.h
> include/llvm/LinkAllPasses.h
> lib/Analysis/Analysis.cpp
> lib/Analysis/DependenceAnalysis.cpp
> lib/Passes/PassBuilder.cpp
> lib/Passes/PassRegistry.def
> lib/Transforms/Scalar/LoopInterchange.cpp
> lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> lib/Transforms/Utils/LoopSimplify.cpp
>
> Index: lib/Transforms/Utils/LoopSimplify.cpp
> ===================================================================
> --- lib/Transforms/Utils/LoopSimplify.cpp
> +++ lib/Transforms/Utils/LoopSimplify.cpp
> @@ -748,7 +748,7 @@
> AU.addPreserved<GlobalsAAWrapperPass>();
> AU.addPreserved<ScalarEvolutionWrapperPass>();
> AU.addPreserved<SCEVAAWrapperPass>();
> - AU.addPreserved<DependenceAnalysis>();
> + AU.addPreserved<DependenceAnalysisWrapperPass>();
> AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
> }
>
> Index: lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> +++ lib/Transforms/Scalar/LoopSimplifyCFG.cpp
> @@ -45,7 +45,7 @@
> bool runOnLoop(Loop *L, LPPassManager &) override;
>
> void getAnalysisUsage(AnalysisUsage &AU) const override {
> - AU.addPreserved<DependenceAnalysis>();
> + AU.addPreserved<DependenceAnalysisWrapperPass>();
> getLoopAnalysisUsage(AU);
> }
> };
> Index: lib/Transforms/Scalar/LoopInterchange.cpp
> ===================================================================
> --- lib/Transforms/Scalar/LoopInterchange.cpp
> +++ lib/Transforms/Scalar/LoopInterchange.cpp
> @@ -72,7 +72,7 @@
> #endif
>
> static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level,
> - Loop *L, DependenceAnalysis *DA) {
> + Loop *L, DependenceInfo *DI) {
> typedef SmallVector<Value *, 16> ValueVector;
> ValueVector MemInstr;
>
> @@ -117,7 +117,7 @@
> continue;
> if (isa<LoadInst>(Src) && isa<LoadInst>(Des))
> continue;
> - if (auto D = DA->depends(Src, Des, true)) {
> + if (auto D = DI->depends(Src, Des, true)) {
> DEBUG(dbgs() << "Found Dependency between Src=" << Src << " Des=" << Des
> << "\n");
> if (D->isFlow()) {
> @@ -430,28 +430,28 @@
> static char ID;
> ScalarEvolution *SE;
> LoopInfo *LI;
> - DependenceAnalysis *DA;
> + DependenceInfo *DI;
> DominatorTree *DT;
> bool PreserveLCSSA;
> LoopInterchange()
> - : FunctionPass(ID), SE(nullptr), LI(nullptr), DA(nullptr), DT(nullptr) {
> + : FunctionPass(ID), SE(nullptr), LI(nullptr), DI(nullptr), DT(nullptr) {
> initializeLoopInterchangePass(*PassRegistry::getPassRegistry());
> }
>
> void getAnalysisUsage(AnalysisUsage &AU) const override {
> AU.addRequired<ScalarEvolutionWrapperPass>();
> AU.addRequired<AAResultsWrapperPass>();
> AU.addRequired<DominatorTreeWrapperPass>();
> AU.addRequired<LoopInfoWrapperPass>();
> - AU.addRequired<DependenceAnalysis>();
> + AU.addRequired<DependenceAnalysisWrapperPass>();
> AU.addRequiredID(LoopSimplifyID);
> AU.addRequiredID(LCSSAID);
> }
>
> bool runOnFunction(Function &F) override {
> SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
> LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
> - DA = &getAnalysis<DependenceAnalysis>();
> + DI = &getAnalysis<DependenceAnalysisWrapperPass>().getDI();
> auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
> DT = DTWP ? &DTWP->getDomTree() : nullptr;
> PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
> @@ -515,7 +515,7 @@
> << "\n");
>
> if (!populateDependencyMatrix(DependencyMatrix, LoopList.size(),
> - OuterMostLoop, DA)) {
> + OuterMostLoop, DI)) {
> DEBUG(dbgs() << "Populating Dependency matrix failed\n");
> return false;
> }
> @@ -1294,7 +1294,7 @@
> INITIALIZE_PASS_BEGIN(LoopInterchange, "loop-interchange",
> "Interchanges loops for cache reuse", false, false)
> INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
> -INITIALIZE_PASS_DEPENDENCY(DependenceAnalysis)
> +INITIALIZE_PASS_DEPENDENCY(DependenceAnalysisWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
> Index: lib/Passes/PassRegistry.def
> ===================================================================
> --- lib/Passes/PassRegistry.def
> +++ lib/Passes/PassRegistry.def
> @@ -73,6 +73,7 @@
> FUNCTION_ANALYSIS("demanded-bits", DemandedBitsAnalysis())
> FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis())
> FUNCTION_ANALYSIS("loops", LoopAnalysis())
> +FUNCTION_ANALYSIS("da", DependenceAnalysis())
> FUNCTION_ANALYSIS("memdep", MemoryDependenceAnalysis())
> FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
> FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
> Index: lib/Passes/PassBuilder.cpp
> ===================================================================
> --- lib/Passes/PassBuilder.cpp
> +++ lib/Passes/PassBuilder.cpp
> @@ -25,6 +25,7 @@
> #include "llvm/Analysis/CGSCCPassManager.h"
> #include "llvm/Analysis/CallGraph.h"
> #include "llvm/Analysis/DemandedBits.h"
> +#include "llvm/Analysis/DependenceAnalysis.h"
> #include "llvm/Analysis/DominanceFrontier.h"
> #include "llvm/Analysis/GlobalsModRef.h"
> #include "llvm/Analysis/LazyCallGraph.h"
> Index: lib/Analysis/DependenceAnalysis.cpp
> ===================================================================
> --- lib/Analysis/DependenceAnalysis.cpp
> +++ lib/Analysis/DependenceAnalysis.cpp
> @@ -114,36 +114,46 @@
> //===----------------------------------------------------------------------===//
> // basics
>
> -INITIALIZE_PASS_BEGIN(DependenceAnalysis, "da",
> +DependenceAnalysis::Result
> +DependenceAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {
> + auto &AA = FAM.getResult<AAManager>(F);
> + auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);
> + auto &LI = FAM.getResult<LoopAnalysis>(F);
> + return DependenceInfo(&F, &AA, &SE, &LI);
> +}
> +
> +char DependenceAnalysis::PassID;
> +
> +INITIALIZE_PASS_BEGIN(DependenceAnalysisWrapperPass, "da",
> "Dependence Analysis", true, true)
> INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
> INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
> -INITIALIZE_PASS_END(DependenceAnalysis, "da",
> - "Dependence Analysis", true, true)
> +INITIALIZE_PASS_END(DependenceAnalysisWrapperPass, "da", "Dependence Analysis",
> + true, true)
>
> -char DependenceAnalysis::ID = 0;
> +char DependenceAnalysisWrapperPass::ID = 0;
>
> -
> -FunctionPass *llvm::createDependenceAnalysisPass() {
> - return new DependenceAnalysis();
> +FunctionPass *llvm::createDependenceAnalysisWrapperPass() {
> + return new DependenceAnalysisWrapperPass();
> }
>
> -
> -bool DependenceAnalysis::runOnFunction(Function &F) {
> - this->F = &F;
> - AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
> - SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
> - LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
> +bool DependenceAnalysisWrapperPass::runOnFunction(Function &F) {
> + auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
> + auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
> + auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
> + info.reset(new DependenceInfo(&F, &AA, &SE, &LI));
> return false;
> }
>
> -
> -void DependenceAnalysis::releaseMemory() {
> +DependenceInfo &DependenceAnalysisWrapperPass::getDI() const {
> + assert(info && "Pass has not been run");
> + return *info;
> }
>
> +void DependenceAnalysisWrapperPass::releaseMemory() {}
>
> -void DependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
> +void DependenceAnalysisWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
> AU.setPreservesAll();
> AU.addRequiredTransitive<AAResultsWrapperPass>();
> AU.addRequiredTransitive<ScalarEvolutionWrapperPass>();
> @@ -155,11 +165,10 @@
> // Looks through the function, noting loads and stores.
> // Calls depends() on every possible pair and prints out the result.
> // Ignores all other instructions.
> -static
> -void dumpExampleDependence(raw_ostream &OS, Function *F,
> - DependenceAnalysis *DA) {
> - for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F);
> - SrcI != SrcE; ++SrcI) {
> +static void dumpExampleDependence(raw_ostream &OS, DependenceInfo *DA) {
> + auto *F = DA->getFunction();
> + for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F); SrcI != SrcE;
> + ++SrcI) {
> if (isa<StoreInst>(*SrcI) || isa<LoadInst>(*SrcI)) {
> for (inst_iterator DstI = SrcI, DstE = inst_end(F);
> DstI != DstE; ++DstI) {
> @@ -183,9 +192,10 @@
> }
> }
>
> -
> -void DependenceAnalysis::print(raw_ostream &OS, const Module*) const {
> - dumpExampleDependence(OS, F, const_cast<DependenceAnalysis *>(this));
> +void DependenceAnalysisWrapperPass::print(raw_ostream &OS,
> + const Module *) const {
> + assert(info && "Wrapper Pass has not been properly run");
> + dumpExampleDependence(OS, info.get());
> }
>
> //===----------------------------------------------------------------------===//
> @@ -286,112 +296,102 @@
>
>
> //===----------------------------------------------------------------------===//
> -// DependenceAnalysis::Constraint methods
> +// DependenceInfo::Constraint methods
>
> // If constraint is a point <X, Y>, returns X.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getX() const {
> +const SCEV *DependenceInfo::Constraint::getX() const {
> assert(Kind == Point && "Kind should be Point");
> return A;
> }
>
>
> // If constraint is a point <X, Y>, returns Y.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getY() const {
> +const SCEV *DependenceInfo::Constraint::getY() const {
> assert(Kind == Point && "Kind should be Point");
> return B;
> }
>
>
> // If constraint is a line AX + BY = C, returns A.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getA() const {
> +const SCEV *DependenceInfo::Constraint::getA() const {
> assert((Kind == Line || Kind == Distance) &&
> "Kind should be Line (or Distance)");
> return A;
> }
>
>
> // If constraint is a line AX + BY = C, returns B.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getB() const {
> +const SCEV *DependenceInfo::Constraint::getB() const {
> assert((Kind == Line || Kind == Distance) &&
> "Kind should be Line (or Distance)");
> return B;
> }
>
>
> // If constraint is a line AX + BY = C, returns C.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getC() const {
> +const SCEV *DependenceInfo::Constraint::getC() const {
> assert((Kind == Line || Kind == Distance) &&
> "Kind should be Line (or Distance)");
> return C;
> }
>
>
> // If constraint is a distance, returns D.
> // Otherwise assert.
> -const SCEV *DependenceAnalysis::Constraint::getD() const {
> +const SCEV *DependenceInfo::Constraint::getD() const {
> assert(Kind == Distance && "Kind should be Distance");
> return SE->getNegativeSCEV(C);
> }
>
>
> // Returns the loop associated with this constraint.
> -const Loop *DependenceAnalysis::Constraint::getAssociatedLoop() const {
> +const Loop *DependenceInfo::Constraint::getAssociatedLoop() const {
> assert((Kind == Distance || Kind == Line || Kind == Point) &&
> "Kind should be Distance, Line, or Point");
> return AssociatedLoop;
> }
>
> -
> -void DependenceAnalysis::Constraint::setPoint(const SCEV *X,
> - const SCEV *Y,
> - const Loop *CurLoop) {
> +void DependenceInfo::Constraint::setPoint(const SCEV *X, const SCEV *Y,
> + const Loop *CurLoop) {
> Kind = Point;
> A = X;
> B = Y;
> AssociatedLoop = CurLoop;
> }
>
> -
> -void DependenceAnalysis::Constraint::setLine(const SCEV *AA,
> - const SCEV *BB,
> - const SCEV *CC,
> - const Loop *CurLoop) {
> +void DependenceInfo::Constraint::setLine(const SCEV *AA, const SCEV *BB,
> + const SCEV *CC, const Loop *CurLoop) {
> Kind = Line;
> A = AA;
> B = BB;
> C = CC;
> AssociatedLoop = CurLoop;
> }
>
> -
> -void DependenceAnalysis::Constraint::setDistance(const SCEV *D,
> - const Loop *CurLoop) {
> +void DependenceInfo::Constraint::setDistance(const SCEV *D,
> + const Loop *CurLoop) {
> Kind = Distance;
> A = SE->getOne(D->getType());
> B = SE->getNegativeSCEV(A);
> C = SE->getNegativeSCEV(D);
> AssociatedLoop = CurLoop;
> }
>
> +void DependenceInfo::Constraint::setEmpty() { Kind = Empty; }
>
> -void DependenceAnalysis::Constraint::setEmpty() {
> - Kind = Empty;
> -}
> -
> -
> -void DependenceAnalysis::Constraint::setAny(ScalarEvolution *NewSE) {
> +void DependenceInfo::Constraint::setAny(ScalarEvolution *NewSE) {
> SE = NewSE;
> Kind = Any;
> }
>
>
> // For debugging purposes. Dumps the constraint out to OS.
> -void DependenceAnalysis::Constraint::dump(raw_ostream &OS) const {
> +void DependenceInfo::Constraint::dump(raw_ostream &OS) const {
> if (isEmpty())
> OS << " Empty\n";
> else if (isAny())
> @@ -416,8 +416,7 @@
> // Practical Dependence Testing
> // Goff, Kennedy, Tseng
> // PLDI 1991
> -bool DependenceAnalysis::intersectConstraints(Constraint *X,
> - const Constraint *Y) {
> +bool DependenceInfo::intersectConstraints(Constraint *X, const Constraint *Y) {
> ++DeltaApplications;
> DEBUG(dbgs() << "\tintersect constraints\n");
> DEBUG(dbgs() << "\t X ="; X->dump(dbgs()));
> @@ -569,7 +568,7 @@
>
>
> //===----------------------------------------------------------------------===//
> -// DependenceAnalysis methods
> +// DependenceInfo methods
>
> // For debugging purposes. Dumps a dependence to OS.
> void Dependence::dump(raw_ostream &OS) const {
> @@ -709,8 +708,8 @@
> // e - 5
> // f - 6
> // g - 7 = MaxLevels
> -void DependenceAnalysis::establishNestingLevels(const Instruction *Src,
> - const Instruction *Dst) {
> +void DependenceInfo::establishNestingLevels(const Instruction *Src,
> + const Instruction *Dst) {
> const BasicBlock *SrcBlock = Src->getParent();
> const BasicBlock *DstBlock = Dst->getParent();
> unsigned SrcLevel = LI->getLoopDepth(SrcBlock);
> @@ -739,14 +738,14 @@
>
> // Given one of the loops containing the source, return
> // its level index in our numbering scheme.
> -unsigned DependenceAnalysis::mapSrcLoop(const Loop *SrcLoop) const {
> +unsigned DependenceInfo::mapSrcLoop(const Loop *SrcLoop) const {
> return SrcLoop->getLoopDepth();
> }
>
>
> // Given one of the loops containing the destination,
> // return its level index in our numbering scheme.
> -unsigned DependenceAnalysis::mapDstLoop(const Loop *DstLoop) const {
> +unsigned DependenceInfo::mapDstLoop(const Loop *DstLoop) const {
> unsigned D = DstLoop->getLoopDepth();
> if (D > CommonLevels)
> return D - CommonLevels + SrcLevels;
> @@ -756,8 +755,8 @@
>
>
> // Returns true if Expression is loop invariant in LoopNest.
> -bool DependenceAnalysis::isLoopInvariant(const SCEV *Expression,
> - const Loop *LoopNest) const {
> +bool DependenceInfo::isLoopInvariant(const SCEV *Expression,
> + const Loop *LoopNest) const {
> if (!LoopNest)
> return true;
> return SE->isLoopInvariant(Expression, LoopNest) &&
> @@ -768,18 +767,18 @@
>
> // Finds the set of loops from the LoopNest that
> // have a level <= CommonLevels and are referred to by the SCEV Expression.
> -void DependenceAnalysis::collectCommonLoops(const SCEV *Expression,
> - const Loop *LoopNest,
> - SmallBitVector &Loops) const {
> +void DependenceInfo::collectCommonLoops(const SCEV *Expression,
> + const Loop *LoopNest,
> + SmallBitVector &Loops) const {
> while (LoopNest) {
> unsigned Level = LoopNest->getLoopDepth();
> if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest))
> Loops.set(Level);
> LoopNest = LoopNest->getParentLoop();
> }
> }
>
> -void DependenceAnalysis::unifySubscriptType(ArrayRef<Subscript *> Pairs) {
> +void DependenceInfo::unifySubscriptType(ArrayRef<Subscript *> Pairs) {
>
> unsigned widestWidthSeen = 0;
> Type *widestType;
> @@ -836,7 +835,7 @@
> // If the source and destination are identically sign (or zero)
> // extended, it strips off the extension in an effect to simplify
> // the actual analysis.
> -void DependenceAnalysis::removeMatchingExtensions(Subscript *Pair) {
> +void DependenceInfo::removeMatchingExtensions(Subscript *Pair) {
> const SCEV *Src = Pair->Src;
> const SCEV *Dst = Pair->Dst;
> if ((isa<SCEVZeroExtendExpr>(Src) && isa<SCEVZeroExtendExpr>(Dst)) ||
> @@ -855,9 +854,8 @@
>
> // Examine the scev and return true iff it's linear.
> // Collect any loops mentioned in the set of "Loops".
> -bool DependenceAnalysis::checkSrcSubscript(const SCEV *Src,
> - const Loop *LoopNest,
> - SmallBitVector &Loops) {
> +bool DependenceInfo::checkSrcSubscript(const SCEV *Src, const Loop *LoopNest,
> + SmallBitVector &Loops) {
> const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Src);
> if (!AddRec)
> return isLoopInvariant(Src, LoopNest);
> @@ -881,9 +879,8 @@
>
> // Examine the scev and return true iff it's linear.
> // Collect any loops mentioned in the set of "Loops".
> -bool DependenceAnalysis::checkDstSubscript(const SCEV *Dst,
> - const Loop *LoopNest,
> - SmallBitVector &Loops) {
> +bool DependenceInfo::checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,
> + SmallBitVector &Loops) {
> const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Dst);
> if (!AddRec)
> return isLoopInvariant(Dst, LoopNest);
> @@ -907,10 +904,10 @@
> // Examines the subscript pair (the Src and Dst SCEVs)
> // and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear.
> // Collects the associated loops in a set.
> -DependenceAnalysis::Subscript::ClassificationKind
> -DependenceAnalysis::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,
> - const SCEV *Dst, const Loop *DstLoopNest,
> - SmallBitVector &Loops) {
> +DependenceInfo::Subscript::ClassificationKind
> +DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,
> + const SCEV *Dst, const Loop *DstLoopNest,
> + SmallBitVector &Loops) {
> SmallBitVector SrcLoops(MaxLevels + 1);
> SmallBitVector DstLoops(MaxLevels + 1);
> if (!checkSrcSubscript(Src, SrcLoopNest, SrcLoops))
> @@ -942,9 +939,8 @@
> // If SCEV::isKnownPredicate can't prove the predicate,
> // we try simple subtraction, which seems to help in some cases
> // involving symbolics.
> -bool DependenceAnalysis::isKnownPredicate(ICmpInst::Predicate Pred,
> - const SCEV *X,
> - const SCEV *Y) const {
> +bool DependenceInfo::isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *X,
> + const SCEV *Y) const {
> if (Pred == CmpInst::ICMP_EQ ||
> Pred == CmpInst::ICMP_NE) {
> if ((isa<SCEVSignExtendExpr>(X) &&
> @@ -995,8 +991,7 @@
> // Truncating is safe when subscripts are known not to wrap. Cases without
> // nowrap flags should have been rejected earlier.
> // Return null if no bound available.
> -const SCEV *DependenceAnalysis::collectUpperBound(const Loop *L,
> - Type *T) const {
> +const SCEV *DependenceInfo::collectUpperBound(const Loop *L, Type *T) const {
> if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
> const SCEV *UB = SE->getBackedgeTakenCount(L);
> return SE->getTruncateOrZeroExtend(UB, T);
> @@ -1007,9 +1002,8 @@
>
> // Calls collectUpperBound(), then attempts to cast it to SCEVConstant.
> // If the cast fails, returns NULL.
> -const SCEVConstant *DependenceAnalysis::collectConstantUpperBound(const Loop *L,
> - Type *T
> - ) const {
> +const SCEVConstant *DependenceInfo::collectConstantUpperBound(const Loop *L,
> + Type *T) const {
> if (const SCEV *UB = collectUpperBound(L, T))
> return dyn_cast<SCEVConstant>(UB);
> return nullptr;
> @@ -1026,9 +1020,8 @@
> // 3) the values might be equal, so we have to assume a dependence.
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::testZIV(const SCEV *Src,
> - const SCEV *Dst,
> - FullDependence &Result) const {
> +bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst,
> + FullDependence &Result) const {
> DEBUG(dbgs() << " src = " << *Src << "\n");
> DEBUG(dbgs() << " dst = " << *Dst << "\n");
> ++ZIVapplications;
> @@ -1074,13 +1067,10 @@
> // { > if d < 0
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::strongSIVtest(const SCEV *Coeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *CurLoop,
> - unsigned Level,
> - FullDependence &Result,
> - Constraint &NewConstraint) const {
> +bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst,
> + const SCEV *DstConst, const Loop *CurLoop,
> + unsigned Level, FullDependence &Result,
> + Constraint &NewConstraint) const {
> DEBUG(dbgs() << "\tStrong SIV test\n");
> DEBUG(dbgs() << "\t Coeff = " << *Coeff);
> DEBUG(dbgs() << ", " << *Coeff->getType() << "\n");
> @@ -1213,14 +1203,10 @@
> // Can determine iteration for splitting.
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::weakCrossingSIVtest(const SCEV *Coeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *CurLoop,
> - unsigned Level,
> - FullDependence &Result,
> - Constraint &NewConstraint,
> - const SCEV *&SplitIter) const {
> +bool DependenceInfo::weakCrossingSIVtest(
> + const SCEV *Coeff, const SCEV *SrcConst, const SCEV *DstConst,
> + const Loop *CurLoop, unsigned Level, FullDependence &Result,
> + Constraint &NewConstraint, const SCEV *&SplitIter) const {
> DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");
> DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");
> DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
> @@ -1256,7 +1242,7 @@
> }
> assert(SE->isKnownPositive(ConstCoeff) && "ConstCoeff should be positive");
>
> - // compute SplitIter for use by DependenceAnalysis::getSplitIteration()
> + // compute SplitIter for use by DependenceInfo::getSplitIteration()
> SplitIter = SE->getUDivExpr(
> SE->getSMaxExpr(SE->getZero(Delta->getType()), Delta),
> SE->getMulExpr(SE->getConstant(Delta->getType(), 2), ConstCoeff));
> @@ -1433,14 +1419,11 @@
> // in the case of the strong SIV test, can compute Distances.
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::exactSIVtest(const SCEV *SrcCoeff,
> - const SCEV *DstCoeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *CurLoop,
> - unsigned Level,
> - FullDependence &Result,
> - Constraint &NewConstraint) const {
> +bool DependenceInfo::exactSIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
> + const SCEV *SrcConst, const SCEV *DstConst,
> + const Loop *CurLoop, unsigned Level,
> + FullDependence &Result,
> + Constraint &NewConstraint) const {
> DEBUG(dbgs() << "\tExact SIV test\n");
> DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");
> DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");
> @@ -1645,13 +1628,12 @@
> // (see also weakZeroDstSIVtest)
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::weakZeroSrcSIVtest(const SCEV *DstCoeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *CurLoop,
> - unsigned Level,
> - FullDependence &Result,
> - Constraint &NewConstraint) const {
> +bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *DstCoeff,
> + const SCEV *SrcConst,
> + const SCEV *DstConst,
> + const Loop *CurLoop, unsigned Level,
> + FullDependence &Result,
> + Constraint &NewConstraint) const {
> // For the WeakSIV test, it's possible the loop isn't common to
> // the Src and Dst loops. If it isn't, then there's no need to
> // record a direction.
> @@ -1756,13 +1738,12 @@
> // (see also weakZeroSrcSIVtest)
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::weakZeroDstSIVtest(const SCEV *SrcCoeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *CurLoop,
> - unsigned Level,
> - FullDependence &Result,
> - Constraint &NewConstraint) const {
> +bool DependenceInfo::weakZeroDstSIVtest(const SCEV *SrcCoeff,
> + const SCEV *SrcConst,
> + const SCEV *DstConst,
> + const Loop *CurLoop, unsigned Level,
> + FullDependence &Result,
> + Constraint &NewConstraint) const {
> // For the WeakSIV test, it's possible the loop isn't common to the
> // Src and Dst loops. If it isn't, then there's no need to record a direction.
> DEBUG(dbgs() << "\tWeak-Zero (dst) SIV test\n");
> @@ -1842,13 +1823,10 @@
> // Returns true if any possible dependence is disproved.
> // Marks the result as inconsistent.
> // Works in some cases that symbolicRDIVtest doesn't, and vice versa.
> -bool DependenceAnalysis::exactRDIVtest(const SCEV *SrcCoeff,
> - const SCEV *DstCoeff,
> - const SCEV *SrcConst,
> - const SCEV *DstConst,
> - const Loop *SrcLoop,
> - const Loop *DstLoop,
> - FullDependence &Result) const {
> +bool DependenceInfo::exactRDIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
> + const SCEV *SrcConst, const SCEV *DstConst,
> + const Loop *SrcLoop, const Loop *DstLoop,
> + FullDependence &Result) const {
> DEBUG(dbgs() << "\tExact RDIV test\n");
> DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");
> DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");
> @@ -1986,12 +1964,10 @@
> // a1*N1 <= c2 - c1 <= -a2*N2
> //
> // return true if dependence disproved
> -bool DependenceAnalysis::symbolicRDIVtest(const SCEV *A1,
> - const SCEV *A2,
> - const SCEV *C1,
> - const SCEV *C2,
> - const Loop *Loop1,
> - const Loop *Loop2) const {
> +bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,
> + const SCEV *C1, const SCEV *C2,
> + const Loop *Loop1,
> + const Loop *Loop2) const {
> ++SymbolicRDIVapplications;
> DEBUG(dbgs() << "\ttry symbolic RDIV test\n");
> DEBUG(dbgs() << "\t A1 = " << *A1);
> @@ -2103,12 +2079,9 @@
> // they apply; they're cheaper and sometimes more precise.
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::testSIV(const SCEV *Src,
> - const SCEV *Dst,
> - unsigned &Level,
> - FullDependence &Result,
> - Constraint &NewConstraint,
> - const SCEV *&SplitIter) const {
> +bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
> + FullDependence &Result, Constraint &NewConstraint,
> + const SCEV *&SplitIter) const {
> DEBUG(dbgs() << " src = " << *Src << "\n");
> DEBUG(dbgs() << " dst = " << *Dst << "\n");
> const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
> @@ -2174,9 +2147,8 @@
> // [c1 + a1*i + a2*j][c2].
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::testRDIV(const SCEV *Src,
> - const SCEV *Dst,
> - FullDependence &Result) const {
> +bool DependenceInfo::testRDIV(const SCEV *Src, const SCEV *Dst,
> + FullDependence &Result) const {
> // we have 3 possible situations here:
> // 1) [a*i + b] and [c*j + d]
> // 2) [a*i + c*j + b] and [d]
> @@ -2241,10 +2213,9 @@
> // Tests the single-subscript MIV pair (Src and Dst) for dependence.
> // Return true if dependence disproved.
> // Can sometimes refine direction vectors.
> -bool DependenceAnalysis::testMIV(const SCEV *Src,
> - const SCEV *Dst,
> - const SmallBitVector &Loops,
> - FullDependence &Result) const {
> +bool DependenceInfo::testMIV(const SCEV *Src, const SCEV *Dst,
> + const SmallBitVector &Loops,
> + FullDependence &Result) const {
> DEBUG(dbgs() << " src = " << *Src << "\n");
> DEBUG(dbgs() << " dst = " << *Dst << "\n");
> Result.Consistent = false;
> @@ -2284,9 +2255,8 @@
> // It occurs to me that the presence of loop-invariant variables
> // changes the nature of the test from "greatest common divisor"
> // to "a common divisor".
> -bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
> - const SCEV *Dst,
> - FullDependence &Result) const {
> +bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst,
> + FullDependence &Result) const {
> DEBUG(dbgs() << "starting gcd\n");
> ++GCDapplications;
> unsigned BitWidth = SE->getTypeSizeInBits(Src->getType());
> @@ -2488,10 +2458,9 @@
> // for the lower bound, NULL denotes -inf.
> //
> // Return true if dependence disproved.
> -bool DependenceAnalysis::banerjeeMIVtest(const SCEV *Src,
> - const SCEV *Dst,
> - const SmallBitVector &Loops,
> - FullDependence &Result) const {
> +bool DependenceInfo::banerjeeMIVtest(const SCEV *Src, const SCEV *Dst,
> + const SmallBitVector &Loops,
> + FullDependence &Result) const {
> DEBUG(dbgs() << "starting Banerjee\n");
> ++BanerjeeApplications;
> DEBUG(dbgs() << " Src = " << *Src << '\n');
> @@ -2569,13 +2538,11 @@
> // in the DirSet field of Bound. Returns the number of distinct
> // dependences discovered. If the dependence is disproved,
> // it will return 0.
> -unsigned DependenceAnalysis::exploreDirections(unsigned Level,
> - CoefficientInfo *A,
> - CoefficientInfo *B,
> - BoundInfo *Bound,
> - const SmallBitVector &Loops,
> - unsigned &DepthExpanded,
> - const SCEV *Delta) const {
> +unsigned DependenceInfo::exploreDirections(unsigned Level, CoefficientInfo *A,
> + CoefficientInfo *B, BoundInfo *Bound,
> + const SmallBitVector &Loops,
> + unsigned &DepthExpanded,
> + const SCEV *Delta) const {
> if (Level > CommonLevels) {
> // record result
> DEBUG(dbgs() << "\t[");
> @@ -2670,10 +2637,8 @@
>
>
> // Returns true iff the current bounds are plausible.
> -bool DependenceAnalysis::testBounds(unsigned char DirKind,
> - unsigned Level,
> - BoundInfo *Bound,
> - const SCEV *Delta) const {
> +bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level,
> + BoundInfo *Bound, const SCEV *Delta) const {
> Bound[Level].Direction = DirKind;
> if (const SCEV *LowerBound = getLowerBound(Bound))
> if (isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta))
> @@ -2700,10 +2665,8 @@
> // We must be careful to handle the case where the upper bound is unknown.
> // Note that the lower bound is always <= 0
> // and the upper bound is always >= 0.
> -void DependenceAnalysis::findBoundsALL(CoefficientInfo *A,
> - CoefficientInfo *B,
> - BoundInfo *Bound,
> - unsigned K) const {
> +void DependenceInfo::findBoundsALL(CoefficientInfo *A, CoefficientInfo *B,
> + BoundInfo *Bound, unsigned K) const {
> Bound[K].Lower[Dependence::DVEntry::ALL] = nullptr; // Default value = -infinity.
> Bound[K].Upper[Dependence::DVEntry::ALL] = nullptr; // Default value = +infinity.
> if (Bound[K].Iterations) {
> @@ -2741,10 +2704,8 @@
> // We must be careful to handle the case where the upper bound is unknown.
> // Note that the lower bound is always <= 0
> // and the upper bound is always >= 0.
> -void DependenceAnalysis::findBoundsEQ(CoefficientInfo *A,
> - CoefficientInfo *B,
> - BoundInfo *Bound,
> - unsigned K) const {
> +void DependenceInfo::findBoundsEQ(CoefficientInfo *A, CoefficientInfo *B,
> + BoundInfo *Bound, unsigned K) const {
> Bound[K].Lower[Dependence::DVEntry::EQ] = nullptr; // Default value = -infinity.
> Bound[K].Upper[Dependence::DVEntry::EQ] = nullptr; // Default value = +infinity.
> if (Bound[K].Iterations) {
> @@ -2783,10 +2744,8 @@
> // UB^<_k = (A^+_k - B_k)^+ (U_k - 1) - B_k
> //
> // We must be careful to handle the case where the upper bound is unknown.
> -void DependenceAnalysis::findBoundsLT(CoefficientInfo *A,
> - CoefficientInfo *B,
> - BoundInfo *Bound,
> - unsigned K) const {
> +void DependenceInfo::findBoundsLT(CoefficientInfo *A, CoefficientInfo *B,
> + BoundInfo *Bound, unsigned K) const {
> Bound[K].Lower[Dependence::DVEntry::LT] = nullptr; // Default value = -infinity.
> Bound[K].Upper[Dependence::DVEntry::LT] = nullptr; // Default value = +infinity.
> if (Bound[K].Iterations) {
> @@ -2829,10 +2788,8 @@
> // UB^>_k = (A_k - B^-_k)^+ (U_k - 1) + A_k
> //
> // We must be careful to handle the case where the upper bound is unknown.
> -void DependenceAnalysis::findBoundsGT(CoefficientInfo *A,
> - CoefficientInfo *B,
> - BoundInfo *Bound,
> - unsigned K) const {
> +void DependenceInfo::findBoundsGT(CoefficientInfo *A, CoefficientInfo *B,
> + BoundInfo *Bound, unsigned K) const {
> Bound[K].Lower[Dependence::DVEntry::GT] = nullptr; // Default value = -infinity.
> Bound[K].Upper[Dependence::DVEntry::GT] = nullptr; // Default value = +infinity.
> if (Bound[K].Iterations) {
> @@ -2861,24 +2818,23 @@
>
>
> // X^+ = max(X, 0)
> -const SCEV *DependenceAnalysis::getPositivePart(const SCEV *X) const {
> +const SCEV *DependenceInfo::getPositivePart(const SCEV *X) const {
> return SE->getSMaxExpr(X, SE->getZero(X->getType()));
> }
>
>
> // X^- = min(X, 0)
> -const SCEV *DependenceAnalysis::getNegativePart(const SCEV *X) const {
> +const SCEV *DependenceInfo::getNegativePart(const SCEV *X) const {
> return SE->getSMinExpr(X, SE->getZero(X->getType()));
> }
>
>
> // Walks through the subscript,
> // collecting each coefficient, the associated loop bounds,
> // and recording its positive and negative parts for later use.
> -DependenceAnalysis::CoefficientInfo *
> -DependenceAnalysis::collectCoeffInfo(const SCEV *Subscript,
> - bool SrcFlag,
> - const SCEV *&Constant) const {
> +DependenceInfo::CoefficientInfo *
> +DependenceInfo::collectCoeffInfo(const SCEV *Subscript, bool SrcFlag,
> + const SCEV *&Constant) const {
> const SCEV *Zero = SE->getZero(Subscript->getType());
> CoefficientInfo *CI = new CoefficientInfo[MaxLevels + 1];
> for (unsigned K = 1; K <= MaxLevels; ++K) {
> @@ -2922,7 +2878,7 @@
> // computes the lower bound given the current direction settings
> // at each level. If the lower bound for any level is -inf,
> // the result is -inf.
> -const SCEV *DependenceAnalysis::getLowerBound(BoundInfo *Bound) const {
> +const SCEV *DependenceInfo::getLowerBound(BoundInfo *Bound) const {
> const SCEV *Sum = Bound[1].Lower[Bound[1].Direction];
> for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
> if (Bound[K].Lower[Bound[K].Direction])
> @@ -2938,7 +2894,7 @@
> // computes the upper bound given the current direction settings
> // at each level. If the upper bound at any level is +inf,
> // the result is +inf.
> -const SCEV *DependenceAnalysis::getUpperBound(BoundInfo *Bound) const {
> +const SCEV *DependenceInfo::getUpperBound(BoundInfo *Bound) const {
> const SCEV *Sum = Bound[1].Upper[Bound[1].Direction];
> for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
> if (Bound[K].Upper[Bound[K].Direction])
> @@ -2959,8 +2915,8 @@
> // If there isn't one, return 0.
> // For example, given a*i + b*j + c*k, finding the coefficient
> // corresponding to the j loop would yield b.
> -const SCEV *DependenceAnalysis::findCoefficient(const SCEV *Expr,
> - const Loop *TargetLoop) const {
> +const SCEV *DependenceInfo::findCoefficient(const SCEV *Expr,
> + const Loop *TargetLoop) const {
> const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
> if (!AddRec)
> return SE->getZero(Expr->getType());
> @@ -2975,8 +2931,8 @@
> // corresponding to the specified loop.
> // For example, given a*i + b*j + c*k, zeroing the coefficient
> // corresponding to the j loop would yield a*i + c*k.
> -const SCEV *DependenceAnalysis::zeroCoefficient(const SCEV *Expr,
> - const Loop *TargetLoop) const {
> +const SCEV *DependenceInfo::zeroCoefficient(const SCEV *Expr,
> + const Loop *TargetLoop) const {
> const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
> if (!AddRec)
> return Expr; // ignore
> @@ -2994,9 +2950,9 @@
> // coefficient corresponding to the specified TargetLoop.
> // For example, given a*i + b*j + c*k, adding 1 to the coefficient
> // corresponding to the j loop would yield a*i + (b+1)*j + c*k.
> -const SCEV *DependenceAnalysis::addToCoefficient(const SCEV *Expr,
> - const Loop *TargetLoop,
> - const SCEV *Value) const {
> +const SCEV *DependenceInfo::addToCoefficient(const SCEV *Expr,
> + const Loop *TargetLoop,
> + const SCEV *Value) const {
> const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
> if (!AddRec) // create a new addRec
> return SE->getAddRecExpr(Expr,
> @@ -3031,11 +2987,10 @@
> // Practical Dependence Testing
> // Goff, Kennedy, Tseng
> // PLDI 1991
> -bool DependenceAnalysis::propagate(const SCEV *&Src,
> - const SCEV *&Dst,
> - SmallBitVector &Loops,
> - SmallVectorImpl<Constraint> &Constraints,
> - bool &Consistent) {
> +bool DependenceInfo::propagate(const SCEV *&Src, const SCEV *&Dst,
> + SmallBitVector &Loops,
> + SmallVectorImpl<Constraint> &Constraints,
> + bool &Consistent) {
> bool Result = false;
> for (int LI = Loops.find_first(); LI >= 0; LI = Loops.find_next(LI)) {
> DEBUG(dbgs() << "\t Constraint[" << LI << "] is");
> @@ -3056,10 +3011,9 @@
> // Return true if some simplification occurs.
> // If the simplification isn't exact (that is, if it is conservative
> // in terms of dependence), set consistent to false.
> -bool DependenceAnalysis::propagateDistance(const SCEV *&Src,
> - const SCEV *&Dst,
> - Constraint &CurConstraint,
> - bool &Consistent) {
> +bool DependenceInfo::propagateDistance(const SCEV *&Src, const SCEV *&Dst,
> + Constraint &CurConstraint,
> + bool &Consistent) {
> const Loop *CurLoop = CurConstraint.getAssociatedLoop();
> DEBUG(dbgs() << "\t\tSrc is " << *Src << "\n");
> const SCEV *A_K = findCoefficient(Src, CurLoop);
> @@ -3083,10 +3037,9 @@
> // Return true if some simplification occurs.
> // If the simplification isn't exact (that is, if it is conservative
> // in terms of dependence), set consistent to false.
> -bool DependenceAnalysis::propagateLine(const SCEV *&Src,
> - const SCEV *&Dst,
> - Constraint &CurConstraint,
> - bool &Consistent) {
> +bool DependenceInfo::propagateLine(const SCEV *&Src, const SCEV *&Dst,
> + Constraint &CurConstraint,
> + bool &Consistent) {
> const Loop *CurLoop = CurConstraint.getAssociatedLoop();
> const SCEV *A = CurConstraint.getA();
> const SCEV *B = CurConstraint.getB();
> @@ -3158,9 +3111,8 @@
> // Attempt to propagate a point
> // constraint into a subscript pair (Src and Dst).
> // Return true if some simplification occurs.
> -bool DependenceAnalysis::propagatePoint(const SCEV *&Src,
> - const SCEV *&Dst,
> - Constraint &CurConstraint) {
> +bool DependenceInfo::propagatePoint(const SCEV *&Src, const SCEV *&Dst,
> + Constraint &CurConstraint) {
> const Loop *CurLoop = CurConstraint.getAssociatedLoop();
> const SCEV *A_K = findCoefficient(Src, CurLoop);
> const SCEV *AP_K = findCoefficient(Dst, CurLoop);
> @@ -3178,9 +3130,8 @@
>
>
> // Update direction vector entry based on the current constraint.
> -void DependenceAnalysis::updateDirection(Dependence::DVEntry &Level,
> - const Constraint &CurConstraint
> - ) const {
> +void DependenceInfo::updateDirection(Dependence::DVEntry &Level,
> + const Constraint &CurConstraint) const {
> DEBUG(dbgs() << "\tUpdate direction, constraint =");
> DEBUG(CurConstraint.dump(dbgs()));
> if (CurConstraint.isAny())
> @@ -3232,10 +3183,8 @@
> /// source and destination array references are recurrences on a nested loop,
> /// this function flattens the nested recurrences into separate recurrences
> /// for each loop level.
> -bool DependenceAnalysis::tryDelinearize(Instruction *Src,
> - Instruction *Dst,
> - SmallVectorImpl<Subscript> &Pair)
> -{
> +bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,
> + SmallVectorImpl<Subscript> &Pair) {
> Value *SrcPtr = getPointerOperand(Src);
> Value *DstPtr = getPointerOperand(Dst);
>
> @@ -3346,8 +3295,8 @@
> // Care is required to keep the routine below, getSplitIteration(),
> // up to date with respect to this routine.
> std::unique_ptr<Dependence>
> -DependenceAnalysis::depends(Instruction *Src, Instruction *Dst,
> - bool PossiblyLoopIndependent) {
> +DependenceInfo::depends(Instruction *Src, Instruction *Dst,
> + bool PossiblyLoopIndependent) {
> if (Src == Dst)
> PossiblyLoopIndependent = false;
>
> @@ -3802,8 +3751,8 @@
> //
> // breaks the dependence and allows us to vectorize/parallelize
> // both loops.
> -const SCEV *DependenceAnalysis::getSplitIteration(const Dependence &Dep,
> - unsigned SplitLevel) {
> +const SCEV *DependenceInfo::getSplitIteration(const Dependence &Dep,
> + unsigned SplitLevel) {
> assert(Dep.isSplitable(SplitLevel) &&
> "Dep should be splitable at SplitLevel");
> Instruction *Src = Dep.getSrc();
> Index: lib/Analysis/Analysis.cpp
> ===================================================================
> --- lib/Analysis/Analysis.cpp
> +++ lib/Analysis/Analysis.cpp
> @@ -35,7 +35,7 @@
> initializeCFGOnlyViewerPass(Registry);
> initializeCFGOnlyPrinterPass(Registry);
> initializeCFLAAWrapperPassPass(Registry);
> - initializeDependenceAnalysisPass(Registry);
> + initializeDependenceAnalysisWrapperPassPass(Registry);
> initializeDelinearizationPass(Registry);
> initializeDemandedBitsWrapperPassPass(Registry);
> initializeDivergenceAnalysisPass(Registry);
> Index: include/llvm/LinkAllPasses.h
> ===================================================================
> --- include/llvm/LinkAllPasses.h
> +++ include/llvm/LinkAllPasses.h
> @@ -82,7 +82,7 @@
> (void) llvm::createDeadCodeEliminationPass();
> (void) llvm::createDeadInstEliminationPass();
> (void) llvm::createDeadStoreEliminationPass();
> - (void) llvm::createDependenceAnalysisPass();
> + (void) llvm::createDependenceAnalysisWrapperPass();
> (void) llvm::createDivergenceAnalysisPass();
> (void) llvm::createDomOnlyPrinterPass();
> (void) llvm::createDomPrinterPass();
> Index: include/llvm/InitializePasses.h
> ===================================================================
> --- include/llvm/InitializePasses.h
> +++ include/llvm/InitializePasses.h
> @@ -111,6 +111,7 @@
> void initializeDelinearizationPass(PassRegistry &);
> void initializeDependenceAnalysisPass(PassRegistry&);
> void initializeDetectDeadLanesPass(PassRegistry&);
> +void initializeDependenceAnalysisWrapperPassPass(PassRegistry&);
> void initializeDivergenceAnalysisPass(PassRegistry&);
> void initializeDomOnlyPrinterPass(PassRegistry&);
> void initializeDomOnlyViewerPass(PassRegistry&);
> Index: include/llvm/Analysis/Passes.h
> ===================================================================
> --- include/llvm/Analysis/Passes.h
> +++ include/llvm/Analysis/Passes.h
> @@ -40,10 +40,10 @@
>
> //===--------------------------------------------------------------------===//
> //
> - // createDependenceAnalysisPass - This creates an instance of the
> - // DependenceAnalysis pass.
> + // createDependenceAnalysisWrapperPass - This creates an instance of the
> + // DependenceAnalysisWrapper pass.
> //
> - FunctionPass *createDependenceAnalysisPass();
> + FunctionPass *createDependenceAnalysisWrapperPass();
>
> //===--------------------------------------------------------------------===//
> //
> Index: include/llvm/Analysis/DependenceAnalysis.h
> ===================================================================
> --- include/llvm/Analysis/DependenceAnalysis.h
> +++ include/llvm/Analysis/DependenceAnalysis.h
> @@ -206,7 +206,7 @@
> private:
> Instruction *Src, *Dst;
> const Dependence *NextPredecessor, *NextSuccessor;
> - friend class DependenceAnalysis;
> + friend class DependenceInfo;
> };
>
> /// FullDependence - This class represents a dependence between two memory
> @@ -274,16 +274,17 @@
> bool LoopIndependent;
> bool Consistent; // Init to true, then refine.
> std::unique_ptr<DVEntry[]> DV;
> - friend class DependenceAnalysis;
> + friend class DependenceInfo;
> };
>
> - /// DependenceAnalysis - This class is the main dependence-analysis driver.
> + /// DependenceInfo - This class is the main dependence-analysis driver.
> ///
> - class DependenceAnalysis : public FunctionPass {
> - void operator=(const DependenceAnalysis &) = delete;
> - DependenceAnalysis(const DependenceAnalysis &) = delete;
> -
> + class DependenceInfo {
> public:
> + DependenceInfo(Function *F, AliasAnalysis *AA, ScalarEvolution *SE,
> + LoopInfo *LI)
> + : AA(AA), SE(SE), LI(LI), F(F) {}
> +
> /// depends - Tests for a dependence between the Src and Dst instructions.
> /// Returns NULL if no dependence; otherwise, returns a Dependence (or a
> /// FullDependence) with as much information as can be gleaned.
> @@ -336,6 +337,8 @@
> /// both loops.
> const SCEV *getSplitIteration(const Dependence &Dep, unsigned Level);
>
> + Function *getFunction() const { return F; }
> +
> private:
> AliasAnalysis *AA;
> ScalarEvolution *SE;
> @@ -919,22 +922,41 @@
>
> bool tryDelinearize(Instruction *Src, Instruction *Dst,
> SmallVectorImpl<Subscript> &Pair);
> + }; // class DependenceInfo
>
> + /// \brief AnalysisPass to compute dependence information in a function
> + class DependenceAnalysis : public AnalysisInfoMixin<DependenceAnalysis> {
> + public:
> + typedef DependenceInfo Result;
> + Result run(Function &F, FunctionAnalysisManager &FAM);
> +
> + private:
> + static char PassID;
> + friend struct AnalysisInfoMixin<DependenceAnalysis>;
> + }; // class DependenceAnalysis
> +
> + /// \brief Legacy pass manager pass to access dependence information
> + class DependenceAnalysisWrapperPass : public FunctionPass {
> public:
> static char ID; // Class identification, replacement for typeinfo
> - DependenceAnalysis() : FunctionPass(ID) {
> - initializeDependenceAnalysisPass(*PassRegistry::getPassRegistry());
> + DependenceAnalysisWrapperPass() : FunctionPass(ID) {
> + initializeDependenceAnalysisWrapperPassPass(
> + *PassRegistry::getPassRegistry());
> }
>
> bool runOnFunction(Function &F) override;
> void releaseMemory() override;
> void getAnalysisUsage(AnalysisUsage &) const override;
> void print(raw_ostream &, const Module * = nullptr) const override;
> - }; // class DependenceAnalysis
> + DependenceInfo &getDI() const;
> +
> + private:
> + std::unique_ptr<DependenceInfo> info;
> + }; // class DependenceAnalysisWrapperPass
>
> /// createDependenceAnalysisPass - This creates an instance of the
> - /// DependenceAnalysis pass.
> - FunctionPass *createDependenceAnalysisPass();
> + /// DependenceAnalysis wrapper pass.
> + FunctionPass *createDependenceAnalysisWrapperPass();
>
> } // namespace llvm
>
More information about the llvm-commits
mailing list