[llvm] 6f8a10a - [SLP] Cost using TCK_CodeSize under -Os and -Oz (#217398)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 21 17:00:16 PDT 2026


Author: Ryan Buchner
Date: 2026-08-22T00:00:10Z
New Revision: 6f8a10afa09797546f3b956cdb15c6ef57a37f2c

URL: https://github.com/llvm/llvm-project/commit/6f8a10afa09797546f3b956cdb15c6ef57a37f2c
DIFF: https://github.com/llvm/llvm-project/commit/6f8a10afa09797546f3b956cdb15c6ef57a37f2c.diff

LOG: [SLP] Cost using TCK_CodeSize under -Os and -Oz (#217398)

Refactor to centralize the cost kind decision in the SLP.

In practice there appears to be little change in the codegen as a result
of this change due to current backend costing.

Fixes #153376.

Added: 
    

Modified: 
    llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
    llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
    llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
    llvm/test/Transforms/SLPVectorizer/X86/cost-size.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index c0fabb4636214..d90c8f5fd336e 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -686,7 +686,7 @@ class slpvectorizer::BoUpSLP {
           DominatorTree *Dt, AssumptionCache *AC, DemandedBits *DB,
           const DataLayout *DL, OptimizationRemarkEmitter *ORE)
       : BatchAA(*Aa), F(Func), SE(Se), TTI(Tti), TLI(TLi), LI(Li), DT(Dt),
-        AC(AC), DB(DB), DL(DL), ORE(ORE),
+        AC(AC), DB(DB), DL(DL), ORE(ORE), CostKind(getSLPCostKind(Func)),
         Builder(Se->getContext(), TargetFolder(*DL)) {
     CodeMetrics::collectEphemeralValues(F, AC, EphValues);
     // Use the vector register size specified by the target unless overridden
@@ -5552,8 +5552,8 @@ class slpvectorizer::BoUpSLP {
   const DataLayout *DL;
   OptimizationRemarkEmitter *ORE;
   /// Cached cost-model mode for this function.
-  /// Only use RecipThroughput currently.
-  const TargetTransformInfo::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
+  /// If -Os/-Oz, use CodeSize. Otherwise use RecipThroughput.
+  const TargetTransformInfo::TargetCostKind CostKind;
 
   unsigned MaxVecRegSize; // This is set by TTI or overridden by cl::opt.
   unsigned MinVecRegSize; // Set by cl::opt (default: 128).
@@ -19788,8 +19788,9 @@ InstructionCost BoUpSLP::getTreeCost(InstructionCost TreeCost,
   // shuffles, inserts, and extracts.
   // FIXME: remove this as soon as correct fractional model is landed for all
   // targets.
-  if (SLPInstCountCheck && TTI->preferSLPInstCountCheck() &&
-      getRootNode().getVectorFactor() == 2 && SLPCostThreshold == 0 &&
+  if (CostKind != TTI::TCK_CodeSize && SLPInstCountCheck &&
+      TTI->preferSLPInstCountCheck() && getRootNode().getVectorFactor() == 2 &&
+      SLPCostThreshold == 0 &&
       (!SLPReVec ||
        !isa<VectorType>(getRootNodeScalars().front()->getType()))) {
     // Loop containing the tree root; null for flat code or disabled

diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
index e834dcbcdc0f9..af6f8032c7b0b 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.cpp
@@ -886,4 +886,9 @@ void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW,
                             /*Depth=*/0, MaxDepth, Leaves, ChainInsts);
 }
 
+TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F) {
+  assert(F && "Expected function.");
+  return F->hasOptSize() ? TTI::TCK_CodeSize : TTI::TCK_RecipThroughput;
+}
+
 } // namespace llvm::slpvectorizer

diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
index 1d55de71a6ec8..e9aeff605eb91 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer/SLPUtils.h
@@ -21,6 +21,7 @@
 #include "llvm/ADT/SmallBitVector.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Analysis/MemoryLocation.h"
+#include "llvm/Analysis/TargetTransformInfo.h"
 #include "llvm/IR/Intrinsics.h"
 
 #include <optional>
@@ -31,7 +32,6 @@ class Constant;
 class DataLayout;
 class Instruction;
 class TargetLibraryInfo;
-class TargetTransformInfo;
 class Type;
 class Value;
 } // namespace llvm
@@ -363,6 +363,8 @@ void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW,
                            SmallVectorImpl<NarrowedLeafInfo> &Leaves,
                            SmallVectorImpl<Instruction *> &ChainInsts);
 
+TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F);
+
 } // namespace llvm::slpvectorizer
 
 #endif // LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPUTILS_H

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/cost-size.ll b/llvm/test/Transforms/SLPVectorizer/X86/cost-size.ll
index 19d387f6c54de..6c0a7e29ab855 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/cost-size.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/cost-size.ll
@@ -9,8 +9,11 @@ define i16 @test_optsize(ptr %p, ptr %inc) #0 {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    [[E0:%.*]] = load i16, ptr [[P]], align 4
 ; CHECK-NEXT:    [[E1:%.*]] = load i16, ptr [[INC]], align 2
-; CHECK-NEXT:    [[TMP3:%.*]] = udiv i16 [[E0]], 13
-; CHECK-NEXT:    [[TMP4:%.*]] = udiv i16 [[E1]], 14
+; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x i16> poison, i16 [[E0]], i64 0
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i16> [[TMP0]], i16 [[E1]], i64 1
+; CHECK-NEXT:    [[TMP2:%.*]] = udiv <2 x i16> [[TMP1]], <i16 13, i16 14>
+; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x i16> [[TMP2]], i64 0
+; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i16> [[TMP2]], i64 1
 ; CHECK-NEXT:    [[A:%.*]] = add i16 [[TMP3]], [[TMP4]]
 ; CHECK-NEXT:    ret i16 [[A]]
 ;
@@ -30,8 +33,11 @@ define i16 @testc_optsize(ptr %p, ptr %inc) #1 {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    [[E0:%.*]] = load i16, ptr [[P]], align 4
 ; CHECK-NEXT:    [[E1:%.*]] = load i16, ptr [[INC]], align 2
-; CHECK-NEXT:    [[TMP3:%.*]] = udiv i16 [[E0]], 13
-; CHECK-NEXT:    [[TMP4:%.*]] = udiv i16 [[E1]], 14
+; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x i16> poison, i16 [[E0]], i64 0
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i16> [[TMP0]], i16 [[E1]], i64 1
+; CHECK-NEXT:    [[TMP2:%.*]] = udiv <2 x i16> [[TMP1]], <i16 13, i16 14>
+; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x i16> [[TMP2]], i64 0
+; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i16> [[TMP2]], i64 1
 ; CHECK-NEXT:    [[A:%.*]] = add i16 [[TMP3]], [[TMP4]]
 ; CHECK-NEXT:    ret i16 [[A]]
 ;


        


More information about the llvm-commits mailing list