1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUTargetTransformInfo.h - AMDGPU specific TTI -------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker /// \file 10*9880d681SAndroid Build Coastguard Worker /// This file a TargetTransformInfo::Concept conforming object specific to the 11*9880d681SAndroid Build Coastguard Worker /// AMDGPU target machine. It uses the target's detailed information to 12*9880d681SAndroid Build Coastguard Worker /// provide more precise answers to certain TTI queries, while letting the 13*9880d681SAndroid Build Coastguard Worker /// target independent and default TTI implementations handle the rest. 14*9880d681SAndroid Build Coastguard Worker /// 15*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETTRANSFORMINFO_H 18*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETTRANSFORMINFO_H 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker #include "AMDGPU.h" 21*9880d681SAndroid Build Coastguard Worker #include "AMDGPUTargetMachine.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/BasicTTIImpl.h" 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker namespace llvm { 26*9880d681SAndroid Build Coastguard Worker class AMDGPUTargetLowering; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker class AMDGPUTTIImpl final : public BasicTTIImplBase<AMDGPUTTIImpl> { 29*9880d681SAndroid Build Coastguard Worker typedef BasicTTIImplBase<AMDGPUTTIImpl> BaseT; 30*9880d681SAndroid Build Coastguard Worker typedef TargetTransformInfo TTI; 31*9880d681SAndroid Build Coastguard Worker friend BaseT; 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker const AMDGPUSubtarget *ST; 34*9880d681SAndroid Build Coastguard Worker const AMDGPUTargetLowering *TLI; 35*9880d681SAndroid Build Coastguard Worker getST()36*9880d681SAndroid Build Coastguard Worker const AMDGPUSubtarget *getST() const { return ST; } getTLI()37*9880d681SAndroid Build Coastguard Worker const AMDGPUTargetLowering *getTLI() const { return TLI; } 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker getFullRateInstrCost()40*9880d681SAndroid Build Coastguard Worker static inline int getFullRateInstrCost() { 41*9880d681SAndroid Build Coastguard Worker return TargetTransformInfo::TCC_Basic; 42*9880d681SAndroid Build Coastguard Worker } 43*9880d681SAndroid Build Coastguard Worker getHalfRateInstrCost()44*9880d681SAndroid Build Coastguard Worker static inline int getHalfRateInstrCost() { 45*9880d681SAndroid Build Coastguard Worker return 2 * TargetTransformInfo::TCC_Basic; 46*9880d681SAndroid Build Coastguard Worker } 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker // TODO: The size is usually 8 bytes, but takes 4x as many cycles. Maybe 49*9880d681SAndroid Build Coastguard Worker // should be 2 or 4. getQuarterRateInstrCost()50*9880d681SAndroid Build Coastguard Worker static inline int getQuarterRateInstrCost() { 51*9880d681SAndroid Build Coastguard Worker return 3 * TargetTransformInfo::TCC_Basic; 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker // On some parts, normal fp64 operations are half rate, and others 55*9880d681SAndroid Build Coastguard Worker // quarter. This also applies to some integer operations. get64BitInstrCost()56*9880d681SAndroid Build Coastguard Worker inline int get64BitInstrCost() const { 57*9880d681SAndroid Build Coastguard Worker return ST->hasHalfRate64Ops() ? 58*9880d681SAndroid Build Coastguard Worker getHalfRateInstrCost() : getQuarterRateInstrCost(); 59*9880d681SAndroid Build Coastguard Worker } 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker public: AMDGPUTTIImpl(const AMDGPUTargetMachine * TM,const Function & F)62*9880d681SAndroid Build Coastguard Worker explicit AMDGPUTTIImpl(const AMDGPUTargetMachine *TM, const Function &F) 63*9880d681SAndroid Build Coastguard Worker : BaseT(TM, F.getParent()->getDataLayout()), 64*9880d681SAndroid Build Coastguard Worker ST(TM->getSubtargetImpl(F)), 65*9880d681SAndroid Build Coastguard Worker TLI(ST->getTargetLowering()) {} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker // Provide value semantics. MSVC requires that we spell all of these out. AMDGPUTTIImpl(const AMDGPUTTIImpl & Arg)68*9880d681SAndroid Build Coastguard Worker AMDGPUTTIImpl(const AMDGPUTTIImpl &Arg) 69*9880d681SAndroid Build Coastguard Worker : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {} AMDGPUTTIImpl(AMDGPUTTIImpl && Arg)70*9880d681SAndroid Build Coastguard Worker AMDGPUTTIImpl(AMDGPUTTIImpl &&Arg) 71*9880d681SAndroid Build Coastguard Worker : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)), 72*9880d681SAndroid Build Coastguard Worker TLI(std::move(Arg.TLI)) {} 73*9880d681SAndroid Build Coastguard Worker hasBranchDivergence()74*9880d681SAndroid Build Coastguard Worker bool hasBranchDivergence() { return true; } 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP); 77*9880d681SAndroid Build Coastguard Worker getPopcntSupport(unsigned TyWidth)78*9880d681SAndroid Build Coastguard Worker TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) { 79*9880d681SAndroid Build Coastguard Worker assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2"); 80*9880d681SAndroid Build Coastguard Worker return TTI::PSK_FastHardware; 81*9880d681SAndroid Build Coastguard Worker } 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker unsigned getNumberOfRegisters(bool Vector); 84*9880d681SAndroid Build Coastguard Worker unsigned getRegisterBitWidth(bool Vector); 85*9880d681SAndroid Build Coastguard Worker unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace); 86*9880d681SAndroid Build Coastguard Worker unsigned getMaxInterleaveFactor(unsigned VF); 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker int getArithmeticInstrCost( 89*9880d681SAndroid Build Coastguard Worker unsigned Opcode, Type *Ty, 90*9880d681SAndroid Build Coastguard Worker TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue, 91*9880d681SAndroid Build Coastguard Worker TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue, 92*9880d681SAndroid Build Coastguard Worker TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None, 93*9880d681SAndroid Build Coastguard Worker TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None); 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker unsigned getCFInstrCost(unsigned Opcode); 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker int getVectorInstrCost(unsigned Opcode, Type *ValTy, unsigned Index); 98*9880d681SAndroid Build Coastguard Worker bool isSourceOfDivergence(const Value *V) const; 99*9880d681SAndroid Build Coastguard Worker getVectorSplitCost()100*9880d681SAndroid Build Coastguard Worker unsigned getVectorSplitCost() { return 0; } 101*9880d681SAndroid Build Coastguard Worker }; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker #endif 106