[llvm] fe28a0e - [LAA] Document reasoning in multiple places in isDependent (NFC). (#89381)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 22 06:10:09 PDT 2024
Author: Florian Hahn
Date: 2024-04-22T14:10:05+01:00
New Revision: fe28a0e4823f59d193a14a07d12e3f60555350e0
URL: https://github.com/llvm/llvm-project/commit/fe28a0e4823f59d193a14a07d12e3f60555350e0
DIFF: https://github.com/llvm/llvm-project/commit/fe28a0e4823f59d193a14a07d12e3f60555350e0.diff
LOG: [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
Added:
Modified:
llvm/lib/Analysis/LoopAccessAnalysis.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 3bfc9700a14559..b1ba8e7c0f6014 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))) {
More information about the llvm-commits
mailing list