LLVM 22.0.0git
AArch64TargetTransformInfo.h
Go to the documentation of this file.
1//===- AArch64TargetTransformInfo.h - AArch64 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 a TargetTransformInfoImplBase conforming object specific to the
10/// AArch64 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_AARCH64_AARCH64TARGETTRANSFORMINFO_H
17#define LLVM_LIB_TARGET_AARCH64_AARCH64TARGETTRANSFORMINFO_H
18
19#include "AArch64.h"
20#include "AArch64Subtarget.h"
24#include "llvm/IR/Function.h"
25#include "llvm/IR/Intrinsics.h"
27#include <cstdint>
28#include <optional>
29
30namespace llvm {
31
32class APInt;
33class Instruction;
34class IntrinsicInst;
35class Loop;
36class SCEV;
37class ScalarEvolution;
38class Type;
39class Value;
40class VectorType;
41
42class AArch64TTIImpl final : public BasicTTIImplBase<AArch64TTIImpl> {
44 using TTI = TargetTransformInfo;
45
46 friend BaseT;
47
48 const AArch64Subtarget *ST;
49 const AArch64TargetLowering *TLI;
50
51 static const FeatureBitset InlineInverseFeatures;
52
53 const AArch64Subtarget *getST() const { return ST; }
54 const AArch64TargetLowering *getTLI() const { return TLI; }
55
56 enum MemIntrinsicType {
57 VECTOR_LDST_TWO_ELEMENTS,
58 VECTOR_LDST_THREE_ELEMENTS,
59 VECTOR_LDST_FOUR_ELEMENTS
60 };
61
62 bool isWideningInstruction(Type *DstTy, unsigned Opcode,
64 Type *SrcOverrideTy = nullptr) const;
65
66 // A helper function called by 'getVectorInstrCost'.
67 //
68 // 'Val' and 'Index' are forwarded from 'getVectorInstrCost';
69 // \param ScalarUserAndIdx encodes the information about extracts from a
70 /// vector with 'Scalar' being the value being extracted,'User' being the user
71 /// of the extract(nullptr if user is not known before vectorization) and
72 /// 'Idx' being the extract lane.
73 InstructionCost getVectorInstrCostHelper(
74 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
75 const Instruction *I = nullptr, Value *Scalar = nullptr,
76 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx = {}) const;
77
78public:
79 explicit AArch64TTIImpl(const AArch64TargetMachine *TM, const Function &F)
80 : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
81 TLI(ST->getTargetLowering()) {}
82
83 bool areInlineCompatible(const Function *Caller,
84 const Function *Callee) const override;
85
86 bool areTypesABICompatible(const Function *Caller, const Function *Callee,
87 const ArrayRef<Type *> &Types) const override;
88
89 unsigned getInlineCallPenalty(const Function *F, const CallBase &Call,
90 unsigned DefaultCallPenalty) const override;
91
92 APInt getFeatureMask(const Function &F) const override;
93
94 bool isMultiversionedFunction(const Function &F) const override;
95
96 /// \name Scalar TTI Implementations
97 /// @{
98
100 InstructionCost getIntImmCost(int64_t Val) const;
101 InstructionCost getIntImmCost(const APInt &Imm, Type *Ty,
102 TTI::TargetCostKind CostKind) const override;
103 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
104 const APInt &Imm, Type *Ty,
106 Instruction *Inst = nullptr) const override;
108 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
109 Type *Ty, TTI::TargetCostKind CostKind) const override;
110 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
111
112 /// @}
113
114 /// \name Vector TTI Implementations
115 /// @{
116
117 bool enableInterleavedAccessVectorization() const override { return true; }
118
120 return ST->hasSVE();
121 }
122
123 unsigned getNumberOfRegisters(unsigned ClassID) const override {
124 bool Vector = (ClassID == 1);
125 if (Vector) {
126 if (ST->hasNEON())
127 return 32;
128 return 0;
129 }
130 return 31;
131 }
132
135 TTI::TargetCostKind CostKind) const override;
136
137 std::optional<Instruction *>
139
140 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
141 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
142 APInt &UndefElts2, APInt &UndefElts3,
143 std::function<void(Instruction *, unsigned, APInt, APInt &)>
144 SimplifyAndSetOp) const override;
145
148
149 unsigned getMinVectorRegisterBitWidth() const override {
150 return ST->getMinVectorRegisterBitWidth();
151 }
152
153 std::optional<unsigned> getVScaleForTuning() const override {
154 return ST->getVScaleForTuning();
155 }
156
157 bool isVScaleKnownToBeAPowerOfTwo() const override { return true; }
158
160 TargetTransformInfo::RegisterKind K) const override;
161
162 /// Try to return an estimate cost factor that can be used as a multiplier
163 /// when scalarizing an operation for a vector with ElementCount \p VF.
164 /// For scalable vectors this currently takes the most pessimistic view based
165 /// upon the maximum possible value for vscale.
166 unsigned getMaxNumElements(ElementCount VF) const {
167 if (!VF.isScalable())
168 return VF.getFixedValue();
169
170 return VF.getKnownMinValue() * ST->getVScaleForTuning();
171 }
172
173 unsigned getMaxInterleaveFactor(ElementCount VF) const override;
174
175 bool prefersVectorizedAddressing() const override;
176
177 /// Check whether Opcode1 has less throughput according to the scheduling
178 /// model than Opcode2.
179 bool hasKnownLowerThroughputFromSchedulingModel(unsigned Opcode1,
180 unsigned Opcode2) const;
181
183 getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment,
184 unsigned AddressSpace,
185 TTI::TargetCostKind CostKind) const override;
186
188 getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr,
189 bool VariableMask, Align Alignment,
191 const Instruction *I = nullptr) const override;
192
193 bool isExtPartOfAvgExpr(const Instruction *ExtUser, Type *Dst,
194 Type *Src) const;
195
197 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
199 const Instruction *I = nullptr) const override;
200
202 getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy,
203 unsigned Index,
204 TTI::TargetCostKind CostKind) const override;
205
207 const Instruction *I = nullptr) const override;
208
209 InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val,
211 unsigned Index, const Value *Op0,
212 const Value *Op1) const override;
213
214 /// \param ScalarUserAndIdx encodes the information about extracts from a
215 /// vector with 'Scalar' being the value being extracted,'User' being the user
216 /// of the extract(nullptr if user is not known before vectorization) and
217 /// 'Idx' being the extract lane.
218 InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val,
220 unsigned Index, Value *Scalar,
221 ArrayRef<std::tuple<Value *, User *, int>>
222 ScalarUserAndIdx) const override;
223
226 unsigned Index) const override;
227
229 getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val,
231 unsigned Index) const override;
232
235 TTI::TargetCostKind CostKind) const override;
236
238 getArithmeticReductionCostSVE(unsigned Opcode, VectorType *ValTy,
240
243
245 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
249 const Instruction *CxtI = nullptr) const override;
250
252 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
253 TTI::TargetCostKind CostKind) const override;
254
256 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
260 const Instruction *I = nullptr) const override;
261
263 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
264 bool useNeonVector(const Type *Ty) const;
265
267 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
270 const Instruction *I = nullptr) const override;
271
274
275 void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
277 OptimizationRemarkEmitter *ORE) const override;
278
279 void getPeelingPreferences(Loop *L, ScalarEvolution &SE,
280 TTI::PeelingPreferences &PP) const override;
281
282 Value *
283 getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType,
284 bool CanCreate = true) const override;
285
286 bool getTgtMemIntrinsic(IntrinsicInst *Inst,
287 MemIntrinsicInfo &Info) const override;
288
289 bool isElementTypeLegalForScalableVector(Type *Ty) const override {
290 if (Ty->isPointerTy())
291 return true;
292
293 if (Ty->isBFloatTy() && ST->hasBF16())
294 return true;
295
296 if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy())
297 return true;
298
299 if (Ty->isIntegerTy(1) || Ty->isIntegerTy(8) || Ty->isIntegerTy(16) ||
300 Ty->isIntegerTy(32) || Ty->isIntegerTy(64))
301 return true;
302
303 return false;
304 }
305
306 bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const {
307 if (!ST->hasSVE())
308 return false;
309
310 // For fixed vectors, avoid scalarization if using SVE for them.
311 if (isa<FixedVectorType>(DataType) && !ST->useSVEForFixedLengthVectors() &&
312 DataType->getPrimitiveSizeInBits() != 128)
313 return false; // Fall back to scalarization of masked operations.
314
315 return isElementTypeLegalForScalableVector(DataType->getScalarType());
316 }
317
318 bool isLegalMaskedLoad(Type *DataType, Align Alignment,
319 unsigned /*AddressSpace*/) const override {
320 return isLegalMaskedLoadStore(DataType, Alignment);
321 }
322
323 bool isLegalMaskedStore(Type *DataType, Align Alignment,
324 unsigned /*AddressSpace*/) const override {
325 return isLegalMaskedLoadStore(DataType, Alignment);
326 }
327
328 bool isLegalMaskedGatherScatter(Type *DataType) const {
329 if (!ST->isSVEAvailable())
330 return false;
331
332 // For fixed vectors, scalarize if not using SVE for them.
333 auto *DataTypeFVTy = dyn_cast<FixedVectorType>(DataType);
334 if (DataTypeFVTy && (!ST->useSVEForFixedLengthVectors() ||
335 DataTypeFVTy->getNumElements() < 2))
336 return false;
337
338 return isElementTypeLegalForScalableVector(DataType->getScalarType());
339 }
340
341 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override {
342 return isLegalMaskedGatherScatter(DataType);
343 }
344
345 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override {
346 return isLegalMaskedGatherScatter(DataType);
347 }
348
349 bool isLegalBroadcastLoad(Type *ElementTy,
350 ElementCount NumElements) const override {
351 // Return true if we can generate a `ld1r` splat load instruction.
352 if (!ST->hasNEON() || NumElements.isScalable())
353 return false;
354 switch (unsigned ElementBits = ElementTy->getScalarSizeInBits()) {
355 case 8:
356 case 16:
357 case 32:
358 case 64: {
359 // We accept bit-widths >= 64bits and elements {8,16,32,64} bits.
360 unsigned VectorBits = NumElements.getFixedValue() * ElementBits;
361 return VectorBits >= 64;
362 }
363 }
364 return false;
365 }
366
367 bool isLegalNTStoreLoad(Type *DataType, Align Alignment) const {
368 // NOTE: The logic below is mostly geared towards LV, which calls it with
369 // vectors with 2 elements. We might want to improve that, if other
370 // users show up.
371 // Nontemporal vector loads/stores can be directly lowered to LDNP/STNP, if
372 // the vector can be halved so that each half fits into a register. That's
373 // the case if the element type fits into a register and the number of
374 // elements is a power of 2 > 1.
375 if (auto *DataTypeTy = dyn_cast<FixedVectorType>(DataType)) {
376 unsigned NumElements = DataTypeTy->getNumElements();
377 unsigned EltSize = DataTypeTy->getElementType()->getScalarSizeInBits();
378 return NumElements > 1 && isPowerOf2_64(NumElements) && EltSize >= 8 &&
379 EltSize <= 128 && isPowerOf2_64(EltSize);
380 }
381 return BaseT::isLegalNTStore(DataType, Alignment);
382 }
383
384 bool isLegalNTStore(Type *DataType, Align Alignment) const override {
385 return isLegalNTStoreLoad(DataType, Alignment);
386 }
387
388 bool isLegalNTLoad(Type *DataType, Align Alignment) const override {
389 // Only supports little-endian targets.
390 if (ST->isLittleEndian())
391 return isLegalNTStoreLoad(DataType, Alignment);
392 return BaseT::isLegalNTLoad(DataType, Alignment);
393 }
394
396 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
398 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
399 TTI::TargetCostKind CostKind) const override;
400
401 bool enableOrderedReductions() const override { return true; }
402
404 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
405 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
406 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
407
409 const Instruction &I,
410 bool &AllowPromotionWithoutCommonHeader) const override;
411
412 bool shouldExpandReduction(const IntrinsicInst *II) const override {
413 return false;
414 }
415
416 unsigned getGISelRematGlobalCost() const override { return 2; }
417
418 unsigned getMinTripCountTailFoldingThreshold() const override {
419 return ST->hasSVE() ? 5 : 0;
420 }
421
423 getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const override {
424 if (ST->hasSVE())
425 return IVUpdateMayOverflow
428
430 }
431
432 bool preferFixedOverScalableIfEqualCost(bool IsEpilogue) const override;
433
434 unsigned getEpilogueVectorizationMinVF() const override;
435
436 bool preferPredicateOverEpilogue(TailFoldingInfo *TFI) const override;
437
438 bool supportsScalableVectors() const override {
439 return ST->isSVEorStreamingSVEAvailable();
440 }
441
442 bool enableScalableVectorization() const override;
443
445 ElementCount VF) const override;
446
447 bool preferPredicatedReductionSelect() const override { return ST->hasSVE(); }
448
449 /// FP16 and BF16 operations are lowered to fptrunc(op(fpext, fpext) if the
450 /// architecture features are not present.
451 std::optional<InstructionCost>
453 TTI::OperandValueInfo Op1Info,
454 TTI::OperandValueInfo Op2Info, bool IncludeTrunc,
455 std::function<InstructionCost(Type *)> InstCost) const;
456
458 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
459 std::optional<FastMathFlags> FMF,
460 TTI::TargetCostKind CostKind) const override;
461
463 getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy,
464 VectorType *ValTy, std::optional<FastMathFlags> FMF,
465 TTI::TargetCostKind CostKind) const override;
466
468 bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty,
470
474 VectorType *SubTp, ArrayRef<const Value *> Args = {},
475 const Instruction *CxtI = nullptr) const override;
476
478 VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract,
479 TTI::TargetCostKind CostKind, bool ForPoisonSrc = true,
480 ArrayRef<Value *> VL = {}) const override;
481
482 /// Return the cost of the scaling factor used in the addressing
483 /// mode represented by AM for this target, for a load/store
484 /// of the specified type.
485 /// If the AM is supported, the return value must be >= 0.
486 /// If the AM is not supported, it returns an invalid cost.
487 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
488 StackOffset BaseOffset, bool HasBaseReg,
489 int64_t Scale,
490 unsigned AddrSpace) const override;
491
492 bool enableSelectOptimize() const override {
493 return ST->enableSelectOptimize();
494 }
495
496 bool shouldTreatInstructionLikeSelect(const Instruction *I) const override;
497
498 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy,
499 Type *ScalarValTy) const override {
500 // We can vectorize store v4i8.
501 if (ScalarMemTy->isIntegerTy(8) && isPowerOf2_32(VF) && VF >= 4)
502 return 4;
503
504 return BaseT::getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy);
505 }
506
507 std::optional<unsigned> getMinPageSize() const override { return 4096; }
508
510 const TargetTransformInfo::LSRCost &C2) const override;
511
513 SmallVectorImpl<Use *> &Ops) const override;
514 /// @}
515};
516
517} // end namespace llvm
518
519#endif // LLVM_LIB_TARGET_AARCH64_AARCH64TARGETTRANSFORMINFO_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")))
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#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.
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 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
bool isLegalNTLoad(Type *DataType, Align Alignment) 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
InstructionCost getCostOfKeepingLiveOverCall(ArrayRef< Type * > Tys) const override
unsigned getMaxInterleaveFactor(ElementCount VF) const override
TailFoldingStyle getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const override
bool isVScaleKnownToBeAPowerOfTwo() const override
bool isLegalNTStoreLoad(Type *DataType, Align Alignment) const
bool isLegalBroadcastLoad(Type *ElementTy, ElementCount NumElements) const override
InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr, TTI::TargetCostKind CostKind) const override
bool isExtPartOfAvgExpr(const Instruction *ExtUser, Type *Dst, Type *Src) const
InstructionCost getIntImmCost(int64_t Val) const
Calculate the cost of materializing a 64-bit value.
bool prefersVectorizedAddressing() const override
unsigned getMinTripCountTailFoldingThreshold() const override
std::optional< unsigned > getVScaleForTuning() const override
InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override
InstructionCost getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const override
bool supportsScalableVectors() const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) const override
bool enableSelectOptimize() const override
InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind, Instruction *Inst=nullptr) const override
bool isElementTypeLegalForScalableVector(Type *Ty) const override
bool preferPredicatedReductionSelect() const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
std::optional< InstructionCost > getFP16BF16PromoteCost(Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info, bool IncludeTrunc, std::function< InstructionCost(Type *)> InstCost) const
FP16 and BF16 operations are lowered to fptrunc(op(fpext, fpext) if the architecture features are not...
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
unsigned getNumberOfRegisters(unsigned ClassID) const override
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const override
bool getTgtMemIntrinsic(IntrinsicInst *Inst, MemIntrinsicInfo &Info) const override
InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF, TTI::TargetCostKind CostKind) const override
InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpInfo={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
bool shouldMaximizeVectorBandwidth(TargetTransformInfo::RegisterKind K) const override
InstructionCost getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind) const override
bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const override
bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned) const override
InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}) const override
InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) 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...
bool areTypesABICompatible(const Function *Caller, const Function *Callee, const ArrayRef< Type * > &Types) const override
std::optional< Value * > simplifyDemandedVectorEltsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp) const override
bool isLegalNTStore(Type *DataType, Align Alignment) const override
bool useNeonVector(const Type *Ty) const
std::optional< Instruction * > instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) 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 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
std::optional< unsigned > getMinPageSize() const override
bool preferPredicateOverEpilogue(TailFoldingInfo *TFI) const override
InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const
unsigned getMinVectorRegisterBitWidth() const override
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override
InstructionCost getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy, unsigned Index, TTI::TargetCostKind CostKind) const override
AArch64TTIImpl(const AArch64TargetMachine *TM, const Function &F)
unsigned getInlineCallPenalty(const Function *F, const CallBase &Call, unsigned DefaultCallPenalty) const override
bool areInlineCompatible(const Function *Caller, const Function *Callee) const override
unsigned getMaxNumElements(ElementCount VF) const
Try to return an estimate cost factor that can be used as a multiplier when scalarizing an operation ...
bool shouldTreatInstructionLikeSelect(const Instruction *I) const override
bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned) const override
bool enableOrderedReductions() const override
bool isMultiversionedFunction(const Function &F) const override
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
bool isLegalToVectorizeReduction(const RecurrenceDescriptor &RdxDesc, ElementCount VF) const override
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override
bool enableInterleavedAccessVectorization() const override
InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
bool isLegalMaskedGatherScatter(Type *DataType) const
unsigned getGISelRematGlobalCost() const override
bool shouldConsiderAddressTypePromotion(const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const override
See if I should be considered for address type promotion.
APInt getFeatureMask(const Function &F) const override
InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) 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
bool enableScalableVectorization() const override
bool shouldExpandReduction(const IntrinsicInst *II) const override
Value * getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType, bool CanCreate=true) const override
bool isLegalMaskedGather(Type *DataType, Align Alignment) const override
bool hasKnownLowerThroughputFromSchedulingModel(unsigned Opcode1, unsigned Opcode2) const
Check whether Opcode1 has less throughput according to the scheduling model than Opcode2.
bool enableMaskedInterleavedAccessVectorization() const override
unsigned getEpilogueVectorizationMinVF() const override
InstructionCost getSpliceCost(VectorType *Tp, int Index, TTI::TargetCostKind CostKind) const
InstructionCost getArithmeticReductionCostSVE(unsigned Opcode, VectorType *ValTy, TTI::TargetCostKind CostKind) const
InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, StackOffset BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace) const override
Return the cost of the scaling factor used in the addressing mode represented by AM for this target,...
bool preferFixedOverScalableIfEqualCost(bool IsEpilogue) const override
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy) const override
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
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy) const override
BasicTTIImplBase(const TargetMachine *TM, const DataLayout &DL)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:678
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:22
Container class for subtarget features.
The core instruction combiner logic.
A wrapper class for inspecting calls to intrinsic functions.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
virtual const DataLayout & getDataLayout() const
virtual InstructionCost getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const
virtual bool isLegalNTStore(Type *DataType, Align Alignment) const
virtual bool isLegalNTLoad(Type *DataType, Align Alignment) const
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
TargetCostKind
The kind of cost model.
@ TCK_RecipThroughput
Reciprocal throughput.
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
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:231
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
CallInst * Call
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:293
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:288
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
ArrayRef(const T &OneElt) -> ArrayRef< T >
@ DataAndControlFlowWithoutRuntimeCheck
Use predicate to control both data and control flow, but modify the trip count so that a runtime over...
@ DataAndControlFlow
Use predicate to control both data and control flow.
@ DataWithoutLaneMask
Same as Data, but avoids using the get.active.lane.mask intrinsic to calculate the mask and instead i...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Returns options for expansion of memcmp. IsZeroCmp is.
Parameters that control the generic loop unrolling transformation.