[llvm] LAA: generalize strides over unequal type sizes (PR #108088)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 23 05:10:27 PDT 2024
================
@@ -1970,31 +1967,51 @@ MemoryDepChecker::getDependenceDistanceStrideAndSize(
return MemoryDepChecker::Dependence::IndirectUnsafe;
}
- int64_t StrideAPtrInt = *StrideAPtr;
- int64_t StrideBPtrInt = *StrideBPtr;
- LLVM_DEBUG(dbgs() << "LAA: Src induction step: " << StrideAPtrInt
- << " Sink induction step: " << StrideBPtrInt << "\n");
+ LLVM_DEBUG(dbgs() << "LAA: Src induction step: " << *StrideAPtr
+ << " Sink induction step: " << *StrideBPtr << "\n");
+
+ // Note that store size is different from alloc size, which is depedent on
+ // store size. We use the former for checking illegal cases, and the latter
+ // for scaling strides.
+ TypeSize AStoreSz = DL.getTypeStoreSizeInBits(ATy),
+ BStoreSz = DL.getTypeStoreSizeInBits(BTy);
+
+ // When the distance is zero, we're reading/writing the same memory location:
+ // check that the store sizes are equal. Otherwise, fail with an unknown
+ // dependence for which we should not generate runtime checks.
+ if (Dist->isZero() && AStoreSz != BStoreSz)
+ return MemoryDepChecker::Dependence::Unknown;
+
+ // We can't get get a uint64_t for the AllocSize if either of the store sizes
+ // are scalable.
+ if (AStoreSz.isScalable() || BStoreSz.isScalable())
+ return MemoryDepChecker::Dependence::Unknown;
+
+ // The TypeByteSize is used to scale Distance and VF. In these contexts, the
+ // only size that matters is the size of the Sink.
+ uint64_t ASz = DL.getTypeAllocSize(ATy),
+ TypeByteSize = DL.getTypeAllocSize(BTy);
----------------
arsenm wrote:
It's not an implementation detail, the alignment padding is the concept it is expressing. It's more confusing to treat them like they are two different abstract values
https://github.com/llvm/llvm-project/pull/108088
More information about the llvm-commits
mailing list