LLVM 24.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 LoopInfo;
38class SCEV;
39class ScalarEvolution;
40class Type;
41class Value;
42class VectorType;
43
44class AArch64TTIImpl final : public BasicTTIImplBase<AArch64TTIImpl> {
46 using TTI = TargetTransformInfo;
47
48 friend BaseT;
49
50 const AArch64Subtarget *ST;
51 const AArch64TargetLowering *TLI;
52
53 const AArch64Subtarget *getST() const { return ST; }
54 const AArch64TargetLowering *getTLI() const { return TLI; }
55
56 /// Given a add/sub/mul operation, detect a widening addl/subl/mull pattern
57 /// where both operands can be treated like extends. Returns the minimal type
58 /// needed to compute the operation.
59 Type *isBinExtWideningInstruction(unsigned Opcode, Type *DstTy,
61 Type *SrcOverrideTy = nullptr) const;
62 /// Given a add/sub operation with a single extend operand, detect a
63 /// widening addw/subw pattern.
64 bool isSingleExtWideningInstruction(unsigned Opcode, Type *DstTy,
66 Type *SrcOverrideTy = nullptr) const;
67
68 // A helper function called by 'getVectorInstrCost'.
69 //
70 // 'Val' and 'Index' are forwarded from 'getVectorInstrCost';
71 // \param ScalarUserAndIdx encodes the information about extracts from a
72 /// vector with 'Scalar' being the value being extracted,'User' being the user
73 /// of the extract(nullptr if user is not known before vectorization) and
74 /// 'Idx' being the extract lane.
75 InstructionCost getVectorInstrCostHelper(
76 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, unsigned Index,
77 const Instruction *I = nullptr, Value *Scalar = nullptr,
78 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx = {},
80
81public:
82 explicit AArch64TTIImpl(const AArch64TargetMachine *TM, const Function &F)
83 : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
84 TLI(ST->getTargetLowering()) {}
85
86 bool areInlineCompatible(const Function *Caller,
87 const Function *Callee) const override;
88
89 bool areTypesABICompatible(const Function *Caller, const Function *Callee,
90 ArrayRef<Type *> Types) const override;
91
92 unsigned getInlineCallPenalty(const Function *F, const CallBase &Call,
93 unsigned DefaultCallPenalty) const override;
94
95 APInt getFeatureMask(const Function &F) const override;
96 APInt getPriorityMask(const Function &F) const override;
97
98 bool isMultiversionedFunction(const Function &F) const override;
99
100 /// \name Scalar TTI Implementations
101 /// @{
102
104 InstructionCost getIntImmCost(int64_t Val) const;
106 TTI::TargetCostKind CostKind) const override;
107 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
108 const APInt &Imm, Type *Ty,
109 TTI::TargetCostKind CostKind,
110 Instruction *Inst = nullptr) const override;
112 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
113 Type *Ty, TTI::TargetCostKind CostKind) const override;
114 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
115
116 /// @}
117
118 /// \name Vector TTI Implementations
119 /// @{
120
121 bool enableInterleavedAccessVectorization() const override { return true; }
122
124 return ST->hasSVE();
125 }
126
127 unsigned getNumberOfRegisters(unsigned ClassID) const override {
128 bool Vector = (ClassID == 1);
129 if (Vector) {
130 if (ST->hasNEON())
131 return 32;
132 return 0;
133 }
134 return 31;
135 }
136
139 TTI::TargetCostKind CostKind) const override;
140
141 std::optional<Instruction *>
143
144 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
145 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
146 APInt &UndefElts2, APInt &UndefElts3,
147 std::function<void(Instruction *, unsigned, APInt, APInt &)>
148 SimplifyAndSetOp) const override;
149
152
153 unsigned getMinVectorRegisterBitWidth() const override {
154 return ST->getMinVectorRegisterBitWidth();
155 }
156
157 std::optional<unsigned> getVScaleForTuning() const override {
158 return ST->getVScaleForTuning();
159 }
160
162 TargetTransformInfo::RegisterKind K) const override;
163
164 /// Try to return an estimate cost factor that can be used as a multiplier
165 /// when scalarizing an operation for a vector with ElementCount \p VF.
166 /// For scalable vectors this currently takes the most pessimistic view based
167 /// upon the maximum possible value for vscale.
168 unsigned getMaxNumElements(ElementCount VF) const {
169 if (!VF.isScalable())
170 return VF.getFixedValue();
171
172 return VF.getKnownMinValue() * ST->getVScaleForTuning();
173 }
174
176 bool HasUnorderedReductions) const override;
177
178 bool prefersVectorizedAddressing() const override;
179
180 /// Check whether Opcode1 has less throughput according to the scheduling
181 /// model than Opcode2. For variant scheduling classes, the lowest throughput
182 /// of Opcode1 and the highest throughput of Opcode2 are compared among all
183 /// the scheduling classes they may be resolved to.
184 bool hasKnownLowerThroughputFromSchedulingModel(unsigned Opcode1,
185 unsigned Opcode2) const;
186
189 TTI::TargetCostKind CostKind) const override;
190
192 TTI::TargetCostKind CostKind) const;
193
195 TTI::TargetCostKind CostKind) const;
196
197 bool isExtPartOfAvgExpr(const Instruction *ExtUser, Type *Dst,
198 Type *Src) const;
199
201 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
203 const Instruction *I = nullptr) const override;
204
206 getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy,
207 unsigned Index,
208 TTI::TargetCostKind CostKind) const override;
209
210 InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind,
211 const Instruction *I = nullptr) const override;
212
214 getVectorInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
215 unsigned Index, const Value *Op0, const Value *Op1,
217 TTI::VectorInstrContext::None) const override;
218
219 /// \param ScalarUserAndIdx encodes the information about extracts from a
220 /// vector with 'Scalar' being the value being extracted,'User' being the user
221 /// of the extract(nullptr if user is not known before vectorization) and
222 /// 'Idx' being the extract lane.
224 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, unsigned Index,
225 Value *Scalar,
226 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
228 TTI::VectorInstrContext::None) const override;
229
232 TTI::TargetCostKind CostKind, unsigned Index,
234 TTI::VectorInstrContext::None) const override;
235
237 getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Ty,
238 TTI::TargetCostKind CostKind,
239 unsigned Index) const override;
240
243 TTI::TargetCostKind CostKind) const override;
244
246 getArithmeticReductionCostSVE(unsigned Opcode, VectorType *ValTy,
247 TTI::TargetCostKind CostKind) const;
248
250 TTI::TargetCostKind CostKind) const;
251
253 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
257 const Instruction *CtxI = nullptr) const override;
258
260 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
261 TTI::TargetCostKind CostKind) const override;
262
264 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
265 TTI::TargetCostKind CostKind,
268 const Instruction *I = nullptr) const override;
269
271 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
272 bool useNeonVector(const Type *Ty) const;
273
275 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
276 TTI::TargetCostKind CostKind,
278 const Instruction *I = nullptr) const override;
279
282
283 bool isLegalMaskedExpandLoad(Type *DataTy, Align Alignment) const override;
284
285 bool isLegalSpeculativeLoad(Type *DataType,
286 unsigned AddressSpace) const override;
287
289 unsigned NumVectors, TTI::MaskSource Mask, VectorType *VectorTy,
290 bool IsStore,
291 std::optional<Instruction::CastOps> CastHint) const override;
292
293 void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
295 OptimizationRemarkEmitter *ORE) const override;
296
297 void getPeelingPreferences(Loop *L, ScalarEvolution &SE,
298 TTI::PeelingPreferences &PP) const override;
299
300 Value *
301 getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType,
302 bool CanCreate = true) const override;
303
304 bool getTgtMemIntrinsic(IntrinsicInst *Inst,
305 MemIntrinsicInfo &Info) const override;
306
307 bool isElementTypeLegalForScalableVector(Type *Ty) const override {
308 if (Ty->isPointerTy())
309 return true;
310
311 if (Ty->isBFloatTy() || Ty->isHalfTy() || Ty->isFloatTy() ||
312 Ty->isDoubleTy())
313 return true;
314
315 if (Ty->isIntegerTy(1) || Ty->isIntegerTy(8) || Ty->isIntegerTy(16) ||
316 Ty->isIntegerTy(32) || Ty->isIntegerTy(64))
317 return true;
318
319 return false;
320 }
321
322 bool isLegalMaskedLoadStore(Type *DataType, Align Alignment) const {
323 if (!ST->isSVEorStreamingSVEAvailable())
324 return false;
325
326 if (isa<FixedVectorType>(DataType) && !ST->useSVEForFixedLengthVectors()) {
327 unsigned Bits = DataType->getPrimitiveSizeInBits();
328 if (Bits != 64 && Bits != 128)
329 return false; // Fall back to scalarization of masked operations.
330 }
331
332 // Type legalization cannot scalarize the data of a masked load/store.
333 // Reject types that would be legalized to a scalar (e.g. <1 x half>).
334 if (isa<FixedVectorType>(DataType) &&
335 !getTypeLegalizationCost(DataType).second.isVector())
336 return false;
337
338 return isElementTypeLegalForScalableVector(DataType->getScalarType());
339 }
340
341 bool isLegalMaskedLoad(Type *DataType, Align Alignment,
342 unsigned /*AddressSpace*/,
343 TTI::MaskKind /*MaskKind*/) const override {
344 return isLegalMaskedLoadStore(DataType, Alignment);
345 }
346
347 bool isLegalMaskedStore(Type *DataType, Align Alignment,
348 unsigned /*AddressSpace*/,
349 TTI::MaskKind /*MaskKind*/) const override {
350 return isLegalMaskedLoadStore(DataType, Alignment);
351 }
352
354 assert(Ty->isIntegerTy() || Ty->isFloatingPointTy());
355 // 32-bit and 64-bit element types are legal if we have SVE.
356 if (is_contained({32u, 64u}, Ty->getScalarSizeInBits()))
357 return true;
358
359 // 8-bit and 16-bit types require +sve2p2 or +sme2p2.
360 if (is_contained({8u, 16u}, Ty->getScalarSizeInBits()))
361 return ST->hasSVE2p2() || ST->hasSME2p2();
362
363 return false;
364 }
365
366 bool isLegalMaskedCompressStore(Type *DataType,
367 Align Alignment) const override;
368
369 bool isLegalMaskedGatherScatter(Type *DataType) const {
370 if (!ST->isSVEAvailable())
371 return false;
372
373 // For fixed vectors, scalarize if not using SVE for them.
374 auto *DataTypeFVTy = dyn_cast<FixedVectorType>(DataType);
375 if (DataTypeFVTy && (!ST->useSVEForFixedLengthVectors() ||
376 DataTypeFVTy->getNumElements() < 2))
377 return false;
378
379 return isElementTypeLegalForScalableVector(DataType->getScalarType());
380 }
381
382 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override {
383 return isLegalMaskedGatherScatter(DataType);
384 }
385
386 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override {
387 return isLegalMaskedGatherScatter(DataType);
388 }
389
390 bool isLegalBroadcastLoad(Type *ElementTy,
391 ElementCount NumElements) const override {
392 // Return true if we can generate a `ld1r` splat load instruction.
393 if (!ST->hasNEON() || NumElements.isScalable())
394 return false;
395 switch (unsigned ElementBits = ElementTy->getScalarSizeInBits()) {
396 case 8:
397 case 16:
398 case 32:
399 case 64: {
400 // We accept bit-widths >= 64bits and elements {8,16,32,64} bits.
401 unsigned VectorBits = NumElements.getFixedValue() * ElementBits;
402 return VectorBits >= 64;
403 }
404 }
405 return false;
406 }
407
408 std::optional<bool> isLegalNTStoreLoad(Type *DataType,
409 Align Alignment) const {
410 // Currently we only support NT load and store lowering for little-endian
411 // targets.
412 //
413 // Coordinated with LDNP and STNP constraints in
414 // `llvm/lib/Target/AArch64/AArch64InstrInfo.td` and
415 // `AArch64ISelLowering.cpp`
416 if (!ST->isLittleEndian())
417 return false;
418
419 // NOTE: The logic below is mostly geared towards LV, which calls it with
420 // vectors with 2 elements. We might want to improve that, if other
421 // users show up.
422 // Nontemporal vector loads/stores can be directly lowered to LDNP/STNP, if
423 // the vector can be halved so that each half fits into a register. That's
424 // the case if the element type fits into a register and the number of
425 // elements is a power of 2 > 1.
426 if (auto *DataTypeTy = dyn_cast<FixedVectorType>(DataType)) {
427 unsigned NumElements = DataTypeTy->getNumElements();
428 unsigned EltSize = DataTypeTy->getElementType()->getScalarSizeInBits();
429 return NumElements > 1 && isPowerOf2_64(NumElements) && EltSize >= 8 &&
430 EltSize <= 128 && isPowerOf2_64(EltSize);
431 }
432 return std::nullopt;
433 }
434
435 bool isLegalNTStore(Type *DataType, Align Alignment) const override {
436 if (auto Result = isLegalNTStoreLoad(DataType, Alignment))
437 return *Result;
438 // Fallback to target independent logic
439 return BaseT::isLegalNTStore(DataType, Alignment);
440 }
441
442 bool isLegalNTLoad(Type *DataType, Align Alignment) const override {
443 if (auto Result = isLegalNTStoreLoad(DataType, Alignment))
444 return *Result;
445 // Fallback to target independent logic
446 return BaseT::isLegalNTLoad(DataType, Alignment);
447 }
448
450 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
452 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
453 TTI::TargetCostKind CostKind,
454 std::optional<FastMathFlags> FMF) const override;
455
456 bool enableOrderedReductions() const override { return true; }
457
459 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
460 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
461 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
462
464 const Instruction &I,
465 bool &AllowPromotionWithoutCommonHeader) const override;
466
467 bool shouldExpandReduction(const IntrinsicInst *II) const override {
468 return false;
469 }
470
471 unsigned getGISelRematGlobalCost() const override { return 2; }
472
474
475 unsigned getMinTripCountTailFoldingThreshold() const override {
476 return ST->hasSVE() ? 5 : 0;
477 }
478
483
484 bool preferFixedOverScalableIfEqualCost() const override;
485
486 unsigned getEpilogueVectorizationMinVF() const override;
487
488 bool preferTailFoldingOverEpilogue(TailFoldingInfo *TFI) const override;
489
490 bool supportsScalableVectors() const override {
491 return ST->isSVEorStreamingSVEAvailable();
492 }
493
494 bool enableScalableVectorization() const override;
495
497 ElementCount VF) const override;
498
499 bool preferPredicatedReductionSelect() const override { return ST->hasSVE(); }
500
501 /// FP16 and BF16 operations are lowered to fptrunc(op(fpext, fpext) if the
502 /// architecture features are not present.
503 std::optional<InstructionCost> getFP16BF16PromoteCost(
504 Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info,
505 TTI::OperandValueInfo Op2Info, bool IncludeTrunc, bool CanUseSVE,
506 std::function<InstructionCost(Type *)> InstCost) const;
507
509 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
510 std::optional<FastMathFlags> FMF,
511 TTI::TargetCostKind CostKind) const override;
512
514 getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy,
515 VectorType *ValTy, std::optional<FastMathFlags> FMF,
516 TTI::TargetCostKind CostKind) const override;
517
519 bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty,
520 TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) const override;
521
524 TTI::TargetCostKind CostKind, ArrayRef<int> Mask, int Index,
525 VectorType *SubTp, ArrayRef<const Value *> Args = {},
526 const Instruction *CtxI = nullptr,
528 TTI::VectorInstrContext::None) const override;
529
531 getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts,
532 bool Insert, bool Extract,
533 TTI::TargetCostKind CostKind,
534 bool ForPoisonSrc = true, ArrayRef<Value *> VL = {},
536 TTI::VectorInstrContext::None) const override;
537
538 /// Return the cost of the scaling factor used in the addressing
539 /// mode represented by AM for this target, for a load/store
540 /// of the specified type.
541 /// If the AM is supported, the return value must be >= 0.
542 /// If the AM is not supported, it returns an invalid cost.
543 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
544 StackOffset BaseOffset, bool HasBaseReg,
545 int64_t Scale,
546 unsigned AddrSpace) const override;
547
548 bool LSRWithInstrQueries() const override { return true; }
549
550 bool enableSelectOptimize() const override {
551 return ST->enableSelectOptimize();
552 }
553
554 bool shouldTreatInstructionLikeSelect(const Instruction *I) const override;
555
556 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy,
557 Align Alignment,
558 unsigned AddrSpace) const override {
559 // We can vectorize store v4i8.
560 if (ScalarMemTy->isIntegerTy(8) && isPowerOf2_32(VF) && VF >= 4)
561 return 4;
562
563 return BaseT::getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy, Alignment,
564 AddrSpace);
565 }
566
567 std::optional<unsigned> getMinPageSize() const override { return 4096; }
568
570 const TargetTransformInfo::LSRCost &C2) const override;
571
573 const LoopInfo *LI) const override;
574
575 bool enableAggressiveInterleaving(bool) const override {
576 return ST->enableAggressiveInterleaving();
577 }
578 /// @}
579
580 bool hasPossibleIncompatibleOps(const Function *F, bool ConsiderZA,
581 bool ConsiderZT, bool ConsiderSM) const;
582};
583
584} // end namespace llvm
585
586#endif // LLVM_LIB_TARGET_AARCH64_AARCH64TARGETTRANSFORMINFO_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t Imm
This file provides a helper that implements much of the TTI interface in terms of the target-independ...
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
int64_t C1
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 getCostOfKeepingLiveOverCall(ArrayRef< Type * > Tys) const override
TailFoldingStyle getPreferredTailFoldingStyle() const override
InstructionCost getMaskedMemoryOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
InstructionCost getGatherScatterOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
bool hasPossibleIncompatibleOps(const Function *F, bool ConsiderZA, bool ConsiderZT, bool ConsiderSM) const
Returns true if the function has explicit operations that can only be lowered using incompatible inst...
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.
InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, unsigned Index) const override
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
bool preferFixedOverScalableIfEqualCost() const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
bool isProfitableToSinkOperands(Instruction *I, SmallVectorImpl< Use * > &Ops, const LoopInfo *LI) const override
Check if sinking I's operands to I's basic block is profitable, because the operands can be folded in...
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 getVectorInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) 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 hasMultiVectorLoadStore(unsigned NumVectors, TTI::MaskSource Mask, VectorType *VectorTy, bool IsStore, std::optional< Instruction::CastOps > CastHint) const override
bool preferPredicatedReductionSelect() const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy, Align Alignment, unsigned AddrSpace) 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
bool preferTailFoldingOverEpilogue(TailFoldingInfo *TFI) 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
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, TTI::TargetCostKind CostKind, ArrayRef< int > Mask, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) 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
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
std::optional< unsigned > getMinPageSize() 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
bool isLegalSpeculativeLoad(Type *DataType, unsigned AddressSpace) const override
unsigned getMinVectorRegisterBitWidth() const override
bool isLegalMaskedExpandLoad(Type *DataTy, Align Alignment) const override
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override
bool isElementTypeLegalForCompressStore(Type *Ty) const
bool LSRWithInstrQueries() 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
The compiler must not inline when that may alter the behavior of the program.
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
bool isLegalMaskedCompressStore(Type *DataType, Align Alignment) const override
InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
bool isLegalMaskedGatherScatter(Type *DataType) const
InstructionCost getBranchMispredictPenalty() const override
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 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 *CtxI=nullptr) 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
unsigned getMaxInterleaveFactor(ElementCount VF, bool HasUnorderedReductions) const override
Class for arbitrary precision integers.
Definition APInt.h:78
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, Align Alignment, unsigned AddrSpace) const override
std::pair< InstructionCost, MVT > getTypeLegalizationCost(Type *Ty) const
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:740
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
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.
MaskKind
Some targets only support masked load/store with a constant mask.
TargetCostKind
The kind of cost model.
@ TCK_RecipThroughput
Reciprocal throughput.
MaskSource
Enum describing the source/producer of a mask.
PopcntSupportKind
Flags indicating the kind of support for population count.
llvm::VectorInstrContext VectorInstrContext
ShuffleKind
The various kinds of shuffle patterns for vector queries.
CastContextHint
Represents a hint about the context in which a cast is used.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
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.
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:285
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
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 >
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
@ 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.