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