[llvm] [SLP] Check for extracts, being replaced by original scalars, for user nodes (PR #149572)
Gaƫtan Bossu via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 5 03:17:10 PDT 2025
================
@@ -9151,6 +9165,93 @@ getVectorCallCosts(CallInst *CI, FixedVectorType *VecTy,
return {IntrinsicCost, LibCost};
}
+/// Check if extracts are cheaper than the original scalars.
+static bool
+areExtractsCheaperThanScalars(TargetTransformInfo &TTI, Type *UserScalarTy,
+ VectorType *UserVecTy, const APInt &DemandedElts,
+ const InstructionCost UserScalarsCost,
+ Type *ScalarTy, unsigned VF, ArrayRef<int> Mask,
+ InstructionCost UserEntryCost) {
+ constexpr TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
+ // If extracts are cheaper than the original scalars - success.
+ InstructionCost ExtractCost =
+ ::getScalarizationOverhead(TTI, UserScalarTy, UserVecTy, DemandedElts,
+ /*Insert=*/false, /*Extract=*/true, CostKind);
+ if (ExtractCost <= UserScalarsCost)
+ return true;
+ // The node is profitable for vectorization - success.
+ if (ExtractCost <= UserEntryCost)
+ return true;
+ auto *VecTy = getWidenedType(ScalarTy, VF);
+ InstructionCost ScalarsCost =
+ ::getScalarizationOverhead(TTI, ScalarTy, VecTy, APInt::getAllOnes(VF),
+ /*Insert=*/true, /*Extract=*/false, CostKind);
+ if (!Mask.empty())
+ ScalarsCost +=
+ getShuffleCost(TTI, TTI::SK_PermuteSingleSrc, VecTy, Mask, CostKind);
+ return ExtractCost < UserScalarsCost + ScalarsCost;
----------------
gbossu wrote:
I think that function would be more readable if it had a single `return` statement. E.g. something like:
```
return UserExtractCost < UserScalarsCost + OperandScalarizationCost;
```
https://github.com/llvm/llvm-project/pull/149572
More information about the llvm-commits
mailing list