LLVM 23.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/FMF.h"
25#include "llvm/IR/Function.h"
26#include "llvm/IR/Intrinsics.h"
28#include <cstdint>
29#include <optional>
30
31namespace llvm {
32
33class APInt;
34class Instruction;
35class IntrinsicInst;
36class Loop;
37class SCEV;
38class ScalarEvolution;
39class Type;
40class Value;
41class VectorType;
42
43class AArch64TTIImpl final : public BasicTTIImplBase<AArch64TTIImpl> {
45 using TTI = TargetTransformInfo;
46
47 friend BaseT;
48
49 const AArch64Subtarget *ST;
50 const AArch64TargetLowering *TLI;
51
52 static const FeatureBitset InlineInverseFeatures;
53
54 const AArch64Subtarget *getST() const { return ST; }
55 const AArch64TargetLowering *getTLI() const { return TLI; }
56
57 enum MemIntrinsicType {
58 VECTOR_LDST_TWO_ELEMENTS,
59 VECTOR_LDST_THREE_ELEMENTS,
60 VECTOR_LDST_FOUR_ELEMENTS
61 };
62
63 /// Given a add/sub/mul operation, detect a widening addl/subl/mull pattern
64 /// where both operands can be treated like extends. Returns the minimal type
65 /// needed to compute the operation.
66 Type *isBinExtWideningInstruction(unsigned Opcode, Type *DstTy,
68 Type *SrcOverrideTy = nullptr) const;
69 /// Given a add/sub operation with a single extend operand, detect a
70 /// widening addw/subw pattern.
71 bool isSingleExtWideningInstruction(unsigned Opcode, Type *DstTy,
73 Type *SrcOverrideTy = nullptr) const;
74
75 // A helper function called by 'getVectorInstrCost'.
76 //
77 // 'Val' and 'Index' are forwarded from 'getVectorInstrCost';
78 // \param ScalarUserAndIdx encodes the information about extracts from a
79 /// vector with 'Scalar' being the value being extracted,'User' being the user
80 /// of the extract(nullptr if user is not known before vectorization) and
81 /// 'Idx' being the extract lane.
82 InstructionCost getVectorInstrCostHelper(
83 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
84 const Instruction *I = nullptr, Value *Scalar = nullptr,
85 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx = {},
87
88public:
89 explicit AArch64TTIImpl(const AArch64TargetMachine *TM, const Function &F)
90 : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
91 TLI(ST->getTargetLowering()) {}
92
93 bool areInlineCompatible(const Function *Caller,
94 const Function *Callee) const override;
95
96 bool areTypesABICompatible(const Function *Caller, const Function *Callee,
97 ArrayRef<Type *> Types) const override;
98
99 unsigned getInlineCallPenalty(const Function *F, const CallBase &Call,
100 unsigned DefaultCallPenalty) const override;
101
102 APInt getFeatureMask(const Function &F) const override;
103 APInt getPriorityMask(const Function &F) const override;
104
105 bool isMultiversionedFunction(const Function &F) const override;
106
107 /// \name Scalar TTI Implementations
108 /// @{
109
111 InstructionCost getIntImmCost(int64_t Val) const;
112 InstructionCost getIntImmCost(const APInt &Imm, Type *Ty,
113 TTI::TargetCostKind CostKind) const override;
114 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
115 const APInt &Imm, Type *Ty,
117 Instruction *Inst = nullptr) const override;
119 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
120 Type *Ty, TTI::TargetCostKind CostKind) const override;
121 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
122
123 /// @}
124
125 /// \name Vector TTI Implementations
126 /// @{
127
128 bool enableInterleavedAccessVectorization() const override { return true; }
129
131 return ST->hasSVE();
132 }
133
134 unsigned getNumberOfRegisters(unsigned ClassID) const override {
135 bool Vector = (ClassID == 1);
136 if (Vector) {
137 if (ST->hasNEON())
138 return 32;
139 return 0;
140 }
141 return 31;
142 }
143
146 TTI::TargetCostKind CostKind) const override;
147
148 std::optional<Instruction *>
150
151 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
152 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
153 APInt &UndefElts2, APInt &UndefElts3,
154 std::function<void(Instruction *, unsigned, APInt, APInt &)>
155 SimplifyAndSetOp) const override;
156
159
160 unsigned getMinVectorRegisterBitWidth() const override {
161 return ST->getMinVectorRegisterBitWidth();
162 }
163
164 std::optional<unsigned> getVScaleForTuning() const override {
165 return ST->getVScaleForTuning();
166 }
167
168 bool isVScaleKnownToBeAPowerOfTwo() const override { return true; }
169
171 TargetTransformInfo::RegisterKind K) const override;
172
173 /// Try to return an estimate cost factor that can be used as a multiplier
174 /// when scalarizing an operation for a vector with ElementCount \p VF.
175 /// For scalable vectors this currently takes the most pessimistic view based
176 /// upon the maximum possible value for vscale.
177 unsigned getMaxNumElements(ElementCount VF) const {
178 if (!VF.isScalable())
179 return VF.getFixedValue();
180
181 return VF.getKnownMinValue() * ST->getVScaleForTuning();
182 }
183
184 unsigned getMaxInterleaveFactor(ElementCount VF) const override;
185
186 bool prefersVectorizedAddressing() const override;
187
188 /// Check whether Opcode1 has less throughput according to the scheduling
189 /// model than Opcode2.
190 bool hasKnownLowerThroughputFromSchedulingModel(unsigned Opcode1,
191 unsigned Opcode2) const;
192
195 TTI::TargetCostKind CostKind) const override;
196
199
202
203 bool isExtPartOfAvgExpr(const Instruction *ExtUser, Type *Dst,
204 Type *Src) const;
205
207 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
209 const Instruction *I = nullptr) const override;
210
212 getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy,
213 unsigned Index,
214 TTI::TargetCostKind CostKind) const override;
215
217 const Instruction *I = nullptr) const override;
218
221 unsigned Index, const Value *Op0, const Value *Op1,
223 TTI::VectorInstrContext::None) const override;
224
225 /// \param ScalarUserAndIdx encodes the information about extracts from a
226 /// vector with 'Scalar' being the value being extracted,'User' being the user
227 /// of the extract(nullptr if user is not known before vectorization) and
228 /// 'Idx' being the extract lane.
230 unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
231 Value *Scalar,
232 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
234 TTI::VectorInstrContext::None) const override;
235
238 TTI::TargetCostKind CostKind, unsigned Index,
240 TTI::VectorInstrContext::None) const override;
241
243 getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val,
245 unsigned Index) const override;
246
249 TTI::TargetCostKind CostKind) const override;
250
252 getArithmeticReductionCostSVE(unsigned Opcode, VectorType *ValTy,
254
257
259 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
263 const Instruction *CxtI = nullptr) const override;
264
266 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
267 TTI::TargetCostKind CostKind) const override;
268
270 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
274 const Instruction *I = nullptr) const override;
275
277 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
278 bool useNeonVector(const Type *Ty) const;
279
281 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
284 const Instruction *I = nullptr) const override;
285
288
289 void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
291 OptimizationRemarkEmitter *ORE) const override;
292
293 void getPeelingPreferences(Loop *L, ScalarEvolution &SE,
294 TTI::PeelingPreferences &PP) const override;
295
296 Value *
297 getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType,
298 bool CanCreate = true) const override;
299
300 bool getTgtMemIntrinsic(IntrinsicInst *Inst,
301 MemIntrinsicInfo &Info) const override;
302
303 bool isElementTypeLegalForScalableVector(Type *Ty) const override {
304 if (Ty->isPointerTy())
305 return true;
306
307 if (Ty->isBFloatTy() && ST->hasBF16())
308 return true;
309
310 if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy())
311 return true;
312
313 if (Ty->isIntegerTy(1) || Ty->isIntegerTy(8) || Ty->isIntegerTy(16) ||
314 Ty->isIntegerTy(32) || Ty->isIntegerTy(64))
315 return true;
316
317 return false;
318 }
319
320 bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const {
321 if (!ST->isSVEorStreamingSVEAvailable())
322 return false;
323
324 // For fixed vectors, avoid scalarization if using SVE for them.
325 if (isa<FixedVectorType>(DataType) && !ST->useSVEForFixedLengthVectors() &&
326 DataType->getPrimitiveSizeInBits() != 128)
327 return false; // Fall back to scalarization of masked operations.
328
329 return isElementTypeLegalForScalableVector(DataType->getScalarType());
330 }
331
332 bool isLegalMaskedLoad(Type *DataType, Align Alignment,
333 unsigned /*AddressSpace*/,
334 TTI::MaskKind /*MaskKind*/) const override {
335 return isLegalMaskedLoadStore(DataType, Alignment);
336 }
337
338 bool isLegalMaskedStore(Type *DataType, Align Alignment,
339 unsigned /*AddressSpace*/,
340 TTI::MaskKind /*MaskKind*/) const override {
341 return isLegalMaskedLoadStore(DataType, Alignment);
342 }
343
345 return Ty->isFloatTy() || Ty->isDoubleTy() || Ty->isIntegerTy(32) ||
346 Ty->isIntegerTy(64);
347 }
348
350 Align Alignment) const override {
351 if (!ST->isSVEAvailable())
352 return false;
353
354 if (isa<FixedVectorType>(DataType) &&
355 DataType->getPrimitiveSizeInBits() < 128)
356 return false;
357
358 return isElementTypeLegalForCompressStore(DataType->getScalarType());
359 }
360
361 bool isLegalMaskedGatherScatter(Type *DataType) const {
362 if (!ST->isSVEAvailable())
363 return false;
364
365 // For fixed vectors, scalarize if not using SVE for them.
366 auto *DataTypeFVTy = dyn_cast<FixedVectorType>(DataType);
367 if (DataTypeFVTy && (!ST->useSVEForFixedLengthVectors() ||
368 DataTypeFVTy->getNumElements() < 2))
369 return false;
370
371 return isElementTypeLegalForScalableVector(DataType->getScalarType());
372 }
373
374 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override {
375 return isLegalMaskedGatherScatter(DataType);
376 }
377
378 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override {
379 return isLegalMaskedGatherScatter(DataType);
380 }
381
382 bool isLegalBroadcastLoad(Type *ElementTy,
383 ElementCount NumElements) const override {
384 // Return true if we can generate a `ld1r` splat load instruction.
385 if (!ST->hasNEON() || NumElements.isScalable())
386 return false;
387 switch (unsigned ElementBits = ElementTy->getScalarSizeInBits()) {
388 case 8:
389 case 16:
390 case 32:
391 case 64: {
392 // We accept bit-widths >= 64bits and elements {8,16,32,64} bits.
393 unsigned VectorBits = NumElements.getFixedValue() * ElementBits;
394 return VectorBits >= 64;
395 }
396 }
397 return false;
398 }
399
400 std::optional<bool> isLegalNTStoreLoad(Type *DataType,
401 Align Alignment) const {
402 // Currently we only support NT load and store lowering for little-endian
403 // targets.
404 //
405 // Coordinated with LDNP and STNP constraints in
406 // `llvm/lib/Target/AArch64/AArch64InstrInfo.td` and
407 // `AArch64TargetLowering`
408 if (!ST->isLittleEndian())
409 return false;
410
411 // NOTE: The logic below is mostly geared towards LV, which calls it with
412 // vectors with 2 elements. We might want to improve that, if other
413 // users show up.
414 // Nontemporal vector loads/stores can be directly lowered to LDNP/STNP, if
415 // the vector can be halved so that each half fits into a register. That's
416 // the case if the element type fits into a register and the number of
417 // elements is a power of 2 > 1.
418 if (auto *DataTypeTy = dyn_cast<FixedVectorType>(DataType)) {
419 unsigned NumElements = DataTypeTy->getNumElements();
420 unsigned EltSize = DataTypeTy->getElementType()->getScalarSizeInBits();
421 return NumElements > 1 && isPowerOf2_64(NumElements) && EltSize >= 8 &&
422 EltSize <= 128 && isPowerOf2_64(EltSize);
423 }
424 return std::nullopt;
425 }
426
427 bool isLegalNTStore(Type *DataType, Align Alignment) const override {
428 if (auto Result = isLegalNTStoreLoad(DataType, Alignment))
429 return *Result;
430 // Fallback to target independent logic
431 return BaseT::isLegalNTStore(DataType, Alignment);
432 }
433
434 bool isLegalNTLoad(Type *DataType, Align Alignment) const override {
435 if (auto Result = isLegalNTStoreLoad(DataType, Alignment))
436 return *Result;
437 // Fallback to target independent logic
438 return BaseT::isLegalNTLoad(DataType, Alignment);
439 }
440
442 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
444 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
446 std::optional<FastMathFlags> FMF) const override;
447
448 bool enableOrderedReductions() const override { return true; }
449
451 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
452 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
453 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
454
456 const Instruction &I,
457 bool &AllowPromotionWithoutCommonHeader) const override;
458
459 bool shouldExpandReduction(const IntrinsicInst *II) const override {
460 return false;
461 }
462
463 unsigned getGISelRematGlobalCost() const override { return 2; }
464
465 unsigned getMinTripCountTailFoldingThreshold() const override {
466 return ST->hasSVE() ? 5 : 0;
467 }
468
470 getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const override {
471 if (ST->hasSVE())
472 return IVUpdateMayOverflow
475
477 }
478
479 bool preferFixedOverScalableIfEqualCost(bool IsEpilogue) const override;
480
481 unsigned getEpilogueVectorizationMinVF() const override;
482
483 bool preferPredicateOverEpilogue(TailFoldingInfo *TFI) const override;
484
485 bool supportsScalableVectors() const override {
486 return ST->isSVEorStreamingSVEAvailable();
487 }
488
489 bool enableScalableVectorization() const override;
490
492 ElementCount VF) const override;
493
494 bool preferPredicatedReductionSelect() const override { return ST->hasSVE(); }
495
496 /// FP16 and BF16 operations are lowered to fptrunc(op(fpext, fpext) if the
497 /// architecture features are not present.
498 std::optional<InstructionCost> getFP16BF16PromoteCost(
500 TTI::OperandValueInfo Op2Info, bool IncludeTrunc, bool CanUseSVE,
501 std::function<InstructionCost(Type *)> InstCost) const;
502
504 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
505 std::optional<FastMathFlags> FMF,
506 TTI::TargetCostKind CostKind) const override;
507
509 getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy,
510 VectorType *ValTy, std::optional<FastMathFlags> FMF,
511 TTI::TargetCostKind CostKind) const override;
512
514 bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty,
516
520 VectorType *SubTp, ArrayRef<const Value *> Args = {},
521 const Instruction *CxtI = nullptr) const override;
522
524 getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts,
525 bool Insert, bool Extract,
527 bool ForPoisonSrc = true, ArrayRef<Value *> VL = {},
529 TTI::VectorInstrContext::None) const override;
530
531 /// Return the cost of the scaling factor used in the addressing
532 /// mode represented by AM for this target, for a load/store
533 /// of the specified type.
534 /// If the AM is supported, the return value must be >= 0.
535 /// If the AM is not supported, it returns an invalid cost.
536 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
537 StackOffset BaseOffset, bool HasBaseReg,
538 int64_t Scale,
539 unsigned AddrSpace) const override;
540
541 bool enableSelectOptimize() const override {
542 return ST->enableSelectOptimize();
543 }
544
545 bool shouldTreatInstructionLikeSelect(const Instruction *I) const override;
546
547 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy,
548 Type *ScalarValTy) const override {
549 // We can vectorize store v4i8.
550 if (ScalarMemTy->isIntegerTy(8) && isPowerOf2_32(VF) && VF >= 4)
551 return 4;
552
553 return BaseT::getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy);
554 }
555
556 std::optional<unsigned> getMinPageSize() const override { return 4096; }
557
559 const TargetTransformInfo::LSRCost &C2) const override;
560
562 SmallVectorImpl<Use *> &Ops) const override;
563
564 bool enableAggressiveInterleaving(bool) const override {
565 return ST->enableAggressiveInterleaving();
566 }
567 /// @}
568};
569
570} // end namespace llvm
571
572#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...
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:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
This pass exposes codegen information to IR-level passes.
InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) 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
InstructionCost getMaskedMemoryOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
bool isVScaleKnownToBeAPowerOfTwo() const override
InstructionCost getGatherScatterOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) 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 getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
InstructionCost getIntImmCost(int64_t Val) const
Calculate the cost of materializing a 64-bit value.
std::optional< InstructionCost > getFP16BF16PromoteCost(Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info, bool IncludeTrunc, bool CanUseSVE, std::function< InstructionCost(Type *)> InstCost) const
FP16 and BF16 operations are lowered to fptrunc(op(fpext, fpext) if the architecture features are not...
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
bool enableAggressiveInterleaving(bool) const override
InstructionCost getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput) const override
bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned, TTI::MaskKind) const override
bool supportsScalableVectors() 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
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, std::optional< FastMathFlags > FMF) const override
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
bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned, TTI::MaskKind) 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
APInt getPriorityMask(const Function &F) const override
bool shouldMaximizeVectorBandwidth(TargetTransformInfo::RegisterKind K) const override
bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) 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...
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
bool isElementTypeLegalForCompressStore(Type *Ty) const
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 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 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 areTypesABICompatible(const Function *Caller, const Function *Callee, ArrayRef< Type * > Types) const override
bool enableScalableVectorization() const override
InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) 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,...
std::optional< bool > isLegalNTStoreLoad(Type *DataType, Align Alignment) const
bool isLegalMaskedCompressStore(Type *DataType, Align Alignment) const override
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:40
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:676
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
Information for memory intrinsic cost model.
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.
VectorInstrContext
Represents a hint about the context in which an insert/extract is used.
@ None
The insert/extract is not used with a load/store.
MaskKind
Some targets only support masked load/store with a constant mask.
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:230
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:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
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.
Definition Types.h:26
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:643
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:284
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
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:547
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.