[llvm] [LAA] Document reasoning in multiple places in isDependent (NFC). (PR #89381)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 19 05:54:41 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Florian Hahn (fhahn)
<details>
<summary>Changes</summary>
As suggested in https://github.com/llvm/llvm-project/pull/88039, add extra documentation for reasoning in isDependent.
---
Full diff: https://github.com/llvm/llvm-project/pull/89381.diff
1 Files Affected:
- (modified) llvm/lib/Analysis/LoopAccessAnalysis.cpp (+13-4)
``````````diff
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))) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/89381
More information about the llvm-commits
mailing list