diff options
author | David Sherwood <david.sherwood@arm.com> | 2024-09-23 09:56:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-23 09:56:37 +0100 |
commit | 02ee96eca90741031a26f0f06cd48bb0ba558d1a (patch) | |
tree | cdcffa4043a5cc06d117cc1888c708cdee8ad488 /llvm/lib/Analysis/Loads.cpp | |
parent | 6fc2451167ec991361dd0568de9a9fa2926f8da8 (diff) | |
download | llvm-02ee96eca90741031a26f0f06cd48bb0ba558d1a.zip llvm-02ee96eca90741031a26f0f06cd48bb0ba558d1a.tar.gz llvm-02ee96eca90741031a26f0f06cd48bb0ba558d1a.tar.bz2 |
[Analysis] Teach isDereferenceableAndAlignedInLoop about SCEV predicates (#106562)
Currently if a loop contains loads that we can prove at compile time
are dereferenceable when certain conditions are satisfied the function
isDereferenceableAndAlignedInLoop will still return false because
getSmallConstantMaxTripCount will return 0 when SCEV predicates
are required. This patch changes getSmallConstantMaxTripCount to take
an optional Predicates pointer argument so that we can permit
functions such as isDereferenceableAndAlignedInLoop to consider more
cases.
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r-- | llvm/lib/Analysis/Loads.cpp | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index 11f3807..f4b2027 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -276,10 +276,9 @@ static bool AreEquivalentAddressValues(const Value *A, const Value *B) { return false; } -bool llvm::isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L, - ScalarEvolution &SE, - DominatorTree &DT, - AssumptionCache *AC) { +bool llvm::isDereferenceableAndAlignedInLoop( + LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT, + AssumptionCache *AC, SmallVectorImpl<const SCEVPredicate *> *Predicates) { auto &DL = LI->getDataLayout(); Value *Ptr = LI->getPointerOperand(); @@ -304,7 +303,7 @@ bool llvm::isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L, if (!Step) return false; - auto TC = SE.getSmallConstantMaxTripCount(L); + auto TC = SE.getSmallConstantMaxTripCount(L, Predicates); if (!TC) return false; @@ -810,13 +809,13 @@ bool llvm::canReplacePointersIfEqual(const Value *From, const Value *To, return isPointerAlwaysReplaceable(From, To, DL); } -bool llvm::isDereferenceableReadOnlyLoop(Loop *L, ScalarEvolution *SE, - DominatorTree *DT, - AssumptionCache *AC) { +bool llvm::isDereferenceableReadOnlyLoop( + Loop *L, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, + SmallVectorImpl<const SCEVPredicate *> *Predicates) { for (BasicBlock *BB : L->blocks()) { for (Instruction &I : *BB) { if (auto *LI = dyn_cast<LoadInst>(&I)) { - if (!isDereferenceableAndAlignedInLoop(LI, L, *SE, *DT, AC)) + if (!isDereferenceableAndAlignedInLoop(LI, L, *SE, *DT, AC, Predicates)) return false; } else if (I.mayReadFromMemory() || I.mayWriteToMemory() || I.mayThrow()) return false; |