[llvm] LAA: generalize strides over unequal type sizes (PR #108088)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 23 02:23:35 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);
----------------
artagnon wrote:
I'm not sure about this, as I think it would be preferable to not expose the implementation detail of `getTypeAllocSize`, which currently uses `alignTo`.
https://github.com/llvm/llvm-project/pull/108088
More information about the llvm-commits
mailing list