================ @@ -2028,41 +2029,61 @@ MemoryDepChecker::Dependence::DepType MemoryDepChecker::isDependent( if (std::holds_alternative<Dependence::DepType>(Res)) return std::get<Dependence::DepType>(Res); - const auto &[Dist, Stride, TypeByteSize, AIsWrite, BIsWrite] = + const auto &[Dist, StrideA, StrideB, TypeByteSize, AIsWrite, BIsWrite] = std::get<DepDistanceStrideAndSizeInfo>(Res); bool HasSameSize = TypeByteSize > 0; + std::optional<uint64_t> CommonStride = + StrideA == StrideB ? std::make_optional(StrideA) : std::nullopt; + if (isa<SCEVCouldNotCompute>(Dist)) { + // TODO: Relax requirement that there is a common stride to retry with + // non-constant distance dependencies. + FoundNonConstantDistanceDependence |= !!CommonStride; + LLVM_DEBUG(dbgs() << "LAA: Dependence because of uncomputable distance.\n"); + return Dependence::Unknown; + } + 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 && + if (HasSameSize && CommonStride && isSafeDependenceDistance(DL, SE, *(PSE.getBackedgeTakenCount()), *Dist, - Stride, TypeByteSize)) + *CommonStride, TypeByteSize)) return Dependence::NoDep; const SCEVConstant *C = dyn_cast<SCEVConstant>(Dist); - if (!C) { - LLVM_DEBUG(dbgs() << "LAA: Dependence because of non-constant distance\n"); - FoundNonConstantDistanceDependence = true; - return Dependence::Unknown; - } - const APInt &Val = C->getAPInt(); - int64_t Distance = Val.getSExtValue(); - - // 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"); - return Dependence::NoDep; + // Attempt to prove strided accesses independent. + if (C) { + const APInt &Val = C->getAPInt(); + int64_t Distance = Val.getSExtValue(); + // If the distance between accesses and their strides are known constants, + // check whether the accesses interlace each other. + if (std::abs(Distance) > 0 && CommonStride && *CommonStride > 1 && + HasSameSize && + areStridedAccessesIndependent(std::abs(Distance), *CommonStride, + TypeByteSize)) { + LLVM_DEBUG(dbgs() << "LAA: Strided accesses are independent\n"); + return Dependence::NoDep; + } } // Negative distances are not plausible dependencies. - if (Val.isNegative()) { + if (SE.isKnownNonPositive(Dist)) { + if (!SE.isKnownNegative(Dist)) { ---------------- Meinersbur wrote:
[serious] Not knowing something doesn't imply anything. ```suggestion // KnownNonPositive && KnownNonNegative => KnownZero if (SE.isKnownNonNegative(Dist)) { ``` https://github.com/llvm/llvm-project/pull/88039 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits