LLVM 24.0.0git
SLPCostAnalysis.h
Go to the documentation of this file.
1//===- SLPCostAnalysis.h - SLP Vectorizer free cost helpers ----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Internal header used by SLPVectorizer.cpp. It declares free cost helpers
10// that do not depend on BoUpSLP or any other SLP-private type. The bulk of
11// the SLP cost model still lives in SLPVectorizer.cpp because it references
12// BoUpSLP internals.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPCOSTANALYSIS_H
17#define LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPCOSTANALYSIS_H
18
19#include "SLPUtils.h"
20#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/DenseMap.h"
24
25#include <tuple>
26#include <utility>
27
28namespace llvm {
29class APInt;
30class FastMathFlags;
31class FixedVectorType;
32class Instruction;
34class Type;
35class User;
36class Value;
37class VectorType;
38enum class RecurKind;
39} // namespace llvm
40
41namespace llvm::slpvectorizer {
42
43/// Returns the cost of the shuffle instructions with the given \p Kind, vector
44/// type \p Tp and optional \p Mask. Adds SLP-specific cost estimation for
45/// insert subvector pattern.
47getShuffleCost(const TargetTransformInfo &TTI,
48 TargetTransformInfo::ShuffleKind Kind, VectorType *Tp,
50 ArrayRef<int> Mask = {}, int Index = 0,
51 VectorType *SubTp = nullptr, ArrayRef<const Value *> Args = {},
53 TargetTransformInfo::VectorInstrContext::None);
54
55/// Calculate the scalar and the vector costs from vectorizing set of GEPs.
56std::pair<InstructionCost, InstructionCost>
57getGEPCosts(const TargetTransformInfo &TTI, ArrayRef<Value *> Ptrs,
58 Value *BasePtr, unsigned Opcode,
60 VectorType *VecTy);
61
62/// Returns the cost of a BlendedLoadVectorize node loading \p VecTy: two masked
63/// loads (one per candidate base), a xor to negate the false-lane mask and a
64/// select. The blend mask is a separate operand node, so its cost is counted
65/// there, not here.
67getBlendedLoadCost(const TargetTransformInfo &TTI, Type *VecTy, Align Alignment,
68 unsigned AddressSpace,
70
71/// For a non-power-of-2 \p NumElts-wide integer div/rem \p Opcode, checks if
72/// padding to a full register and using the masked div/rem intrinsic is
73/// cheaper than the direct vector op. Returns the cost of the masked
74/// alternative, or an invalid cost if it is not applicable or not cheaper.
76getMaskedDivRemCost(const TargetTransformInfo &TTI, bool ReVec, unsigned Opcode,
77 Type *ScalarTy, unsigned NumElts,
79 FixedVectorType **PaddedTy = nullptr);
80
81/// Returns the cost of the booleanized logical and/or reduction of a vector
82/// of type \p VecTy with the i1 root \p Root, emitted as the wide reduction
83/// plus the result trunc.
85getBoolReduxWideRdxCost(const TargetTransformInfo &TTI, RecurKind RdxKind,
86 FixedVectorType *VecTy, const Value *Root,
87 FastMathFlags FMF,
89
90/// Returns the cost of the booleanized logical and/or reduction of a vector
91/// of type \p VecTy with the i1 root \p Root, emitted as trunc+bitcast+cmp,
92/// estimated in the context of the replaced cast chain \p ChainInsts.
94getBoolReduxBitcastCmpCost(const TargetTransformInfo &TTI, RecurKind RdxKind,
95 FixedVectorType *VecTy, const Value *Root,
96 ArrayRef<Instruction *> ChainInsts,
98
99/// Returns the cost of the boolean bitmask reduction of a vector of boolean
100/// leaves of type \p NarrowScalarTy, emitted as [and] + [lane permutation
101/// \p PermMask] + zero test + bitcast [+ zext] to \p WideTy. \p Root is the
102/// reduction root, used as the context of the emitted instructions.
104getBoolBitmaskCost(const TargetTransformInfo &TTI, bool NeedMask,
105 Type *NarrowScalarTy, Type *WideTy, unsigned VF,
106 ArrayRef<int> PermMask, const Value *Root,
108
109/// Returns the cost of the per-lane operations on the narrowed leaves
110/// \p NarrowedLeafShifts: the shl in the wide vector type if any leaf is
111/// shifted and the and in the narrow vector type if any leaf is masked.
113 const TargetTransformInfo &TTI,
114 const SmallDenseMap<Value *, NarrowedLeafInfo> &NarrowedLeafShifts,
115 VectorType *NarrowVecTy, VectorType *WideVecTy, const Instruction *CtxI,
117
118/// This is similar to TargetTransformInfo::getScalarizationOverhead, but if
119/// ScalarTy is a FixedVectorType, a vector will be inserted or extracted
120/// instead of a scalar.
122getScalarizationOverhead(const TargetTransformInfo &TTI, bool ReVec,
123 Type *ScalarTy, VectorType *Ty,
124 const APInt &DemandedElts, bool Insert, bool Extract,
126 bool ForPoisonSrc = true, ArrayRef<Value *> VL = {},
128 TargetTransformInfo::VectorInstrContext::None);
129
130/// This is similar to TargetTransformInfo::getVectorInstrCost, but if ScalarTy
131/// is a FixedVectorType, a vector will be extracted instead of a scalar.
133getVectorInstrCost(const TargetTransformInfo &TTI, bool ReVec, Type *ScalarTy,
134 unsigned Opcode, Type *Val,
136 unsigned Index, Value *Scalar,
137 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
139
140/// This is similar to TargetTransformInfo::getExtractWithExtendCost, but if Dst
141/// is a FixedVectorType, a vector will be extracted instead of a scalar.
143getExtractWithExtendCost(const TargetTransformInfo &TTI, bool ReVec,
144 unsigned Opcode, Type *Dst, VectorType *VecTy,
145 unsigned Index,
147
148/// Returns the cost of the bitfield packing of \p SrcTy into \p ResultTy,
149/// picking the cheapest shift width. The packing is a trunc, an lshr, a byte
150/// shuffle and a bitcast. \p ZExtSrcWidth is the source width of the lanes if
151/// they are a plain zext (0 otherwise), so compacting them back to it is free.
152/// \p CCH is the context of the pack's source operand.
153InstructionCost getBitPackCost(const TargetTransformInfo &TTI,
154 FixedVectorType *SrcTy, Type *ResultTy,
155 const BitPackInfo &Info, unsigned ZExtSrcWidth,
158 const TargetLibraryInfo *TLI,
159 const Instruction *CtxI, unsigned &ShiftWidth);
160
161/// i1 reductions can be emitted as the plain target reduction or in the
162/// bitcast-based form (bitcast to a scalar integer type plus a compare for
163/// and/or, plus ctpop for add). Returns the cost of the cheaper form and
164/// whether it is the bitcast-based one. Ties keep the historically default
165/// form: plain for and/or, bitcast-based for add.
166std::pair<InstructionCost, bool>
167getI1ReductionCost(RecurKind Kind, const TargetTransformInfo &TTI,
168 FixedVectorType *VectorTy, Type *ScalarTy,
171
172} // namespace llvm::slpvectorizer
173
174#endif // LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPCOSTANALYSIS_H
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
This file defines the DenseMap class.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
This pass exposes codegen information to IR-level passes.
Class for arbitrary precision integers.
Definition APInt.h:78
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
Class to represent fixed width SIMD vectors.
Provides information about what library functions are available for the current target.
TargetCostKind
The kind of cost model.
llvm::VectorInstrContext VectorInstrContext
ShuffleKind
The various kinds of shuffle patterns for vector queries.
CastContextHint
Represents a hint about the context in which a cast is used.
@ None
The cast is not used with a load/store of any kind.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
A private "module" namespace for types and utilities used by this pass.
std::pair< InstructionCost, bool > getI1ReductionCost(RecurKind Kind, const TargetTransformInfo &TTI, FixedVectorType *VectorTy, Type *ScalarTy, TTI::CastContextHint Ctx, TTI::TargetCostKind CostKind)
i1 reductions can be emitted as the plain target reduction or in the bitcast-based form (bitcast to a...
InstructionCost getShuffleCost(const TargetTransformInfo &TTI, TTI::ShuffleKind Kind, VectorType *Tp, const TTI::TargetCostKind CostKind, ArrayRef< int > Mask, int Index, VectorType *SubTp, ArrayRef< const Value * > Args, TTI::VectorInstrContext VIC)
Returns the cost of the shuffle instructions with the given Kind, vector type Tp and optional Mask.
InstructionCost getNarrowedLeafOpsCost(const TargetTransformInfo &TTI, const SmallDenseMap< Value *, NarrowedLeafInfo > &NarrowedLeafShifts, VectorType *NarrowVecTy, VectorType *WideVecTy, const Instruction *CtxI, const TTI::TargetCostKind CostKind)
Returns the cost of the per-lane operations on the narrowed leaves NarrowedLeafShifts: the shl in the...
InstructionCost getBoolReduxBitcastCmpCost(const TargetTransformInfo &TTI, RecurKind RdxKind, FixedVectorType *VecTy, const Value *Root, ArrayRef< Instruction * > ChainInsts, const TTI::TargetCostKind CostKind)
Returns the cost of the booleanized logical and/or reduction of a vector of type VecTy with the i1 ro...
std::pair< InstructionCost, InstructionCost > getGEPCosts(const TargetTransformInfo &TTI, ArrayRef< Value * > Ptrs, Value *BasePtr, unsigned Opcode, const TTI::TargetCostKind CostKind, Type *ScalarTy, VectorType *VecTy)
Calculate the scalar and the vector costs from vectorizing set of GEPs.
InstructionCost getBlendedLoadCost(const TargetTransformInfo &TTI, Type *VecTy, Align Alignment, unsigned AddressSpace, const TTI::TargetCostKind CostKind)
Returns the cost of a BlendedLoadVectorize node loading VecTy: two masked loads (one per candidate ba...
InstructionCost getBoolBitmaskCost(const TargetTransformInfo &TTI, bool NeedMask, Type *NarrowScalarTy, Type *WideTy, unsigned VF, ArrayRef< int > PermMask, const Value *Root, const TTI::TargetCostKind CostKind)
Returns the cost of the boolean bitmask reduction of a vector of boolean leaves of type NarrowScalarT...
InstructionCost getBoolReduxWideRdxCost(const TargetTransformInfo &TTI, RecurKind RdxKind, FixedVectorType *VecTy, const Value *Root, FastMathFlags FMF, const TTI::TargetCostKind CostKind)
Returns the cost of the booleanized logical and/or reduction of a vector of type VecTy with the i1 ro...
InstructionCost getScalarizationOverhead(const TargetTransformInfo &TTI, bool ReVec, Type *ScalarTy, VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, const TTI::TargetCostKind CostKind, bool ForPoisonSrc, ArrayRef< Value * > VL, TTI::VectorInstrContext VIC)
This is similar to TargetTransformInfo::getScalarizationOverhead, but if ScalarTy is a FixedVectorTyp...
InstructionCost getExtractWithExtendCost(const TargetTransformInfo &TTI, bool ReVec, unsigned Opcode, Type *Dst, VectorType *VecTy, unsigned Index, const TTI::TargetCostKind CostKind)
This is similar to TargetTransformInfo::getExtractWithExtendCost, but if Dst is a FixedVectorType,...
InstructionCost getVectorInstrCost(const TargetTransformInfo &TTI, bool ReVec, Type *ScalarTy, unsigned Opcode, Type *Val, const TTI::TargetCostKind CostKind, unsigned Index, Value *Scalar, ArrayRef< std::tuple< Value *, User *, int > > ScalarUserAndIdx, TTI::VectorInstrContext VIC)
This is similar to TargetTransformInfo::getVectorInstrCost, but if ScalarTy is a FixedVectorType,...
InstructionCost getMaskedDivRemCost(const TargetTransformInfo &TTI, bool ReVec, unsigned Opcode, Type *ScalarTy, unsigned NumElts, const TTI::TargetCostKind CostKind, FixedVectorType **PaddedTy)
For a non-power-of-2 NumElts-wide integer div/rem Opcode, checks if padding to a full register and us...
InstructionCost getBitPackCost(const TargetTransformInfo &TTI, FixedVectorType *SrcTy, Type *ResultTy, const BitPackInfo &Info, unsigned ZExtSrcWidth, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const TargetLibraryInfo *TLI, const Instruction *CtxI, unsigned &ShiftWidth)
Returns the cost of the bitfield packing of SrcTy into ResultTy, picking the cheapest shift width.
This is an optimization pass for GlobalISel generic memory operations.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
TargetTransformInfo TTI
RecurKind
These are the kinds of recurrences that we support.
ArrayRef(const T &OneElt) -> ArrayRef< T >
Description of a bitfield packing of vector lanes into a scalar value: every lane contributes a disjo...
Definition SLPUtils.h:433