LLVM 22.0.0git
RISCVTargetTransformInfo.h
Go to the documentation of this file.
1//===- RISCVTargetTransformInfo.h - RISC-V specific TTI ---------*- 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/// \file
9/// This file defines a TargetTransformInfoImplBase conforming object specific
10/// to the RISC-V target machine. It uses the target's detailed information to
11/// provide more precise answers to certain TTI queries, while letting the
12/// target independent and default TTI implementations handle the rest.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TARGET_RISCV_RISCVTARGETTRANSFORMINFO_H
17#define LLVM_LIB_TARGET_RISCV_RISCVTARGETTRANSFORMINFO_H
18
19#include "RISCVSubtarget.h"
20#include "RISCVTargetMachine.h"
23#include "llvm/IR/Function.h"
24#include <optional>
25
26namespace llvm {
27
28class RISCVTTIImpl final : public BasicTTIImplBase<RISCVTTIImpl> {
31
32 friend BaseT;
33
34 const RISCVSubtarget *ST;
35 const RISCVTargetLowering *TLI;
36
37 const RISCVSubtarget *getST() const { return ST; }
38 const RISCVTargetLowering *getTLI() const { return TLI; }
39
40 /// This function returns an estimate for VL to be used in VL based terms
41 /// of the cost model. For fixed length vectors, this is simply the
42 /// vector length. For scalable vectors, we return results consistent
43 /// with getVScaleForTuning under the assumption that clients are also
44 /// using that when comparing costs between scalar and vector representation.
45 /// This does unfortunately mean that we can both undershoot and overshot
46 /// the true cost significantly if getVScaleForTuning is wildly off for the
47 /// actual target hardware.
48 unsigned getEstimatedVLFor(VectorType *Ty) const;
49
50 /// This function calculates the costs for one or more RVV opcodes based
51 /// on the vtype and the cost kind.
52 /// \param Opcodes A list of opcodes of the RVV instruction to evaluate.
53 /// \param VT The MVT of vtype associated with the RVV instructions.
54 /// For widening/narrowing instructions where the result and source types
55 /// differ, it is important to check the spec to determine whether the vtype
56 /// refers to the result or source type.
57 /// \param CostKind The type of cost to compute.
58 InstructionCost getRISCVInstructionCost(ArrayRef<unsigned> OpCodes, MVT VT,
60
61 /// Return the cost of accessing a constant pool entry of the specified
62 /// type.
63 InstructionCost getConstantPoolLoadCost(Type *Ty,
65
66 /// If this shuffle can be lowered as a masked slide pair (at worst),
67 /// return a cost for it.
68 InstructionCost getSlideCost(FixedVectorType *Tp, ArrayRef<int> Mask,
70
71public:
72 explicit RISCVTTIImpl(const RISCVTargetMachine *TM, const Function &F)
73 : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
74 TLI(ST->getTargetLowering()) {}
75
76 /// Return the cost of materializing an immediate for a value operand of
77 /// a store instruction.
80
82 TTI::TargetCostKind CostKind) const override;
83 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
84 const APInt &Imm, Type *Ty,
86 Instruction *Inst = nullptr) const override;
88 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
89 Type *Ty, TTI::TargetCostKind CostKind) const override;
90
91 /// \name EVL Support for predicated vectorization.
92 /// Whether the target supports the %evl parameter of VP intrinsic efficiently
93 /// in hardware. (see LLVM Language Reference - "Vector Predication
94 /// Intrinsics",
95 /// https://llvm.org/docs/LangRef.html#vector-predication-intrinsics and
96 /// "IR-level VP intrinsics",
97 /// https://llvm.org/docs/Proposals/VectorPredication.html#ir-level-vp-intrinsics).
98 bool hasActiveVectorLength() const override;
99
101 getPopcntSupport(unsigned TyWidth) const override;
102
104 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
106 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
107 TTI::TargetCostKind CostKind) const override;
108
109 bool shouldExpandReduction(const IntrinsicInst *II) const override;
110 bool supportsScalableVectors() const override {
111 return ST->hasVInstructions();
112 }
113 bool enableOrderedReductions() const override { return true; }
114 bool enableScalableVectorization() const override {
115 return ST->hasVInstructions();
116 }
118 return ST->hasVInstructions();
119 }
121 getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const override {
122 return ST->hasVInstructions() ? TailFoldingStyle::DataWithEVL
124 }
125 std::optional<unsigned> getMaxVScale() const override;
126 std::optional<unsigned> getVScaleForTuning() const override;
127
130
131 unsigned getRegUsageForType(Type *Ty) const override;
132
133 unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const override;
134
135 bool preferAlternateOpcodeVectorization() const override;
136
137 bool preferEpilogueVectorization() const override {
138 // Epilogue vectorization is usually unprofitable - tail folding or
139 // a smaller VF would have been better. This a blunt hammer - we
140 // should re-examine this once vectorization is better tuned.
141 return false;
142 }
143
145 getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment,
146 unsigned AddressSpace,
147 TTI::TargetCostKind CostKind) const override;
148
151 const TTI::PointersChainInfo &Info, Type *AccessTy,
152 TTI::TargetCostKind CostKind) const override;
153
156 OptimizationRemarkEmitter *ORE) const override;
157
159 TTI::PeelingPreferences &PP) const override;
160
161 unsigned getMinVectorRegisterBitWidth() const override {
162 return ST->useRVVForFixedLengthVectors() ? 16 : 0;
163 }
164
168 VectorType *SubTp, ArrayRef<const Value *> Args = {},
169 const Instruction *CxtI = nullptr) const override;
170
172 VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract,
173 TTI::TargetCostKind CostKind, bool ForPoisonSrc = true,
174 ArrayRef<Value *> VL = {}) const override;
175
177 getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
178 TTI::TargetCostKind CostKind) const override;
179
181 getAddressComputationCost(Type *PTy, ScalarEvolution *SE, const SCEV *Ptr,
182 TTI::TargetCostKind CostKind) const override;
183
185 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
186 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
187 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
188
189 InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy,
190 const Value *Ptr, bool VariableMask,
191 Align Alignment,
193 const Instruction *I) const override;
194
196 getExpandCompressMemoryOpCost(unsigned Opcode, Type *Src, bool VariableMask,
197 Align Alignment, TTI::TargetCostKind CostKind,
198 const Instruction *I = nullptr) const override;
199
200 InstructionCost getStridedMemoryOpCost(unsigned Opcode, Type *DataTy,
201 const Value *Ptr, bool VariableMask,
202 Align Alignment,
204 const Instruction *I) const override;
205
207 getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys) const override;
208
210 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
212 const Instruction *I = nullptr) const override;
213
215 getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF,
216 TTI::TargetCostKind CostKind) const override;
217
219 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
220 std::optional<FastMathFlags> FMF,
221 TTI::TargetCostKind CostKind) const override;
222
224 getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy,
225 VectorType *ValTy, std::optional<FastMathFlags> FMF,
226 TTI::TargetCostKind CostKind) const override;
227
229 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
231 TTI::OperandValueInfo OpdInfo = {TTI::OK_AnyValue, TTI::OP_None},
232 const Instruction *I = nullptr) const override;
233
235 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
237 TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
238 TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
239 const Instruction *I = nullptr) const override;
240
242 const Instruction *I = nullptr) const override;
243
245 InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val,
247 unsigned Index, const Value *Op0,
248 const Value *Op1) const override;
249
251 getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val,
253 unsigned Index) const override;
254
256 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
257 TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
258 TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
259 ArrayRef<const Value *> Args = {},
260 const Instruction *CxtI = nullptr) const override;
261
262 bool isElementTypeLegalForScalableVector(Type *Ty) const override {
263 return TLI->isLegalElementTypeForRVV(TLI->getValueType(DL, Ty));
264 }
265
266 bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const {
267 if (!ST->hasVInstructions())
268 return false;
269
270 EVT DataTypeVT = TLI->getValueType(DL, DataType);
271
272 // Only support fixed vectors if we know the minimum vector size.
273 if (DataTypeVT.isFixedLengthVector() && !ST->useRVVForFixedLengthVectors())
274 return false;
275
276 EVT ElemType = DataTypeVT.getScalarType();
277 if (!ST->enableUnalignedVectorMem() && Alignment < ElemType.getStoreSize())
278 return false;
279
280 return TLI->isLegalElementTypeForRVV(ElemType);
281 }
282
283 bool isLegalMaskedLoad(Type *DataType, Align Alignment,
284 unsigned /*AddressSpace*/) const override {
285 return isLegalMaskedLoadStore(DataType, Alignment);
286 }
287 bool isLegalMaskedStore(Type *DataType, Align Alignment,
288 unsigned /*AddressSpace*/) const override {
289 return isLegalMaskedLoadStore(DataType, Alignment);
290 }
291
292 bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment) const {
293 if (!ST->hasVInstructions())
294 return false;
295
296 EVT DataTypeVT = TLI->getValueType(DL, DataType);
297
298 // Only support fixed vectors if we know the minimum vector size.
299 if (DataTypeVT.isFixedLengthVector() && !ST->useRVVForFixedLengthVectors())
300 return false;
301
302 // We also need to check if the vector of address is valid.
303 EVT PointerTypeVT = EVT(TLI->getPointerTy(DL));
304 if (DataTypeVT.isScalableVector() &&
305 !TLI->isLegalElementTypeForRVV(PointerTypeVT))
306 return false;
307
308 EVT ElemType = DataTypeVT.getScalarType();
309 if (!ST->enableUnalignedVectorMem() && Alignment < ElemType.getStoreSize())
310 return false;
311
312 return TLI->isLegalElementTypeForRVV(ElemType);
313 }
314
315 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override {
316 return isLegalMaskedGatherScatter(DataType, Alignment);
317 }
318 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override {
319 return isLegalMaskedGatherScatter(DataType, Alignment);
320 }
321
323 Align Alignment) const override {
324 // Scalarize masked gather for RV64 if EEW=64 indices aren't supported.
325 return ST->is64Bit() && !ST->hasVInstructionsI64();
326 }
327
329 Align Alignment) const override {
330 // Scalarize masked scatter for RV64 if EEW=64 indices aren't supported.
331 return ST->is64Bit() && !ST->hasVInstructionsI64();
332 }
333
334 bool isLegalStridedLoadStore(Type *DataType, Align Alignment) const override {
335 EVT DataTypeVT = TLI->getValueType(DL, DataType);
336 return TLI->isLegalStridedLoadStore(DataTypeVT, Alignment);
337 }
338
339 bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor,
340 Align Alignment,
341 unsigned AddrSpace) const override {
342 return TLI->isLegalInterleavedAccessType(VTy, Factor, Alignment, AddrSpace,
343 DL);
344 }
345
346 bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const override;
347
348 bool isLegalMaskedCompressStore(Type *DataTy, Align Alignment) const override;
349
350 bool isVScaleKnownToBeAPowerOfTwo() const override {
351 return TLI->isVScaleKnownToBeAPowerOfTwo();
352 }
353
354 /// \returns How the target needs this vector-predicated operation to be
355 /// transformed.
357 getVPLegalizationStrategy(const VPIntrinsic &PI) const override {
359 if (!ST->hasVInstructions() ||
360 (PI.getIntrinsicID() == Intrinsic::vp_reduce_mul &&
361 cast<VectorType>(PI.getArgOperand(1)->getType())
362 ->getElementType()
363 ->getIntegerBitWidth() != 1))
366 }
367
369 ElementCount VF) const override {
370 if (!VF.isScalable())
371 return true;
372
373 Type *Ty = RdxDesc.getRecurrenceType();
374 if (!TLI->isLegalElementTypeForRVV(TLI->getValueType(DL, Ty)))
375 return false;
376
377 switch (RdxDesc.getRecurrenceKind()) {
378 case RecurKind::Add:
379 case RecurKind::Sub:
381 case RecurKind::And:
382 case RecurKind::Or:
383 case RecurKind::Xor:
384 case RecurKind::SMin:
385 case RecurKind::SMax:
386 case RecurKind::UMin:
387 case RecurKind::UMax:
388 case RecurKind::FMin:
389 case RecurKind::FMax:
390 return true;
391 case RecurKind::AnyOf:
392 case RecurKind::FAdd:
394 // We can't promote f16/bf16 fadd reductions and scalable vectors can't be
395 // expanded.
396 if (Ty->isBFloatTy() || (Ty->isHalfTy() && !ST->hasVInstructionsF16()))
397 return false;
398 return true;
399 default:
400 return false;
401 }
402 }
403
404 unsigned getMaxInterleaveFactor(ElementCount VF) const override {
405 // Don't interleave if the loop has been vectorized with scalable vectors.
406 if (VF.isScalable())
407 return 1;
408 // If the loop will not be vectorized, don't interleave the loop.
409 // Let regular unroll to unroll the loop.
410 return VF.isScalar() ? 1 : ST->getMaxInterleaveFactor();
411 }
412
413 bool enableInterleavedAccessVectorization() const override { return true; }
414
416 return ST->hasVInstructions();
417 }
418
419 unsigned getMinTripCountTailFoldingThreshold() const override;
420
422 unsigned getNumberOfRegisters(unsigned ClassID) const override {
423 switch (ClassID) {
425 // 31 = 32 GPR - x0 (zero register)
426 // FIXME: Should we exclude fixed registers like SP, TP or GP?
427 return 31;
429 if (ST->hasStdExtF())
430 return 32;
431 return 0;
433 // Although there are 32 vector registers, v0 is special in that it is the
434 // only register that can be used to hold a mask.
435 // FIXME: Should we conservatively return 31 as the number of usable
436 // vector registers?
437 return ST->hasVInstructions() ? 32 : 0;
438 }
439 llvm_unreachable("unknown register class");
440 }
441
443 getPreferredAddressingMode(const Loop *L, ScalarEvolution *SE) const override;
444
446 Type *Ty = nullptr) const override {
447 if (Vector)
449 if (!Ty)
451
452 Type *ScalarTy = Ty->getScalarType();
453 if ((ScalarTy->isHalfTy() && ST->hasStdExtZfhmin()) ||
454 (ScalarTy->isFloatTy() && ST->hasStdExtF()) ||
455 (ScalarTy->isDoubleTy() && ST->hasStdExtD())) {
457 }
458
460 }
461
462 const char *getRegisterClassName(unsigned ClassID) const override {
463 switch (ClassID) {
465 return "RISCV::GPRRC";
467 return "RISCV::FPRRC";
469 return "RISCV::VRRC";
470 }
471 llvm_unreachable("unknown register class");
472 }
473
475 const TargetTransformInfo::LSRCost &C2) const override;
476
478 const Instruction &I,
479 bool &AllowPromotionWithoutCommonHeader) const override;
480 std::optional<unsigned> getMinPageSize() const override { return 4096; }
481 /// Return true if the (vector) instruction I will be lowered to an
482 /// instruction with a scalar splat operand for the given Operand number.
483 bool canSplatOperand(Instruction *I, int Operand) const;
484 /// Return true if a vector instruction will lower to a target instruction
485 /// able to splat the given operand.
486 bool canSplatOperand(unsigned Opcode, int Operand) const;
487
489 SmallVectorImpl<Use *> &Ops) const override;
490
492 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
493};
494
495} // end namespace llvm
496
497#endif // LLVM_LIB_TARGET_RISCV_RISCVTARGETTRANSFORMINFO_H
This file provides a helper that implements much of the TTI interface in terms of the target-independ...
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
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")))
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
uint32_t Index
TargetTransformInfo::VPLegalization VPLegalization
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
uint64_t IntrinsicInst * II
This pass exposes codegen information to IR-level passes.
Class for arbitrary precision integers.
Definition: APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Base class which can be used to help build a TTI implementation.
Definition: BasicTTIImpl.h:82
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) const override
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1292
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:678
constexpr bool isScalar() const
Exactly one element.
Definition: TypeSize.h:323
Class to represent fixed width SIMD vectors.
Definition: DerivedTypes.h:592
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:56
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:40
Machine Value Type.
The optimization diagnostic interface.
InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
bool supportsScalableVectors() const override
InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const override
bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const
InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
unsigned getMinTripCountTailFoldingThreshold() const override
unsigned getRegisterClassForType(bool Vector, Type *Ty=nullptr) const override
TTI::AddressingModeKind getPreferredAddressingMode(const Loop *L, ScalarEvolution *SE) const override
bool preferEpilogueVectorization() const override
InstructionCost getAddressComputationCost(Type *PTy, ScalarEvolution *SE, const SCEV *Ptr, TTI::TargetCostKind CostKind) const override
InstructionCost getStoreImmCost(Type *VecTy, TTI::OperandValueInfo OpInfo, TTI::TargetCostKind CostKind) const
Return the cost of materializing an immediate for a value operand of a store instruction.
bool isElementTypeLegalForScalableVector(Type *Ty) const override
bool enableMaskedInterleavedAccessVectorization() const override
bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor, Align Alignment, unsigned AddrSpace) const override
std::optional< unsigned > getMinPageSize() const override
InstructionCost getCostOfKeepingLiveOverCall(ArrayRef< Type * > Tys) const override
bool preferPredicateOverEpilogue(TailFoldingInfo *TFI) const override
bool hasActiveVectorLength() const override
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const override
InstructionCost getExpandCompressMemoryOpCost(unsigned Opcode, Type *Src, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const override
InstructionCost getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind) const override
InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) const override
bool forceScalarizeMaskedScatter(VectorType *VTy, Align Alignment) const override
const char * getRegisterClassName(unsigned ClassID) const override
InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind, Instruction *Inst=nullptr) const override
bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned) const override
InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF, TTI::TargetCostKind CostKind) const override
bool canSplatOperand(Instruction *I, int Operand) const
Return true if the (vector) instruction I will be lowered to an instruction with a scalar splat opera...
bool enableInterleavedAccessVectorization() const override
bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment) const
bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const override
bool isLegalStridedLoadStore(Type *DataType, Align Alignment) const override
unsigned getRegUsageForType(Type *Ty) const override
InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const override
InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}) const override
TailFoldingStyle getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const override
unsigned getMinVectorRegisterBitWidth() const override
bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override
bool isLegalMaskedCompressStore(Type *DataTy, Align Alignment) const override
unsigned getMaxInterleaveFactor(ElementCount VF) const override
bool enableOrderedReductions() const override
RISCVTTIImpl(const RISCVTargetMachine *TM, const Function &F)
TargetTransformInfo::VPLegalization getVPLegalizationStrategy(const VPIntrinsic &PI) const override
bool preferAlternateOpcodeVectorization() const override
bool isVScaleKnownToBeAPowerOfTwo() const override
bool isProfitableToSinkOperands(Instruction *I, SmallVectorImpl< Use * > &Ops) const override
Check if sinking I's operands to I's basic block is profitable, because the operands can be folded in...
unsigned getNumberOfRegisters(unsigned ClassID) const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) const override
std::optional< unsigned > getMaxVScale() const override
bool shouldExpandReduction(const IntrinsicInst *II) const override
std::optional< unsigned > getVScaleForTuning() const override
bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned) const override
bool isLegalMaskedGather(Type *DataType, Align Alignment) const override
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, ArrayRef< int > Mask, TTI::TargetCostKind CostKind, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const override
InstructionCost getPointersChainCost(ArrayRef< const Value * > Ptrs, const Value *Base, const TTI::PointersChainInfo &Info, Type *AccessTy, TTI::TargetCostKind CostKind) const override
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override
InstructionCost getPartialReductionCost(unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType, ElementCount VF, TTI::PartialReductionExtendKind OpAExtend, TTI::PartialReductionExtendKind OpBExtend, std::optional< unsigned > BinOp, TTI::TargetCostKind CostKind) const override
InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpdInfo={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
bool isLegalToVectorizeReduction(const RecurrenceDescriptor &RdxDesc, ElementCount VF) const override
bool enableScalableVectorization() const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
bool shouldConsiderAddressTypePromotion(const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const override
See if I should be considered for address type promotion.
InstructionCost getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
InstructionCost getStridedMemoryOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) const override
bool forceScalarizeMaskedGather(VectorType *VTy, Align Alignment) const override
TargetTransformInfo::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override
bool isLegalElementTypeForRVV(EVT ScalarTy) const
bool isVScaleKnownToBeAPowerOfTwo() const override
Return true only if vscale must be a power of two.
bool isLegalInterleavedAccessType(VectorType *VTy, unsigned Factor, Align Alignment, unsigned AddrSpace, const DataLayout &) const
Returns whether or not generating a interleaved load/store intrinsic for this type will be legal.
bool isLegalStridedLoadStore(EVT DataType, Align Alignment) const
Return true if a stride load store of the given result type and alignment is legal.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
Definition: IVDescriptors.h:90
Type * getRecurrenceType() const
Returns the type of the recurrence.
RecurKind getRecurrenceKind() const
The main scalar evolution driver.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
virtual const DataLayout & getDataLayout() const
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
TargetCostKind
The kind of cost model.
PopcntSupportKind
Flags indicating the kind of support for population count.
ShuffleKind
The various kinds of shuffle patterns for vector queries.
CastContextHint
Represents a hint about the context in which a cast is used.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:145
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:142
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:352
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
Base class of all SIMD vector types.
Definition: DerivedTypes.h:430
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:172
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Or
Bitwise or logical OR of integers.
@ AnyOf
AnyOf reduction with select(cmp(),x,y) where one of (x,y) is loop invariant, and both x and y are int...
@ Xor
Bitwise or logical XOR of integers.
@ FMax
FP max implemented in terms of select(cmp()).
@ FMulAdd
Sum of float products with llvm.fmuladd(a * b + sum).
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ FMin
FP min implemented in terms of select(cmp()).
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ AddChainWithSubs
A chain of adds and subs.
@ FAdd
Sum of floats.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
@ None
Don't use tail folding.
@ DataWithEVL
Use predicated EVL instructions for tail-folding.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Extended Value Type.
Definition: ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition: ValueTypes.h:390
bool isFixedLengthVector() const
Definition: ValueTypes.h:181
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition: ValueTypes.h:318
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition: ValueTypes.h:174
Returns options for expansion of memcmp. IsZeroCmp is.
Describe known properties for a set of pointers.
Parameters that control the generic loop unrolling transformation.