[llvm] e172110 - [LV] Don't calculate scalar costs for scalable VFs in setVectorizedCallDecision (#152713)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 20 07:00:35 PDT 2025
Author: David Sherwood
Date: 2025-08-20T15:00:31+01:00
New Revision: e172110d12f4db4876e65e2a09d2805a58eace2b
URL: https://github.com/llvm/llvm-project/commit/e172110d12f4db4876e65e2a09d2805a58eace2b
DIFF: https://github.com/llvm/llvm-project/commit/e172110d12f4db4876e65e2a09d2805a58eace2b.diff
LOG: [LV] Don't calculate scalar costs for scalable VFs in setVectorizedCallDecision (#152713)
In setVectorizedCallDecision we attempt to calculate the scalar costs
for vectorisation calls, even for scalable VFs where we already know the
answer is Invalid. We can avoid doing unnecessary work by skipping this
completely for scalable vectors.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index dd913f935bacf..5e7f6523cd86d 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -5832,14 +5832,22 @@ void LoopVectorizationCostModel::setVectorizedCallDecision(ElementCount VF) {
// assumed to be vectors, so we need to extract individual elements from
// there, execute VF scalar calls, and then gather the result into the
// vector return value.
- InstructionCost ScalarCallCost =
- TTI.getCallInstrCost(ScalarFunc, ScalarRetTy, ScalarTys, CostKind);
-
- // Compute costs of unpacking argument values for the scalar calls and
- // packing the return values to a vector.
- InstructionCost ScalarizationCost = getScalarizationOverhead(CI, VF);
+ if (VF.isFixed()) {
+ InstructionCost ScalarCallCost =
+ TTI.getCallInstrCost(ScalarFunc, ScalarRetTy, ScalarTys, CostKind);
+
+ // Compute costs of unpacking argument values for the scalar calls and
+ // packing the return values to a vector.
+ InstructionCost ScalarizationCost = getScalarizationOverhead(CI, VF);
+ ScalarCost = ScalarCallCost * VF.getKnownMinValue() + ScalarizationCost;
+ } else {
+ // There is no point attempting to calculate the scalar cost for a
+ // scalable VF as we know it will be Invalid.
+ assert(!getScalarizationOverhead(CI, VF).isValid() &&
+ "Unexpected valid cost for scalarizing scalable vectors");
+ ScalarCost = InstructionCost::getInvalid();
+ }
- ScalarCost = ScalarCallCost * VF.getKnownMinValue() + ScalarizationCost;
// Honor ForcedScalars and UniformAfterVectorization decisions.
// TODO: For calls, it might still be more profitable to widen. Use
// VPlan-based cost model to compare
diff erent options.
More information about the llvm-commits
mailing list