[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 16 12:48:47 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);
+        }
 
-        Type *StrideTy =
-            Plan.getDataLayout().getIndexType(Ptr->getScalarType());
-        VPValue *StrideOne = Plan.getConstantInt(StrideTy, 1);
-        auto *VectorPtr = new VPVectorPointerRecipe(
-            Ptr, ScalarTy, StrideOne, vputils::getGEPFlagsForPtr(Ptr),
-            VPI->getDebugLoc());
-        VectorPtr->insertBefore(VPI);
-        VPRecipeBase *WidenedR;
-        if (IsLoad)
-          WidenedR = new VPWidenLoadRecipe(*cast<LoadInst>(I), VectorPtr,
-                                           /*Mask=*/nullptr,
-                                           /*Consecutive=*/true, *VPI,
+        VPValue *StoredVal = VPI->getOperand(0);
+        if (Reverse)
+          // Reverse the stored values so they are written in descending order.
+          StoredVal = Builder.createNaryOp(VPInstruction::Reverse, {StoredVal},
----------------
fhahn wrote:

done thanks

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


More information about the llvm-commits mailing list