xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86TargetTransformInfo.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- X86TargetTransformInfo.h - X86 specific TTI -------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric /// \file
90b57cec5SDimitry Andric /// This file a TargetTransformInfo::Concept conforming object specific to the
100b57cec5SDimitry Andric /// X86 target machine. It uses the target's detailed information to
110b57cec5SDimitry Andric /// provide more precise answers to certain TTI queries, while letting the
120b57cec5SDimitry Andric /// target independent and default TTI implementations handle the rest.
130b57cec5SDimitry Andric ///
140b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H
170b57cec5SDimitry Andric #define LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include "X86TargetMachine.h"
200b57cec5SDimitry Andric #include "llvm/Analysis/TargetTransformInfo.h"
210b57cec5SDimitry Andric #include "llvm/CodeGen/BasicTTIImpl.h"
22bdd1243dSDimitry Andric #include <optional>
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric namespace llvm {
250b57cec5SDimitry Andric 
26e8d8bef9SDimitry Andric class InstCombiner;
27e8d8bef9SDimitry Andric 
280b57cec5SDimitry Andric class X86TTIImpl : public BasicTTIImplBase<X86TTIImpl> {
290b57cec5SDimitry Andric   typedef BasicTTIImplBase<X86TTIImpl> BaseT;
300b57cec5SDimitry Andric   typedef TargetTransformInfo TTI;
310b57cec5SDimitry Andric   friend BaseT;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   const X86Subtarget *ST;
340b57cec5SDimitry Andric   const X86TargetLowering *TLI;
350b57cec5SDimitry Andric 
getST()360b57cec5SDimitry Andric   const X86Subtarget *getST() const { return ST; }
getTLI()370b57cec5SDimitry Andric   const X86TargetLowering *getTLI() const { return TLI; }
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   const FeatureBitset InlineFeatureIgnoreList = {
400b57cec5SDimitry Andric       // This indicates the CPU is 64 bit capable not that we are in 64-bit
410b57cec5SDimitry Andric       // mode.
4281ad6265SDimitry Andric       X86::FeatureX86_64,
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric       // These features don't have any intrinsics or ABI effect.
450b57cec5SDimitry Andric       X86::FeatureNOPL,
4681ad6265SDimitry Andric       X86::FeatureCX16,
4781ad6265SDimitry Andric       X86::FeatureLAHFSAHF64,
480b57cec5SDimitry Andric 
49349cc55cSDimitry Andric       // Some older targets can be setup to fold unaligned loads.
500b57cec5SDimitry Andric       X86::FeatureSSEUnalignedMem,
51349cc55cSDimitry Andric 
52349cc55cSDimitry Andric       // Codegen control options.
53349cc55cSDimitry Andric       X86::TuningFast11ByteNOP,
54349cc55cSDimitry Andric       X86::TuningFast15ByteNOP,
55349cc55cSDimitry Andric       X86::TuningFastBEXTR,
56349cc55cSDimitry Andric       X86::TuningFastHorizontalOps,
57349cc55cSDimitry Andric       X86::TuningFastLZCNT,
58349cc55cSDimitry Andric       X86::TuningFastScalarFSQRT,
59349cc55cSDimitry Andric       X86::TuningFastSHLDRotate,
60349cc55cSDimitry Andric       X86::TuningFastScalarShiftMasks,
61349cc55cSDimitry Andric       X86::TuningFastVectorShiftMasks,
62349cc55cSDimitry Andric       X86::TuningFastVariableCrossLaneShuffle,
63349cc55cSDimitry Andric       X86::TuningFastVariablePerLaneShuffle,
64349cc55cSDimitry Andric       X86::TuningFastVectorFSQRT,
65349cc55cSDimitry Andric       X86::TuningLEAForSP,
66349cc55cSDimitry Andric       X86::TuningLEAUsesAG,
67349cc55cSDimitry Andric       X86::TuningLZCNTFalseDeps,
68349cc55cSDimitry Andric       X86::TuningBranchFusion,
69349cc55cSDimitry Andric       X86::TuningMacroFusion,
70349cc55cSDimitry Andric       X86::TuningPadShortFunctions,
71349cc55cSDimitry Andric       X86::TuningPOPCNTFalseDeps,
7281ad6265SDimitry Andric       X86::TuningMULCFalseDeps,
7381ad6265SDimitry Andric       X86::TuningPERMFalseDeps,
7481ad6265SDimitry Andric       X86::TuningRANGEFalseDeps,
7581ad6265SDimitry Andric       X86::TuningGETMANTFalseDeps,
7681ad6265SDimitry Andric       X86::TuningMULLQFalseDeps,
77349cc55cSDimitry Andric       X86::TuningSlow3OpsLEA,
78349cc55cSDimitry Andric       X86::TuningSlowDivide32,
79349cc55cSDimitry Andric       X86::TuningSlowDivide64,
80349cc55cSDimitry Andric       X86::TuningSlowIncDec,
81349cc55cSDimitry Andric       X86::TuningSlowLEA,
82349cc55cSDimitry Andric       X86::TuningSlowPMADDWD,
83349cc55cSDimitry Andric       X86::TuningSlowPMULLD,
84349cc55cSDimitry Andric       X86::TuningSlowSHLD,
85349cc55cSDimitry Andric       X86::TuningSlowTwoMemOps,
86349cc55cSDimitry Andric       X86::TuningSlowUAMem16,
87349cc55cSDimitry Andric       X86::TuningPreferMaskRegisters,
88349cc55cSDimitry Andric       X86::TuningInsertVZEROUPPER,
89349cc55cSDimitry Andric       X86::TuningUseSLMArithCosts,
90349cc55cSDimitry Andric       X86::TuningUseGLMDivSqrtCosts,
9106c3fb27SDimitry Andric       X86::TuningNoDomainDelay,
9206c3fb27SDimitry Andric       X86::TuningNoDomainDelayMov,
9306c3fb27SDimitry Andric       X86::TuningNoDomainDelayShuffle,
9406c3fb27SDimitry Andric       X86::TuningNoDomainDelayBlend,
9506c3fb27SDimitry Andric       X86::TuningPreferShiftShuffle,
9606c3fb27SDimitry Andric       X86::TuningFastImmVectorShift,
97*0fca6ea1SDimitry Andric       X86::TuningFastDPWSSD,
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric       // Perf-tuning flags.
100349cc55cSDimitry Andric       X86::TuningFastGather,
101349cc55cSDimitry Andric       X86::TuningSlowUAMem32,
102bdd1243dSDimitry Andric       X86::TuningAllowLight256Bit,
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric       // Based on whether user set the -mprefer-vector-width command line.
105349cc55cSDimitry Andric       X86::TuningPrefer128Bit,
106349cc55cSDimitry Andric       X86::TuningPrefer256Bit,
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric       // CPU name enums. These just follow CPU string.
109349cc55cSDimitry Andric       X86::ProcIntelAtom
1100b57cec5SDimitry Andric   };
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric public:
X86TTIImpl(const X86TargetMachine * TM,const Function & F)1130b57cec5SDimitry Andric   explicit X86TTIImpl(const X86TargetMachine *TM, const Function &F)
114*0fca6ea1SDimitry Andric       : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
1150b57cec5SDimitry Andric         TLI(ST->getTargetLowering()) {}
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric   /// \name Scalar TTI Implementations
1180b57cec5SDimitry Andric   /// @{
1190b57cec5SDimitry Andric   TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth);
1200b57cec5SDimitry Andric 
1210b57cec5SDimitry Andric   /// @}
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric   /// \name Cache TTI Implementation
1240b57cec5SDimitry Andric   /// @{
125bdd1243dSDimitry Andric   std::optional<unsigned> getCacheSize(
1265ffd83dbSDimitry Andric     TargetTransformInfo::CacheLevel Level) const override;
127bdd1243dSDimitry Andric   std::optional<unsigned> getCacheAssociativity(
1285ffd83dbSDimitry Andric     TargetTransformInfo::CacheLevel Level) const override;
1290b57cec5SDimitry Andric   /// @}
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric   /// \name Vector TTI Implementations
1320b57cec5SDimitry Andric   /// @{
1330b57cec5SDimitry Andric 
1348bcb0991SDimitry Andric   unsigned getNumberOfRegisters(unsigned ClassID) const;
135*0fca6ea1SDimitry Andric   bool hasConditionalLoadStoreForType(Type *Ty = nullptr) const;
136fe6060f1SDimitry Andric   TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const;
1370b57cec5SDimitry Andric   unsigned getLoadStoreVecRegBitWidth(unsigned AS) const;
13806c3fb27SDimitry Andric   unsigned getMaxInterleaveFactor(ElementCount VF);
139fe6060f1SDimitry Andric   InstructionCost getArithmeticInstrCost(
140349cc55cSDimitry Andric       unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
141bdd1243dSDimitry Andric       TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
142bdd1243dSDimitry Andric       TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
143*0fca6ea1SDimitry Andric       ArrayRef<const Value *> Args = std::nullopt,
144480093f4SDimitry Andric       const Instruction *CxtI = nullptr);
145647cbc5dSDimitry Andric   InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0,
146647cbc5dSDimitry Andric                                   unsigned Opcode1,
147647cbc5dSDimitry Andric                                   const SmallBitVector &OpcodeMask,
148647cbc5dSDimitry Andric                                   TTI::TargetCostKind CostKind) const;
149647cbc5dSDimitry Andric 
150fe6060f1SDimitry Andric   InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
151bdd1243dSDimitry Andric                                  ArrayRef<int> Mask,
152bdd1243dSDimitry Andric                                  TTI::TargetCostKind CostKind, int Index,
15381ad6265SDimitry Andric                                  VectorType *SubTp,
154*0fca6ea1SDimitry Andric                                  ArrayRef<const Value *> Args = std::nullopt,
155*0fca6ea1SDimitry Andric                                  const Instruction *CxtI = nullptr);
156fe6060f1SDimitry Andric   InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
157fe6060f1SDimitry Andric                                    TTI::CastContextHint CCH,
158fe6060f1SDimitry Andric                                    TTI::TargetCostKind CostKind,
1590b57cec5SDimitry Andric                                    const Instruction *I = nullptr);
160fe6060f1SDimitry Andric   InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
161e8d8bef9SDimitry Andric                                      CmpInst::Predicate VecPred,
1625ffd83dbSDimitry Andric                                      TTI::TargetCostKind CostKind,
1630b57cec5SDimitry Andric                                      const Instruction *I = nullptr);
164bdd1243dSDimitry Andric   using BaseT::getVectorInstrCost;
165fe6060f1SDimitry Andric   InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val,
166bdd1243dSDimitry Andric                                      TTI::TargetCostKind CostKind,
167bdd1243dSDimitry Andric                                      unsigned Index, Value *Op0, Value *Op1);
168fe6060f1SDimitry Andric   InstructionCost getScalarizationOverhead(VectorType *Ty,
169fe6060f1SDimitry Andric                                            const APInt &DemandedElts,
170bdd1243dSDimitry Andric                                            bool Insert, bool Extract,
171bdd1243dSDimitry Andric                                            TTI::TargetCostKind CostKind);
172349cc55cSDimitry Andric   InstructionCost getReplicationShuffleCost(Type *EltTy, int ReplicationFactor,
173349cc55cSDimitry Andric                                             int VF,
174349cc55cSDimitry Andric                                             const APInt &DemandedDstElts,
175349cc55cSDimitry Andric                                             TTI::TargetCostKind CostKind);
176bdd1243dSDimitry Andric   InstructionCost
177bdd1243dSDimitry Andric   getMemoryOpCost(unsigned Opcode, Type *Src, MaybeAlign Alignment,
178bdd1243dSDimitry Andric                   unsigned AddressSpace, TTI::TargetCostKind CostKind,
179bdd1243dSDimitry Andric                   TTI::OperandValueInfo OpInfo = {TTI::OK_AnyValue, TTI::OP_None},
1805ffd83dbSDimitry Andric                   const Instruction *I = nullptr);
181349cc55cSDimitry Andric   InstructionCost getMaskedMemoryOpCost(unsigned Opcode, Type *Src,
182349cc55cSDimitry Andric                                         Align Alignment, unsigned AddressSpace,
183349cc55cSDimitry Andric                                         TTI::TargetCostKind CostKind);
184fe6060f1SDimitry Andric   InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy,
185fe6060f1SDimitry Andric                                          const Value *Ptr, bool VariableMask,
186fe6060f1SDimitry Andric                                          Align Alignment,
1875ffd83dbSDimitry Andric                                          TTI::TargetCostKind CostKind,
1885ffd83dbSDimitry Andric                                          const Instruction *I);
18906c3fb27SDimitry Andric   InstructionCost getPointersChainCost(ArrayRef<const Value *> Ptrs,
19006c3fb27SDimitry Andric                                        const Value *Base,
19106c3fb27SDimitry Andric                                        const TTI::PointersChainInfo &Info,
19206c3fb27SDimitry Andric                                        Type *AccessTy,
19306c3fb27SDimitry Andric                                        TTI::TargetCostKind CostKind);
194fe6060f1SDimitry Andric   InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE,
1950b57cec5SDimitry Andric                                             const SCEV *Ptr);
1960b57cec5SDimitry Andric 
197bdd1243dSDimitry Andric   std::optional<Instruction *> instCombineIntrinsic(InstCombiner &IC,
198e8d8bef9SDimitry Andric                                                     IntrinsicInst &II) const;
199bdd1243dSDimitry Andric   std::optional<Value *>
200e8d8bef9SDimitry Andric   simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
201e8d8bef9SDimitry Andric                                    APInt DemandedMask, KnownBits &Known,
202e8d8bef9SDimitry Andric                                    bool &KnownBitsComputed) const;
203bdd1243dSDimitry Andric   std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
204e8d8bef9SDimitry Andric       InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
205e8d8bef9SDimitry Andric       APInt &UndefElts2, APInt &UndefElts3,
206e8d8bef9SDimitry Andric       std::function<void(Instruction *, unsigned, APInt, APInt &)>
207e8d8bef9SDimitry Andric           SimplifyAndSetOp) const;
208e8d8bef9SDimitry Andric 
2090b57cec5SDimitry Andric   unsigned getAtomicMemIntrinsicMaxElementSize() const;
2100b57cec5SDimitry Andric 
211fe6060f1SDimitry Andric   InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
2125ffd83dbSDimitry Andric                                         TTI::TargetCostKind CostKind);
2130b57cec5SDimitry Andric 
214349cc55cSDimitry Andric   InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
215bdd1243dSDimitry Andric                                              std::optional<FastMathFlags> FMF,
216349cc55cSDimitry Andric                                              TTI::TargetCostKind CostKind);
2170b57cec5SDimitry Andric 
21806c3fb27SDimitry Andric   InstructionCost getMinMaxCost(Intrinsic::ID IID, Type *Ty,
21906c3fb27SDimitry Andric                                 TTI::TargetCostKind CostKind,
22006c3fb27SDimitry Andric                                 FastMathFlags FMF);
2210b57cec5SDimitry Andric 
22206c3fb27SDimitry Andric   InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty,
22306c3fb27SDimitry Andric                                          FastMathFlags FMF,
2245ffd83dbSDimitry Andric                                          TTI::TargetCostKind CostKind);
2255ffd83dbSDimitry Andric 
226fe6060f1SDimitry Andric   InstructionCost getInterleavedMemoryOpCost(
2275ffd83dbSDimitry Andric       unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
228349cc55cSDimitry Andric       Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
2295ffd83dbSDimitry Andric       bool UseMaskForCond = false, bool UseMaskForGaps = false);
230fe6060f1SDimitry Andric   InstructionCost getInterleavedMemoryOpCostAVX512(
2315ffd83dbSDimitry Andric       unsigned Opcode, FixedVectorType *VecTy, unsigned Factor,
2325ffd83dbSDimitry Andric       ArrayRef<unsigned> Indices, Align Alignment, unsigned AddressSpace,
233349cc55cSDimitry Andric       TTI::TargetCostKind CostKind, bool UseMaskForCond = false,
234349cc55cSDimitry Andric       bool UseMaskForGaps = false);
2350b57cec5SDimitry Andric 
236fe6060f1SDimitry Andric   InstructionCost getIntImmCost(int64_t);
2370b57cec5SDimitry Andric 
238fe6060f1SDimitry Andric   InstructionCost getIntImmCost(const APInt &Imm, Type *Ty,
239fe6060f1SDimitry Andric                                 TTI::TargetCostKind CostKind);
2400b57cec5SDimitry Andric 
241fe6060f1SDimitry Andric   InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind,
242fe6060f1SDimitry Andric                                  const Instruction *I = nullptr);
2430b57cec5SDimitry Andric 
244fe6060f1SDimitry Andric   InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
245fe6060f1SDimitry Andric                                     const APInt &Imm, Type *Ty,
246fe6060f1SDimitry Andric                                     TTI::TargetCostKind CostKind,
247e8d8bef9SDimitry Andric                                     Instruction *Inst = nullptr);
248fe6060f1SDimitry Andric   InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx,
249fe6060f1SDimitry Andric                                       const APInt &Imm, Type *Ty,
250fe6060f1SDimitry Andric                                       TTI::TargetCostKind CostKind);
251bdd1243dSDimitry Andric   /// Return the cost of the scaling factor used in the addressing
252bdd1243dSDimitry Andric   /// mode represented by AM for this target, for a load/store
253bdd1243dSDimitry Andric   /// of the specified type.
254bdd1243dSDimitry Andric   /// If the AM is supported, the return value must be >= 0.
255bdd1243dSDimitry Andric   /// If the AM is not supported, it returns a negative value.
256bdd1243dSDimitry Andric   InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
257*0fca6ea1SDimitry Andric                                        StackOffset BaseOffset, bool HasBaseReg,
258bdd1243dSDimitry Andric                                        int64_t Scale, unsigned AddrSpace) const;
259bdd1243dSDimitry Andric 
26081ad6265SDimitry Andric   bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1,
26181ad6265SDimitry Andric                      const TargetTransformInfo::LSRCost &C2);
2620b57cec5SDimitry Andric   bool canMacroFuseCmp();
2635ffd83dbSDimitry Andric   bool isLegalMaskedLoad(Type *DataType, Align Alignment);
2645ffd83dbSDimitry Andric   bool isLegalMaskedStore(Type *DataType, Align Alignment);
2658bcb0991SDimitry Andric   bool isLegalNTLoad(Type *DataType, Align Alignment);
2668bcb0991SDimitry Andric   bool isLegalNTStore(Type *DataType, Align Alignment);
26781ad6265SDimitry Andric   bool isLegalBroadcastLoad(Type *ElementTy, ElementCount NumElements) const;
26804eeddc0SDimitry Andric   bool forceScalarizeMaskedGather(VectorType *VTy, Align Alignment);
forceScalarizeMaskedScatter(VectorType * VTy,Align Alignment)26904eeddc0SDimitry Andric   bool forceScalarizeMaskedScatter(VectorType *VTy, Align Alignment) {
27004eeddc0SDimitry Andric     return forceScalarizeMaskedGather(VTy, Alignment);
27104eeddc0SDimitry Andric   }
2728a4dda33SDimitry Andric   bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment);
2735ffd83dbSDimitry Andric   bool isLegalMaskedGather(Type *DataType, Align Alignment);
2745ffd83dbSDimitry Andric   bool isLegalMaskedScatter(Type *DataType, Align Alignment);
275*0fca6ea1SDimitry Andric   bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment);
276*0fca6ea1SDimitry Andric   bool isLegalMaskedCompressStore(Type *DataType, Align Alignment);
27781ad6265SDimitry Andric   bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
27881ad6265SDimitry Andric                        const SmallBitVector &OpcodeMask) const;
2790b57cec5SDimitry Andric   bool hasDivRemOp(Type *DataType, bool IsSigned);
280bdd1243dSDimitry Andric   bool isExpensiveToSpeculativelyExecute(const Instruction *I);
2810b57cec5SDimitry Andric   bool isFCmpOrdCheaperThanFCmpZero(Type *Ty);
2820b57cec5SDimitry Andric   bool areInlineCompatible(const Function *Caller,
2830b57cec5SDimitry Andric                            const Function *Callee) const;
2840eae32dcSDimitry Andric   bool areTypesABICompatible(const Function *Caller, const Function *Callee,
2850eae32dcSDimitry Andric                              const ArrayRef<Type *> &Type) const;
28606c3fb27SDimitry Andric 
getMaxMemIntrinsicInlineSizeThreshold()28706c3fb27SDimitry Andric   uint64_t getMaxMemIntrinsicInlineSizeThreshold() const {
28806c3fb27SDimitry Andric     return ST->getMaxInlineSizeThreshold();
28906c3fb27SDimitry Andric   }
29006c3fb27SDimitry Andric 
2910b57cec5SDimitry Andric   TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize,
2920b57cec5SDimitry Andric                                                     bool IsZeroCmp) const;
293349cc55cSDimitry Andric   bool prefersVectorizedAddressing() const;
294349cc55cSDimitry Andric   bool supportsEfficientVectorElementLoadStore() const;
2950b57cec5SDimitry Andric   bool enableInterleavedAccessVectorization();
2965ffd83dbSDimitry Andric 
297*0fca6ea1SDimitry Andric   InstructionCost getBranchMispredictPenalty() const;
298*0fca6ea1SDimitry Andric 
2990b57cec5SDimitry Andric private:
300349cc55cSDimitry Andric   bool supportsGather() const;
301*0fca6ea1SDimitry Andric   InstructionCost getGSVectorCost(unsigned Opcode, TTI::TargetCostKind CostKind,
302*0fca6ea1SDimitry Andric                                   Type *DataTy, const Value *Ptr,
303*0fca6ea1SDimitry Andric                                   Align Alignment, unsigned AddressSpace);
3040b57cec5SDimitry Andric 
305e8d8bef9SDimitry Andric   int getGatherOverhead() const;
306e8d8bef9SDimitry Andric   int getScatterOverhead() const;
307e8d8bef9SDimitry Andric 
3080b57cec5SDimitry Andric   /// @}
3090b57cec5SDimitry Andric };
3100b57cec5SDimitry Andric 
3110b57cec5SDimitry Andric } // end namespace llvm
3120b57cec5SDimitry Andric 
3130b57cec5SDimitry Andric #endif
314