diff options
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))) { |