[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