[llvm] [VPlan] Widen reverse unit-stride accesses in makeMemOpWideningDesc (NFCI) (PR #208807)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 23 01:04:40 PDT 2026


================
@@ -7425,27 +7426,39 @@ void VPlanTransforms::makeMemOpWideningDecisions(VPlan &Plan, VFRange &Range,
         VPValue *Ptr = VPI->getOperand(!IsLoad);
         Type *ScalarTy =
             IsLoad ? VPI->getScalarType() : VPI->getOperand(0)->getScalarType();
-        if (getConstantStride(Ptr, ScalarTy, CostCtx.PSE, CostCtx.L) != 1)
+        std::optional<int64_t> Stride =
+            getConstantStride(Ptr, ScalarTy, CostCtx.PSE, CostCtx.L);
+        if (Stride != 1 && Stride != -1)
           return false;
+        bool Reverse = *Stride == -1;
+
+        VPBuilder Builder(VPI);
+        VPSingleDefRecipe *VectorPtr = Builder.createConsecutiveVectorPointer(
+            Ptr, ScalarTy, Reverse, VPI->getDebugLoc());
+
+        if (IsLoad) {
+          auto *LoadR = new VPWidenLoadRecipe(*cast<LoadInst>(I), VectorPtr,
+                                              /*Mask=*/nullptr,
+                                              /*Consecutive=*/true, *VPI,
+                                              VPI->getDebugLoc());
+          if (!Reverse)
+            return ReplaceWith(VPI, LoadR);
+          // Reverse the loaded values back into program order.
+          Builder.insert(LoadR);
+          auto *ReverseR = new VPInstruction(VPInstruction::Reverse, {LoadR},
+                                             {}, {}, VPI->getDebugLoc());
+          return ReplaceWith(VPI, ReverseR);
----------------
fhahn wrote:

Everything should use the builder now that support for creating wide load/stores landed, thanks

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


More information about the llvm-commits mailing list