[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