[llvm] [VPlan] Move consecutive vector pointer construction to VPBuilder (NFC). (PR #207563)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 01:03:29 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/207563
Introduce VPBuilder::createConsecutiveVectorPointer to create vector pointers for consecutive accesses. This enables re-use in follow-up changes.
>From 334bb0020f0a8649e26ab4ac70ea8a596e9ba666 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sun, 5 Jul 2026 08:26:46 +0100
Subject: [PATCH] [VPlan] Move consecutive vector pointer construction to
VPBuilder (NFC).
Introduce VPBuilder::createConsecutiveVectorPointer to create vector
pointers for consecutive accesses. This enables re-use in follow-up
changes.
---
.../Vectorize/LoopVectorizationPlanner.h | 7 ++++++
.../Transforms/Vectorize/LoopVectorize.cpp | 25 +++----------------
llvm/lib/Transforms/Vectorize/VPlan.cpp | 21 ++++++++++++++++
3 files changed, 31 insertions(+), 22 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
index 4086f8cd04ac2..8daed8305af61 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
@@ -511,6 +511,13 @@ class VPBuilder {
new VPVectorPointerRecipe(Ptr, SourceElementTy, Stride, GEPFlags, DL));
}
+ /// Create a vector pointer recipe for a consecutive memory access to \p Ptr
+ /// with element type \p SourceElementTy.
+ VPSingleDefRecipe *createConsecutiveVectorPointer(VPValue *Ptr,
+ Type *SourceElementTy,
+ bool Reverse, bool FoldTail,
+ DebugLoc DL);
+
VPWidenMemIntrinsicRecipe *createWidenMemIntrinsic(
Intrinsic::ID VectorIntrinsicID, ArrayRef<VPValue *> CallArguments,
Type *Ty, Align Alignment, const VPIRMetadata &MD, DebugLoc DL) {
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 21507fe40c7f1..6bb68d1f7bb19 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -6189,29 +6189,10 @@ VPRecipeBase *VPRecipeBuilder::tryToWidenMemory(VPInstruction *VPI,
VPValue *Ptr = VPI->getOpcode() == Instruction::Load ? VPI->getOperand(0)
: VPI->getOperand(1);
if (Consecutive) {
- GEPNoWrapFlags Flags = vputils::getGEPFlagsForPtr(Ptr);
- VPSingleDefRecipe *VectorPtr;
- if (Reverse) {
- // When folding the tail, we may compute an address that we don't in the
- // original scalar loop: drop the GEP no-wrap flags in this case.
- // Otherwise preserve existing flags without no-unsigned-wrap, as we will
- // emit negative indices.
- GEPNoWrapFlags ReverseFlags = CM.foldTailByMasking()
- ? GEPNoWrapFlags::none()
- : Flags.withoutNoUnsignedWrap();
- VectorPtr = new VPVectorEndPointerRecipe(
- Ptr, &Plan.getVF(), getLoadStoreType(I),
- /*Stride*/ -1, ReverseFlags, VPI->getDebugLoc());
- } else {
- const DataLayout &DL = I->getDataLayout();
- auto *StrideTy = DL.getIndexType(Ptr->getUnderlyingValue()->getType());
- VPValue *StrideOne = Plan.getConstantInt(StrideTy, 1);
- VectorPtr = new VPVectorPointerRecipe(Ptr, getLoadStoreType(I), StrideOne,
- Flags, VPI->getDebugLoc());
- }
Builder.setInsertPoint(VPI);
- Builder.insert(VectorPtr);
- Ptr = VectorPtr;
+ Ptr = Builder.createConsecutiveVectorPointer(
+ Ptr, getLoadStoreType(I), Reverse, CM.foldTailByMasking(),
+ VPI->getDebugLoc());
}
if (Reverse && Mask)
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 1e55f2834ef8c..292e3e85da9d5 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -1657,6 +1657,27 @@ bool LoopVectorizationPlanner::getDecisionAndClampRange(
return PredicateAtRangeStart;
}
+VPSingleDefRecipe *
+VPBuilder::createConsecutiveVectorPointer(VPValue *Ptr, Type *SourceElementTy,
+ bool Reverse, bool FoldTail,
+ DebugLoc DL) {
+ VPlan &Plan = getPlan();
+ GEPNoWrapFlags Flags = vputils::getGEPFlagsForPtr(Ptr);
+ if (Reverse) {
+ // When folding the tail, we may compute an address that we don't in the
+ // original scalar loop: drop the GEP no-wrap flags in this case. Otherwise
+ // preserve existing flags without no-unsigned-wrap, as we will emit
+ // negative indices.
+ GEPNoWrapFlags ReverseFlags =
+ FoldTail ? GEPNoWrapFlags::none() : Flags.withoutNoUnsignedWrap();
+ return tryInsertInstruction(new VPVectorEndPointerRecipe(
+ Ptr, &Plan.getVF(), SourceElementTy, /*Stride=*/-1, ReverseFlags, DL));
+ }
+ Type *StrideTy = Plan.getDataLayout().getIndexType(Ptr->getScalarType());
+ VPValue *StrideOne = Plan.getConstantInt(StrideTy, 1);
+ return createVectorPointer(Ptr, SourceElementTy, StrideOne, Flags, DL);
+}
+
VPlan &LoopVectorizationPlanner::getPlanFor(ElementCount VF) const {
assert(count_if(VPlans,
[VF](const VPlanPtr &Plan) { return Plan->hasVF(VF); }) ==
More information about the llvm-commits
mailing list