[llvm-branch-commits] [llvm] [LV] Mask off possibly aliasing vector lanes (PR #100579)

Sander de Smalen via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Aug 8 09:05:16 PDT 2025


================
@@ -2030,32 +2031,68 @@ Value *llvm::addDiffRuntimeChecks(
   // Map to keep track of created compares, The key is the pair of operands for
   // the compare, to allow detecting and re-using redundant compares.
   DenseMap<std::pair<Value *, Value *>, Value *> SeenCompares;
-  for (const auto &[SrcStart, SinkStart, AccessSize, NeedsFreeze] : Checks) {
+  Value *AliasLaneMask = nullptr;
+  for (const auto &[SrcStart, SinkStart, AccessSize, NeedsFreeze,
+                    WriteAfterRead] : Checks) {
     Type *Ty = SinkStart->getType();
-    // Compute VF * IC * AccessSize.
-    auto *VFTimesICTimesSize =
-        ChkBuilder.CreateMul(GetVF(ChkBuilder, Ty->getScalarSizeInBits()),
-                             ConstantInt::get(Ty, IC * AccessSize));
-    Value *Diff =
-        Expander.expandCodeFor(SE.getMinusSCEV(SinkStart, SrcStart), Ty, Loc);
-
-    // Check if the same compare has already been created earlier. In that case,
-    // there is no need to check it again.
-    Value *IsConflict = SeenCompares.lookup({Diff, VFTimesICTimesSize});
-    if (IsConflict)
-      continue;
+    if (!VF.isScalar() && UseSafeEltsMask) {
----------------
sdesmalen-arm wrote:

Two things:
1. When I remove `!VF.isScalar() &&` all the tests pass, suggesting that there's either missing test coverage or this code also works for a VF=1.
2. `UseSafeEltsMask` is loop invariant, so my suggestion would be to separate this out into two parts: one loop for the case that `UnsafeEltsMask==false` and then return `MemoryRuntimeCheck` afterwards, and a second part for the case where `UnsafeEltsMask==true`.

https://github.com/llvm/llvm-project/pull/100579


More information about the llvm-branch-commits mailing list