aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopAccessAnalysis.cpp
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@outlook.com>2025-03-31 07:28:44 -0400
committerGitHub <noreply@github.com>2025-03-31 07:28:44 -0400
commit78777a204ad9a3f17f04f90040f88855f47aa50f (patch)
tree03827258c0db9ab33cf9baadd01df76437dfdabc /llvm/lib/Analysis/LoopAccessAnalysis.cpp
parentf82283a84ed897f06a1aaac028accbad0d5057c7 (diff)
downloadllvm-78777a204ad9a3f17f04f90040f88855f47aa50f.zip
llvm-78777a204ad9a3f17f04f90040f88855f47aa50f.tar.gz
llvm-78777a204ad9a3f17f04f90040f88855f47aa50f.tar.bz2
[LV]Split store-load forward distance analysis from other checks, NFC (#121156)
The patch splits the store-load forwarding distance analysis from other dependency analysis in LAA. Currently it supports only power-of-2 distances, required to support non-power-of-2 distances in future. Part of #100755
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/LoopAccessAnalysis.cpp47
1 files changed, 25 insertions, 22 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 7f1b5dc..dd7b796 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -1740,7 +1740,8 @@ bool MemoryDepChecker::Dependence::isForward() const {
}
bool MemoryDepChecker::couldPreventStoreLoadForward(uint64_t Distance,
- uint64_t TypeByteSize) {
+ uint64_t TypeByteSize,
+ unsigned CommonStride) {
// If loads occur at a distance that is not a multiple of a feasible vector
// factor store-load forwarding does not take place.
// Positive dependences might cause troubles because vectorizing them might
@@ -1755,31 +1756,38 @@ bool MemoryDepChecker::couldPreventStoreLoadForward(uint64_t Distance,
// cause any slowdowns.
const uint64_t NumItersForStoreLoadThroughMemory = 8 * TypeByteSize;
// Maximum vector factor.
- uint64_t MaxVFWithoutSLForwardIssues = std::min(
- VectorizerParams::MaxVectorWidth * TypeByteSize, MinDepDistBytes);
+ uint64_t MaxVFWithoutSLForwardIssuesPowerOf2 =
+ std::min(VectorizerParams::MaxVectorWidth * TypeByteSize,
+ MaxStoreLoadForwardSafeDistanceInBits);
// Compute the smallest VF at which the store and load would be misaligned.
- for (uint64_t VF = 2 * TypeByteSize; VF <= MaxVFWithoutSLForwardIssues;
- VF *= 2) {
+ for (uint64_t VF = 2 * TypeByteSize;
+ VF <= MaxVFWithoutSLForwardIssuesPowerOf2; VF *= 2) {
// If the number of vector iteration between the store and the load are
// small we could incur conflicts.
if (Distance % VF && Distance / VF < NumItersForStoreLoadThroughMemory) {
- MaxVFWithoutSLForwardIssues = (VF >> 1);
+ MaxVFWithoutSLForwardIssuesPowerOf2 = (VF >> 1);
break;
}
}
- if (MaxVFWithoutSLForwardIssues < 2 * TypeByteSize) {
+ if (MaxVFWithoutSLForwardIssuesPowerOf2 < 2 * TypeByteSize) {
LLVM_DEBUG(
dbgs() << "LAA: Distance " << Distance
<< " that could cause a store-load forwarding conflict\n");
return true;
}
- if (MaxVFWithoutSLForwardIssues < MinDepDistBytes &&
- MaxVFWithoutSLForwardIssues !=
- VectorizerParams::MaxVectorWidth * TypeByteSize)
- MinDepDistBytes = MaxVFWithoutSLForwardIssues;
+ if (CommonStride &&
+ MaxVFWithoutSLForwardIssuesPowerOf2 <
+ MaxStoreLoadForwardSafeDistanceInBits &&
+ MaxVFWithoutSLForwardIssuesPowerOf2 !=
+ VectorizerParams::MaxVectorWidth * TypeByteSize) {
+ uint64_t MaxVF = MaxVFWithoutSLForwardIssuesPowerOf2 / CommonStride;
+ uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;
+ MaxStoreLoadForwardSafeDistanceInBits =
+ std::min(MaxStoreLoadForwardSafeDistanceInBits, MaxVFInBits);
+ }
return false;
}
@@ -2227,20 +2235,10 @@ MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
std::min(static_cast<uint64_t>(MinDistance), MinDepDistBytes);
bool IsTrueDataDependence = (!AIsWrite && BIsWrite);
- uint64_t MinDepDistBytesOld = MinDepDistBytes;
if (IsTrueDataDependence && EnableForwardingConflictDetection && ConstDist &&
- couldPreventStoreLoadForward(MinDistance, TypeByteSize)) {
- // Sanity check that we didn't update MinDepDistBytes when calling
- // couldPreventStoreLoadForward
- assert(MinDepDistBytes == MinDepDistBytesOld &&
- "An update to MinDepDistBytes requires an update to "
- "MaxSafeVectorWidthInBits");
- (void)MinDepDistBytesOld;
+ couldPreventStoreLoadForward(MinDistance, TypeByteSize, *CommonStride))
return Dependence::BackwardVectorizableButPreventsForwarding;
- }
- // An update to MinDepDistBytes requires an update to MaxSafeVectorWidthInBits
- // since there is a backwards dependency.
uint64_t MaxVF = MinDepDistBytes / *CommonStride;
LLVM_DEBUG(dbgs() << "LAA: Positive min distance " << MinDistance
<< " with max VF = " << MaxVF << '\n');
@@ -3005,6 +3003,11 @@ void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const {
if (!DC.isSafeForAnyVectorWidth())
OS << " with a maximum safe vector width of "
<< DC.getMaxSafeVectorWidthInBits() << " bits";
+ if (!DC.isSafeForAnyStoreLoadForwardDistances()) {
+ uint64_t SLDist = DC.getStoreLoadForwardSafeDistanceInBits();
+ OS << ", with a maximum safe store-load forward width of " << SLDist
+ << " bits";
+ }
if (PtrRtChecking->Need)
OS << " with run-time checks";
OS << "\n";