diff options
author | Florian Hahn <flo@fhahn.com> | 2024-04-22 14:10:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-22 14:10:05 +0100 |
commit | fe28a0e4823f59d193a14a07d12e3f60555350e0 (patch) | |
tree | bf583ef4cbf5fd7e678cfc1a27e170883eecb0a9 /llvm/lib/Analysis/LoopAccessAnalysis.cpp | |
parent | 0accda7f17a1f85b4270edf4f0976c55de4e958c (diff) | |
download | llvm-fe28a0e4823f59d193a14a07d12e3f60555350e0.zip llvm-fe28a0e4823f59d193a14a07d12e3f60555350e0.tar.gz llvm-fe28a0e4823f59d193a14a07d12e3f60555350e0.tar.bz2 |
[LAA] Document reasoning in multiple places in isDependent (NFC). (#89381)
As suggested in https://github.com/llvm/llvm-project/pull/88039, add
extra documentation for reasoning in isDependent.
PR: https://github.com/llvm/llvm-project/pull/89381
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 3bfc970..b1ba8e7 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -2034,6 +2034,10 @@ MemoryDepChecker::Dependence::DepType MemoryDepChecker::isDependent( ScalarEvolution &SE = *PSE.getSE(); auto &DL = InnermostLoop->getHeader()->getModule()->getDataLayout(); + // If the distance between the acecsses is larger than their absolute stride + // multiplied by the backedge taken count, the accesses are independet, i.e. + // they are far enough appart that accesses won't access the same location + // across all loop ierations. if (!isa<SCEVCouldNotCompute>(Dist) && HasSameSize && isSafeDependenceDistance(DL, SE, *(PSE.getBackedgeTakenCount()), *Dist, Stride, TypeByteSize)) @@ -2049,7 +2053,8 @@ MemoryDepChecker::Dependence::DepType MemoryDepChecker::isDependent( const APInt &Val = C->getAPInt(); int64_t Distance = Val.getSExtValue(); - // Attempt to prove strided accesses independent. + // If the distance between accesses and their strides are known constants, + // check whether the accesses interlace each other. if (std::abs(Distance) > 0 && Stride > 1 && HasSameSize && areStridedAccessesIndependent(std::abs(Distance), Stride, TypeByteSize)) { LLVM_DEBUG(dbgs() << "LAA: Strided accesses are independent\n"); @@ -2059,9 +2064,13 @@ MemoryDepChecker::Dependence::DepType MemoryDepChecker::isDependent( // Negative distances are not plausible dependencies. if (Val.isNegative()) { bool IsTrueDataDependence = (AIsWrite && !BIsWrite); - // There is no need to update MaxSafeVectorWidthInBits after call to - // couldPreventStoreLoadForward, even if it changed MinDepDistBytes, - // since a forward dependency will allow vectorization using any width. + // Check if the first access writes to a location that is read in a later + // iteration, where the distance between them is not a multiple of a vector + // factor and relatively small. + // + // NOTE: There is no need to update MaxSafeVectorWidthInBits after call to + // couldPreventStoreLoadForward, even if it changed MinDepDistBytes, since a + // forward dependency will allow vectorization using any width. if (IsTrueDataDependence && EnableForwardingConflictDetection && (!HasSameSize || couldPreventStoreLoadForward(Val.abs().getZExtValue(), TypeByteSize))) { |