diff options
author | David Sherwood <david.sherwood@arm.com> | 2025-01-15 13:56:42 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-15 13:56:42 +0000 |
commit | a00938eedd4246c4252ce3e69a05c4b6760983a3 (patch) | |
tree | 4d737409ae08539c7a7b9630eae20b5d3d633d1b /llvm/lib/Analysis/LoopAccessAnalysis.cpp | |
parent | 6ca560a9092e29c9f9817db6d6da09edd5f0ded7 (diff) | |
download | llvm-a00938eedd4246c4252ce3e69a05c4b6760983a3.zip llvm-a00938eedd4246c4252ce3e69a05c4b6760983a3.tar.gz llvm-a00938eedd4246c4252ce3e69a05c4b6760983a3.tar.bz2 |
Revert "[LoopVectorize] Add support for reverse loops in isDereferenceableAndAlignedInLoop (#96752)" (#123057)
This reverts commit bfedf6460c2cad6e6f966b457d8d27084579dcd8.
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 11e0a22..2a68979 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -190,20 +190,31 @@ RuntimeCheckingPtrGroup::RuntimeCheckingPtrGroup( Members.push_back(Index); } -std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess( - const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, const SCEV *MaxBECount, - ScalarEvolution *SE, +/// Calculate Start and End points of memory access. +/// Let's assume A is the first access and B is a memory access on N-th loop +/// iteration. Then B is calculated as: +/// B = A + Step*N . +/// Step value may be positive or negative. +/// N is a calculated back-edge taken count: +/// N = (TripCount > 0) ? RoundDown(TripCount -1 , VF) : 0 +/// Start and End points are calculated in the following way: +/// Start = UMIN(A, B) ; End = UMAX(A, B) + SizeOfElt, +/// where SizeOfElt is the size of single memory access in bytes. +/// +/// There is no conflict when the intervals are disjoint: +/// NoConflict = (P2.Start >= P1.End) || (P1.Start >= P2.End) +static std::pair<const SCEV *, const SCEV *> getStartAndEndForAccess( + const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, + PredicatedScalarEvolution &PSE, DenseMap<std::pair<const SCEV *, Type *>, - std::pair<const SCEV *, const SCEV *>> *PointerBounds) { - std::pair<const SCEV *, const SCEV *> *PtrBoundsPair; - if (PointerBounds) { - auto [Iter, Ins] = PointerBounds->insert( - {{PtrExpr, AccessTy}, - {SE->getCouldNotCompute(), SE->getCouldNotCompute()}}); - if (!Ins) - return Iter->second; - PtrBoundsPair = &Iter->second; - } + std::pair<const SCEV *, const SCEV *>> &PointerBounds) { + ScalarEvolution *SE = PSE.getSE(); + + auto [Iter, Ins] = PointerBounds.insert( + {{PtrExpr, AccessTy}, + {SE->getCouldNotCompute(), SE->getCouldNotCompute()}}); + if (!Ins) + return Iter->second; const SCEV *ScStart; const SCEV *ScEnd; @@ -211,8 +222,10 @@ std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess( if (SE->isLoopInvariant(PtrExpr, Lp)) { ScStart = ScEnd = PtrExpr; } else if (auto *AR = dyn_cast<SCEVAddRecExpr>(PtrExpr)) { + const SCEV *Ex = PSE.getSymbolicMaxBackedgeTakenCount(); + ScStart = AR->getStart(); - ScEnd = AR->evaluateAtIteration(MaxBECount, *SE); + ScEnd = AR->evaluateAtIteration(Ex, *SE); const SCEV *Step = AR->getStepRecurrence(*SE); // For expressions with negative step, the upper bound is ScStart and the @@ -231,7 +244,7 @@ std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess( return {SE->getCouldNotCompute(), SE->getCouldNotCompute()}; assert(SE->isLoopInvariant(ScStart, Lp) && "ScStart needs to be invariant"); - assert(SE->isLoopInvariant(ScEnd, Lp) && "ScEnd needs to be invariant"); + assert(SE->isLoopInvariant(ScEnd, Lp)&& "ScEnd needs to be invariant"); // Add the size of the pointed element to ScEnd. auto &DL = Lp->getHeader()->getDataLayout(); @@ -239,10 +252,8 @@ std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess( const SCEV *EltSizeSCEV = SE->getStoreSizeOfExpr(IdxTy, AccessTy); ScEnd = SE->getAddExpr(ScEnd, EltSizeSCEV); - std::pair<const SCEV *, const SCEV *> Res = {ScStart, ScEnd}; - if (PointerBounds) - *PtrBoundsPair = Res; - return Res; + Iter->second = {ScStart, ScEnd}; + return Iter->second; } /// Calculate Start and End points of memory access using @@ -252,9 +263,8 @@ void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, const SCEV *PtrExpr, unsigned DepSetId, unsigned ASId, PredicatedScalarEvolution &PSE, bool NeedsFreeze) { - const SCEV *MaxBECount = PSE.getSymbolicMaxBackedgeTakenCount(); const auto &[ScStart, ScEnd] = getStartAndEndForAccess( - Lp, PtrExpr, AccessTy, MaxBECount, PSE.getSE(), &DC.getPointerBounds()); + Lp, PtrExpr, AccessTy, PSE, DC.getPointerBounds()); assert(!isa<SCEVCouldNotCompute>(ScStart) && !isa<SCEVCouldNotCompute>(ScEnd) && "must be able to compute both start and end expressions"); @@ -1928,11 +1938,10 @@ MemoryDepChecker::getDependenceDistanceStrideAndSize( // required for correctness. if (SE.isLoopInvariant(Src, InnermostLoop) || SE.isLoopInvariant(Sink, InnermostLoop)) { - const SCEV *MaxBECount = PSE.getSymbolicMaxBackedgeTakenCount(); - const auto &[SrcStart_, SrcEnd_] = getStartAndEndForAccess( - InnermostLoop, Src, ATy, MaxBECount, PSE.getSE(), &PointerBounds); - const auto &[SinkStart_, SinkEnd_] = getStartAndEndForAccess( - InnermostLoop, Sink, BTy, MaxBECount, PSE.getSE(), &PointerBounds); + const auto &[SrcStart_, SrcEnd_] = + getStartAndEndForAccess(InnermostLoop, Src, ATy, PSE, PointerBounds); + const auto &[SinkStart_, SinkEnd_] = + getStartAndEndForAccess(InnermostLoop, Sink, BTy, PSE, PointerBounds); if (!isa<SCEVCouldNotCompute>(SrcStart_) && !isa<SCEVCouldNotCompute>(SrcEnd_) && !isa<SCEVCouldNotCompute>(SinkStart_) && |