[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