[llvm] [SLP] Check for extracts, being replaced by original scalars, for user nodes (PR #149572)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 5 08:20:34 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;
----------------
alexey-bataev wrote:
If the scalarization of the user node is not required or too small (less than the difference of the vector node and original scalars), we can live with that, and we can safely vectorize the operands. This is what it checks
https://github.com/llvm/llvm-project/pull/149572
More information about the llvm-commits
mailing list