[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 09:56:06 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:
It just checks, if the extracts from users node will be actual extracts, not original scalars. In this case, we can vectorize the current (operand) node, because we don't need to keep it scalar. As I said, this estimation mimics similar one in the actual analysis for scalars, which should remain in the code instead of generating the extractelement instructions.
https://github.com/llvm/llvm-project/pull/149572
More information about the llvm-commits
mailing list