[llvm] [LV] Simplify VPCostContext ctor by using VFSelectionContext (NFC). (PR #211765)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 24 03:38:58 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/211765
VFSelectionContext provides most fields needed. Pass it directly and access its fields.
>From b67dd2541a5239518dbb45d24e12a25b322e788b Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Fri, 24 Jul 2026 10:19:06 +0100
Subject: [PATCH] [LV] Simplify VPCostContext ctor by using VFSelectionContext
(NFC).
VFSelectionContext provides most fields needed. Pass it directly and
access its fields.
---
.../Vectorize/LoopVectorizationPlanner.h | 7 +++++++
.../Transforms/Vectorize/LoopVectorize.cpp | 20 ++++++++++---------
llvm/lib/Transforms/Vectorize/VPlanHelpers.h | 9 +++------
3 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
index 2a88d424b449b..9a06f36584ed0 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
@@ -752,6 +752,13 @@ class VFSelectionContext {
/// \return The vscale value used for tuning the cost model.
std::optional<unsigned> getVScaleForTuning() const { return VScaleForTuning; }
+ const TargetTransformInfo &getTTI() const { return TTI; }
+
+ PredicatedScalarEvolution &getPSE() const { return PSE; }
+
+ /// \return The loop being analyzed.
+ const Loop *getLoop() const { return TheLoop; }
+
/// \return True if register pressure should be considered for the given VF.
bool shouldConsiderRegPressureForVF(ElementCount VF) const;
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index efae9c2bc82f6..d67ada14e0919 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -3153,8 +3153,7 @@ void LoopVectorizationPlanner::emitInvalidCostRemarks(
if (VF.isScalar())
continue;
- VPCostContext CostCtx(CM.TTI, *CM.TLI, *Plan, CM, Config.CostKind, CM.PSE,
- OrigLoop);
+ VPCostContext CostCtx(*TLI, *Plan, CM, Config);
precomputeCosts(*Plan, VF, CostCtx);
auto Iter = vp_depth_first_deep(Plan->getVectorLoopRegion()->getEntry());
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(Iter)) {
@@ -5587,6 +5586,12 @@ void LoopVectorizationPlanner::plan(ElementCount UserVF, unsigned UserIC) {
LLVM_DEBUG(printPlans(dbgs()));
}
+VPCostContext::VPCostContext(const TargetLibraryInfo &TLI, const VPlan &Plan,
+ LoopVectorizationCostModel &CM,
+ VFSelectionContext &Config)
+ : TTI(Config.getTTI()), TLI(TLI), LLVMCtx(Plan.getContext()), CM(CM),
+ CostKind(Config.CostKind), PSE(Config.getPSE()), L(Config.getLoop()) {}
+
InstructionCost VPCostContext::getLegacyCost(Instruction *UI,
ElementCount VF) const {
InstructionCost Cost = CM.getInstructionCost(UI, VF);
@@ -5745,8 +5750,7 @@ LoopVectorizationPlanner::precomputeCosts(VPlan &Plan, ElementCount VF,
InstructionCost LoopVectorizationPlanner::cost(VPlan &Plan, ElementCount VF,
VPRegisterUsage *RU) const {
- VPCostContext CostCtx(CM.TTI, *CM.TLI, Plan, CM, Config.CostKind, PSE,
- OrigLoop);
+ VPCostContext CostCtx(*TLI, Plan, CM, Config);
InstructionCost Cost = precomputeCosts(Plan, VF, CostCtx);
// Now compute and add the VPlan-based cost.
@@ -5754,7 +5758,7 @@ InstructionCost LoopVectorizationPlanner::cost(VPlan &Plan, ElementCount VF,
// Add the cost of spills due to excess register usage
if (RU && Config.shouldConsiderRegPressureForVF(VF))
- Cost += RU->spillCost(CM.TTI, Config.CostKind, ForceTargetNumVectorRegs);
+ Cost += RU->spillCost(TTI, Config.CostKind, ForceTargetNumVectorRegs);
#ifndef NDEBUG
unsigned EstimatedWidth =
@@ -6719,8 +6723,7 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan(VPlanPtr Plan,
RUN_VPLAN_PASS(VPlanTransforms::createInLoopReductionRecipes, *Plan,
Range.Start);
- VPCostContext CostCtx(CM.TTI, *CM.TLI, *Plan, CM, Config.CostKind, CM.PSE,
- OrigLoop);
+ VPCostContext CostCtx(*TLI, *Plan, CM, Config);
RUN_VPLAN_PASS(VPlanTransforms::makeMemOpWideningDecisions, *Plan, Range,
RecipeBuilder, CostCtx);
@@ -8096,8 +8099,7 @@ bool LoopVectorizePass::processLoop(Loop *L) {
// Check if it is profitable to vectorize with runtime checks.
bool ForceVectorization =
Hints.getForce() == LoopVectorizeHints::FK_Enabled;
- VPCostContext CostCtx(CM.TTI, *CM.TLI, *BestPlanPtr, CM, Config.CostKind,
- CM.PSE, L);
+ VPCostContext CostCtx(*TLI, *BestPlanPtr, CM, Config);
if (!ForceVectorization &&
!isOutsideLoopWorkProfitable(Checks, VF, L, PSE, CostCtx, *BestPlanPtr,
SEL, Config.getVScaleForTuning())) {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanHelpers.h b/llvm/lib/Transforms/Vectorize/VPlanHelpers.h
index 5ea0208e416ed..aa7750a27273d 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanHelpers.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanHelpers.h
@@ -37,6 +37,7 @@ class IRBuilderBase;
class LoopInfo;
class SCEV;
class Type;
+class VFSelectionContext;
class VPBasicBlock;
class VPRegionBlock;
class VPlan;
@@ -332,12 +333,8 @@ struct VPCostContext {
/// Number of predicated stores in the VPlan, computed on demand.
std::optional<unsigned> NumPredStores;
- VPCostContext(const TargetTransformInfo &TTI, const TargetLibraryInfo &TLI,
- const VPlan &Plan, LoopVectorizationCostModel &CM,
- TargetTransformInfo::TargetCostKind CostKind,
- PredicatedScalarEvolution &PSE, const Loop *L)
- : TTI(TTI), TLI(TLI), LLVMCtx(Plan.getContext()), CM(CM),
- CostKind(CostKind), PSE(PSE), L(L) {}
+ VPCostContext(const TargetLibraryInfo &TLI, const VPlan &Plan,
+ LoopVectorizationCostModel &CM, VFSelectionContext &Config);
/// Return the cost for \p UI with \p VF using the legacy cost model as
/// fallback until computing the cost of all recipes migrates to VPlan.
More information about the llvm-commits
mailing list