[llvm] [LAA] Document reasoning in multiple places in isDependent (NFC). (PR #89381)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 19 05:54:09 PDT 2024
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/89381
As suggested in https://github.com/llvm/llvm-project/pull/88039, add extra documentation for reasoning in isDependent.
>From 2e9a43a783290a9ea50dec7a778badb3b8d5030f Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Fri, 19 Apr 2024 13:47:42 +0100
Subject: [PATCH] [LAA] Document reasoning in multiple places in isDependent
(NFC).
As suggested in https://github.com/llvm/llvm-project/pull/88039, add
extra documentation for reasoning in isDependent.
---
llvm/lib/Analysis/LoopAccessAnalysis.cpp | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
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