[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 Jul 29 01:53:03 PDT 2025


================
@@ -9215,31 +9243,13 @@ bool BoUpSLP::isProfitableToVectorizeWithNonVecUsers(
   if (DemandedElts.isZero())
     return true;
 
-  auto AreExtractsCheaperThanScalars = [&]() {
-    // 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;
-    SmallPtrSet<Value *, 4> CheckedExtracts;
-    InstructionCost NodeCost =
-        getEntryCost(UserTreeIdx.UserTE, {}, CheckedExtracts);
-    // The node is profitable for vectorization - success.
-    if (ExtractCost <= NodeCost)
-      return true;
-    auto *VecTy = getWidenedType(ScalarTy, VL.size());
-    InstructionCost ScalarsCost = ::getScalarizationOverhead(
-        *TTI, ScalarTy, VecTy, APInt::getAllOnes(VL.size()),
-        /*Insert=*/true, /*Extract=*/false, CostKind);
-    if (!Mask.empty())
-      ScalarsCost +=
-          getShuffleCost(*TTI, TTI::SK_PermuteSingleSrc, VecTy, Mask, CostKind);
-    return ExtractCost < UserScalarsCost + ScalarsCost;
-  };
-
   // User extracts are cheaper than user scalars + immediate scalars - success.
-  return AreExtractsCheaperThanScalars();
+  return areExtractsCheaperThanScalars(
+      *TTI, UserScalarTy, UserVecTy, DemandedElts, UserScalarsCost, ScalarTy,
+      VL.size(), Mask, [&]() {
+        SmallPtrSet<Value *, 4> CheckedExtracts;
+        return getEntryCost(UserTreeIdx.UserTE, {}, CheckedExtracts);
+      });
----------------
gbossu wrote:

Instead of creating another lambda which is here to capture this, maybe just pass this as a parameter? Or maybe just make areExtractsCheaperThanScalars part of BoUpSLP? I think at this point one more method there won't make any difference, and at least we get a couple of parameters for free because they are class members.

https://github.com/llvm/llvm-project/pull/149572


More information about the llvm-commits mailing list