[llvm] [LV] Take LoopVectorizeHints from VFSelectionContext (NFC) (PR #216737)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 19 01:50:00 PDT 2026
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/216737
>From f659006c7e2735f5dba25232ac0ad391101a3c62 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Wed, 12 Aug 2026 08:41:35 +0100
Subject: [PATCH] [LV] Take LoopVectorizeHints from VFSelectionContext in the
planner (NFC)
VFSelectionContext already holds the LoopVectorizeHints for the loop, so the
planner does not need its own reference. Add a getHints() accessor and use it
in the planner, dropping the duplicate member and constructor argument.
---
.../Vectorize/LoopVectorizationPlanner.cpp | 2 +-
.../Vectorize/LoopVectorizationPlanner.h | 9 ++---
.../Transforms/Vectorize/LoopVectorize.cpp | 34 +++++++++----------
3 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.cpp
index ff9b9171d8c8c..5f0717fbd5a03 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.cpp
@@ -701,7 +701,7 @@ bool LoopVectorizationPlanner::isMoreProfitable(const VectorizationFactor &A,
InstructionCost CostB = B.Cost;
// When there is a hint to always prefer scalable vectors, honour that hint.
- if (Hints.isScalableVectorizationAlwaysPreferred())
+ if (Config.getHints().isScalableVectorizationAlwaysPreferred())
if (A.Width.isScalable() && CostA.isValid() && !B.Width.isScalable() &&
!B.Width.isScalar())
return true;
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
index d488607a0c7dc..f57aa79201e6e 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h
@@ -740,6 +740,9 @@ class VFSelectionContext {
/// \return The loop being analyzed.
const Loop *getLoop() const { return TheLoop; }
+ /// \return The vectorization hints for the loop being analyzed.
+ const LoopVectorizeHints &getHints() const { return *Hints; }
+
/// \return True if register pressure should be considered for the given VF.
bool shouldConsiderRegPressureForVF(ElementCount VF) const;
@@ -864,8 +867,6 @@ class LoopVectorizationPlanner {
PredicatedScalarEvolution &PSE;
- const LoopVectorizeHints &Hints;
-
OptimizationRemarkEmitter *ORE;
SmallVector<VPlanPtr, 4> VPlans;
@@ -898,9 +899,9 @@ class LoopVectorizationPlanner {
const TargetTransformInfo &TTI, LoopVectorizationLegality *Legal,
LoopVectorizationCostModel &CM, VFSelectionContext &Config,
InterleavedAccessInfo &IAI, PredicatedScalarEvolution &PSE,
- const LoopVectorizeHints &Hints, OptimizationRemarkEmitter *ORE)
+ OptimizationRemarkEmitter *ORE)
: OrigLoop(L), LI(LI), DT(DT), TLI(TLI), TTI(TTI), Legal(Legal), CM(CM),
- Config(Config), IAI(IAI), PSE(PSE), Hints(Hints), ORE(ORE) {}
+ Config(Config), IAI(IAI), PSE(PSE), ORE(ORE) {}
/// Build VPlans for the specified \p UserVF and \p UserIC if they are
/// non-zero or all applicable candidate VFs otherwise. If vectorization and
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index c12a4f562f600..019174a3e0ffa 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -780,12 +780,11 @@ class LoopVectorizationCostModel {
const TargetLibraryInfo *TLI, AssumptionCache *AC,
OptimizationRemarkEmitter *ORE,
std::function<BlockFrequencyInfo &()> GetBFI,
- const Function *F, const LoopVectorizeHints *Hints,
- InterleavedAccessInfo &IAI,
+ const Function *F, InterleavedAccessInfo &IAI,
VFSelectionContext &Config)
: Config(Config), EpilogueLoweringStatus(SEL), TheLoop(L), PSE(PSE),
LI(LI), Legal(Legal), TTI(TTI), TLI(TLI), AC(AC), ORE(ORE),
- GetBFI(GetBFI), TheFunction(F), Hints(Hints), InterleaveInfo(IAI) {}
+ GetBFI(GetBFI), TheFunction(F), InterleaveInfo(IAI) {}
/// \return An upper bound for the vectorization factors (both fixed and
/// scalable). If the factors are 0, vectorization and interleaving should be
@@ -1516,9 +1515,6 @@ class LoopVectorizationCostModel {
const Function *TheFunction;
- /// Loop Vectorize Hint.
- const LoopVectorizeHints *Hints;
-
/// The interleave access information contains groups of interleaved accesses
/// with the same stride and close to each other.
InterleavedAccessInfo &InterleaveInfo;
@@ -5814,7 +5810,7 @@ LoopVectorizationPlanner::computeBestVF() {
// If there is a single VPlan with a single VF, return it directly.
VPlan &FirstPlan = *VPlans[0];
- ElementCount UserVF = Hints.getWidth();
+ ElementCount UserVF = Config.getHints().getWidth();
if (VPlans.size() == 1) {
// For outer loops, the plan has a single vector VF determined by the
// heuristic.
@@ -5853,7 +5849,8 @@ LoopVectorizationPlanner::computeBestVF() {
VectorizationFactor ScalarFactor(ScalarVF, ScalarCost, ScalarCost);
VectorizationFactor BestFactor = ScalarFactor;
- bool ForceVectorization = Hints.getForce() == LoopVectorizeHints::FK_Enabled;
+ bool ForceVectorization =
+ Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
if (ForceVectorization) {
// Ignore scalar width, because the user explicitly wants vectorization.
// Initialize cost to max so that VF = 2 is, at least, chosen during cost
@@ -6554,11 +6551,11 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan1() {
// Create recipes for header phis. For outer loops, reductions, recurrences
// and in-loop reductions are empty since legality doesn't detect them.
- if (!RUN_VPLAN_PASS(VPlanTransforms::createHeaderPhiRecipes, *VPlan0, PSE,
- *OrigLoop, VPDT, Legal->getInductionVars(),
- Legal->getReductionVars(),
- Legal->getFixedOrderRecurrences(),
- Config.getInLoopReductions(), Hints.allowReordering())) {
+ if (!RUN_VPLAN_PASS(
+ VPlanTransforms::createHeaderPhiRecipes, *VPlan0, PSE, *OrigLoop,
+ VPDT, Legal->getInductionVars(), Legal->getReductionVars(),
+ Legal->getFixedOrderRecurrences(), Config.getInLoopReductions(),
+ Config.getHints().allowReordering())) {
return nullptr;
}
@@ -6567,7 +6564,8 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan1() {
LAI->getSymbolicStrides(), VPDT);
// Add surviving induction predicates to PSE and check constraints.
- bool ForceVectorization = Hints.getForce() == LoopVectorizeHints::FK_Enabled;
+ bool ForceVectorization =
+ Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled;
bool OptForSize =
!ForceVectorization &&
(CM.EpilogueLoweringStatus == CM_EpilogueNotAllowedOptSize ||
@@ -7105,7 +7103,7 @@ void LoopVectorizationPlanner::attachRuntimeChecks(
const auto &[SCEVCheckCond, SCEVCheckBlock] = RTChecks.getSCEVChecks();
if (SCEVCheckBlock && SCEVCheckBlock->hasNPredecessors(0)) {
assert((!Config.OptForSize ||
- CM.Hints->getForce() == LoopVectorizeHints::FK_Enabled) &&
+ Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled) &&
"Cannot SCEV check stride or overflow when optimizing for size");
RUN_VPLAN_PASS(VPlanTransforms::attachCheckBlock, Plan, SCEVCheckCond,
SCEVCheckBlock, HasBranchWeights);
@@ -7119,7 +7117,7 @@ void LoopVectorizationPlanner::attachRuntimeChecks(
if (Config.OptForSize) {
assert(
- CM.Hints->getForce() == LoopVectorizeHints::FK_Enabled &&
+ Config.getHints().getForce() == LoopVectorizeHints::FK_Enabled &&
"Cannot emit memory checks when optimizing for size, unless forced "
"to vectorize.");
ORE->emit([&]() {
@@ -8063,10 +8061,10 @@ bool LoopVectorizePass::processLoop(Loop *L) {
VFSelectionContext Config(*TTI, &LVL, L, *F, PSE, DB, ORE, &Hints,
OptForSize);
LoopVectorizationCostModel CM(SEL, L, PSE, LI, &LVL, *TTI, TLI, AC, ORE,
- GetBFI, F, &Hints, IAI, Config);
+ GetBFI, F, IAI, Config);
// Use the planner for vectorization.
LoopVectorizationPlanner LVP(L, LI, DT, TLI, *TTI, &LVL, CM, Config, IAI, PSE,
- Hints, ORE);
+ ORE);
EpilogueLowering EpilogueTailLoweringStatus =
getEpilogueTailLowering(CM, L, ORE);
More information about the llvm-commits
mailing list