[llvm] [VPlan] Lower safe uniform load to unconditional scalar load (Alt. approach) (PR #217564)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 20 04:26:38 PDT 2026


================
@@ -5852,3 +5822,36 @@ void VPlanTransforms::convertToStridedAccesses(VPlan &Plan,
     }
   }
 }
+
+void VPlanTransforms::lowerSafeUniformLoads(VPlan &Plan,
+                                            const TargetLibraryInfo &TLI) {
+  for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
+           vp_depth_first_deep(Plan.getEntry()))) {
+    for (VPRecipeBase &R : make_early_inc_range(*VPBB)) {
+
+      auto *UniformGather = dyn_cast<VPWidenLoadRecipe>(&R);
+      if (!UniformGather ||
+          !vputils::isUniformAcrossVFsAndUFs(UniformGather->getAddr()))
+        continue;
+
+      auto &LI = cast<LoadInst>(UniformGather->getIngredient());
+      VPValue *Addr = UniformGather->getAddr();
+      Value *Underlying = Addr->getUnderlyingValue();
+      if (!Underlying ||
+          !isSafeToLoadUnconditionally(Underlying, LI.getType(), LI.getAlign(),
+                                       Plan.getDataLayout(), &LI,
+                                       /*AC=*/nullptr, /*DT=*/nullptr, &TLI))
----------------
artagnon wrote:

I think the relevant check is:

```cpp
  if (isDereferenceableAndAlignedPointer(
          V, Alignment, Size, SimplifyQuery(DL, TLI, DT, AC, ScanFrom))) {
    // With sanitizers `Dereferenceable` is not always enough for unconditional
    // load.
    if (!ScanFrom || !suppressSpeculativeLoadForSanitizers(*ScanFrom))
      return true;
  }
```

which can also be used for scatters? Are we testing the rest of isSafeToLoadUnconditionally?

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


More information about the llvm-commits mailing list