[llvm] b67d4cc - [VPlan] Move getConstantStride to vputils (NFC). (#224972)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 21 01:18:22 PDT 2026
Author: Florian Hahn
Date: 2026-09-21T09:18:14+01:00
New Revision: b67d4ccd1ecdecb5a625e41ee9035eac5ae14652
URL: https://github.com/llvm/llvm-project/commit/b67d4ccd1ecdecb5a625e41ee9035eac5ae14652
DIFF: https://github.com/llvm/llvm-project/commit/b67d4ccd1ecdecb5a625e41ee9035eac5ae14652.diff
LOG: [VPlan] Move getConstantStride to vputils (NFC). (#224972)
Move the helper from VPlanTransforms.cpp to vputils, so it can also be
used from other VPlan files.
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
llvm/lib/Transforms/Vectorize/VPlanUtils.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 3515a791292da..64099a65f5c74 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -59,22 +59,6 @@ static cl::opt<bool> UsePartialReductionsByDefault(
cl::desc("Use partial reduction intrinsics for "
"all supported unordered reductions."));
-/// If the pointer operand \p Addr of a memory access is an affine AddRec
-/// w.r.t. \p L with a constant stride, return the stride in units of
-/// \p AccessTy. Otherwise return std::nullopt.
-static std::optional<int64_t> getConstantStride(VPValue *Addr, Type *AccessTy,
- PredicatedScalarEvolution &PSE,
- const Loop *L) {
- assert(!hasIrregularType(AccessTy, L->getHeader()->getDataLayout()) &&
- "should not try to widen irregular types");
- const SCEV *AddrSCEV = vputils::getSCEVExprForVPValue(Addr, PSE, L);
- auto *AddRec = dyn_cast<SCEVAddRecExpr>(AddrSCEV);
- if (!AddRec)
- return {};
-
- return getStrideFromAddRec(AddRec, L, AccessTy, /*Ptr=*/nullptr, PSE);
-}
-
bool VPlanTransforms::tryToConvertVPInstructionsToVPRecipes(
VPlan &Plan, const TargetLibraryInfo &TLI, PredicatedScalarEvolution &PSE,
Loop *OuterLoop) {
@@ -83,7 +67,7 @@ bool VPlanTransforms::tryToConvertVPInstructionsToVPRecipes(
// consecutive vector access.
auto IsConsecutiveAccess = [&](VPValue *Addr, Type *AccessTy) {
return !hasIrregularType(AccessTy, Plan.getDataLayout()) &&
- getConstantStride(Addr, AccessTy, PSE, OuterLoop) == 1;
+ vputils::getConstantStride(Addr, AccessTy, PSE, OuterLoop) == 1;
};
ReversePostOrderTraversal<VPBlockDeepTraversalWrapper<VPBlockBase *>> RPOT(
@@ -5626,7 +5610,7 @@ void VPlanTransforms::makeMemOpWideningDecisions(VPlan &Plan, VFRange &Range,
Type *ScalarTy =
IsLoad ? VPI->getScalarType() : VPI->getOperand(0)->getScalarType();
std::optional<int64_t> Stride =
- getConstantStride(Ptr, ScalarTy, CostCtx.PSE, CostCtx.L);
+ vputils::getConstantStride(Ptr, ScalarTy, CostCtx.PSE, CostCtx.L);
if (Stride != 1 && Stride != -1)
return false;
bool Reverse = Stride == -1;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
index 5088e06f3c9b6..6b2233f606f91 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
@@ -17,6 +17,7 @@
#include "llvm/ADT/SmallVectorExtras.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/Analysis/InstSimplifyFolder.h"
+#include "llvm/Analysis/LoopAccessAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
@@ -362,6 +363,19 @@ const SCEV *vputils::getSCEVExprForVPValue(const VPValue *V,
return PSE.getPredicatedSCEV(Expr);
}
+std::optional<int64_t>
+vputils::getConstantStride(VPValue *Addr, Type *AccessTy,
+ PredicatedScalarEvolution &PSE, const Loop *L) {
+ assert(!hasIrregularType(AccessTy, L->getHeader()->getDataLayout()) &&
+ "should not try to widen irregular types");
+ const SCEV *AddrSCEV = getSCEVExprForVPValue(Addr, PSE, L);
+ auto *AddRec = dyn_cast<SCEVAddRecExpr>(AddrSCEV);
+ if (!AddRec)
+ return {};
+
+ return getStrideFromAddRec(AddRec, L, AccessTy, /*Ptr=*/nullptr, PSE);
+}
+
bool vputils::isAddressSCEVForCost(const SCEV *Addr, ScalarEvolution &SE,
const Loop *L) {
// If address is an SCEVAddExpr, we require that all operands must be either
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.h b/llvm/lib/Transforms/Vectorize/VPlanUtils.h
index 7963ff453f62a..913fab53223c9 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.h
@@ -48,6 +48,13 @@ const SCEV *getSCEVExprForVPValue(const VPValue *V,
PredicatedScalarEvolution &PSE,
const Loop *L = nullptr);
+/// If the pointer operand \p Addr of a memory access is an affine AddRec
+/// w.r.t. \p L with a constant stride, return the stride in units of
+/// \p AccessTy. Otherwise return std::nullopt.
+std::optional<int64_t> getConstantStride(VPValue *Addr, Type *AccessTy,
+ PredicatedScalarEvolution &PSE,
+ const Loop *L);
+
/// Returns true if \p Addr is an address SCEV that can be passed to
/// TTI::getAddressComputationCost, i.e. the address SCEV is loop invariant, an
/// affine AddRec (i.e. induction ), or an add expression of such operands or a
More information about the llvm-commits
mailing list