diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h | 106 |
1 files changed, 37 insertions, 69 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h index 3364a9bcaccb..b29c94180fb8 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h @@ -19,22 +19,18 @@ #include "AMDGPU.h" #include "AMDGPUSubtarget.h" -#include "AMDGPUTargetMachine.h" #include "MCTargetDesc/AMDGPUMCTargetDesc.h" -#include "Utils/AMDGPUBaseInfo.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/BasicTTIImpl.h" -#include "llvm/IR/Function.h" -#include "llvm/MC/SubtargetFeature.h" -#include "llvm/Support/MathExtras.h" -#include <cassert> namespace llvm { class AMDGPUTargetLowering; +class GCNSubtarget; +class InstCombiner; class Loop; +class R600Subtarget; class ScalarEvolution; +class SITargetLowering; class Type; class Value; @@ -46,18 +42,14 @@ class AMDGPUTTIImpl final : public BasicTTIImplBase<AMDGPUTTIImpl> { Triple TargetTriple; - const GCNSubtarget *ST; + const TargetSubtargetInfo *ST; const TargetLoweringBase *TLI; const TargetSubtargetInfo *getST() const { return ST; } const TargetLoweringBase *getTLI() const { return TLI; } public: - explicit AMDGPUTTIImpl(const AMDGPUTargetMachine *TM, const Function &F) - : BaseT(TM, F.getParent()->getDataLayout()), - TargetTriple(TM->getTargetTriple()), - ST(static_cast<const GCNSubtarget *>(TM->getSubtargetImpl(F))), - TLI(ST->getTargetLowering()) {} + explicit AMDGPUTTIImpl(const AMDGPUTargetMachine *TM, const Function &F); void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP); @@ -75,73 +67,41 @@ class GCNTTIImpl final : public BasicTTIImplBase<GCNTTIImpl> { const GCNSubtarget *ST; const SITargetLowering *TLI; AMDGPUTTIImpl CommonTTI; - bool IsGraphicsShader; + bool IsGraphics; bool HasFP32Denormals; + bool HasFP64FP16Denormals; unsigned MaxVGPRs; - const FeatureBitset InlineFeatureIgnoreList = { - // Codegen control options which don't matter. - AMDGPU::FeatureEnableLoadStoreOpt, - AMDGPU::FeatureEnableSIScheduler, - AMDGPU::FeatureEnableUnsafeDSOffsetFolding, - AMDGPU::FeatureFlatForGlobal, - AMDGPU::FeaturePromoteAlloca, - AMDGPU::FeatureUnalignedBufferAccess, - AMDGPU::FeatureUnalignedScratchAccess, - - AMDGPU::FeatureAutoWaitcntBeforeBarrier, - - // Property of the kernel/environment which can't actually differ. - AMDGPU::FeatureSGPRInitBug, - AMDGPU::FeatureXNACK, - AMDGPU::FeatureTrapHandler, - AMDGPU::FeatureCodeObjectV3, - - // The default assumption needs to be ecc is enabled, but no directly - // exposed operations depend on it, so it can be safely inlined. - AMDGPU::FeatureSRAMECC, - - // Perf-tuning features - AMDGPU::FeatureFastFMAF32, - AMDGPU::HalfRate64Ops - }; + static const FeatureBitset InlineFeatureIgnoreList; const GCNSubtarget *getST() const { return ST; } - const AMDGPUTargetLowering *getTLI() const { return TLI; } + const SITargetLowering *getTLI() const { return TLI; } static inline int getFullRateInstrCost() { return TargetTransformInfo::TCC_Basic; } - static inline int getHalfRateInstrCost() { - return 2 * TargetTransformInfo::TCC_Basic; + static inline int getHalfRateInstrCost( + TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) { + return CostKind == TTI::TCK_CodeSize ? 2 + : 2 * TargetTransformInfo::TCC_Basic; } // TODO: The size is usually 8 bytes, but takes 4x as many cycles. Maybe // should be 2 or 4. - static inline int getQuarterRateInstrCost() { - return 3 * TargetTransformInfo::TCC_Basic; + static inline int getQuarterRateInstrCost( + TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) { + return CostKind == TTI::TCK_CodeSize ? 2 + : 4 * TargetTransformInfo::TCC_Basic; } - // On some parts, normal fp64 operations are half rate, and others - // quarter. This also applies to some integer operations. - inline int get64BitInstrCost() const { - return ST->hasHalfRate64Ops() ? - getHalfRateInstrCost() : getQuarterRateInstrCost(); - } + // On some parts, normal fp64 operations are half rate, and others + // quarter. This also applies to some integer operations. + int get64BitInstrCost( + TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) const; public: - explicit GCNTTIImpl(const AMDGPUTargetMachine *TM, const Function &F) - : BaseT(TM, F.getParent()->getDataLayout()), - ST(static_cast<const GCNSubtarget*>(TM->getSubtargetImpl(F))), - TLI(ST->getTargetLowering()), - CommonTTI(TM, F), - IsGraphicsShader(AMDGPU::isShader(F.getCallingConv())), - HasFP32Denormals(AMDGPU::SIModeRegisterDefaults(F).allFP32Denormals()), - MaxVGPRs(ST->getMaxNumVGPRs( - std::max(ST->getWavesPerEU(F).first, - ST->getWavesPerEUForWorkGroup( - ST->getFlatWorkGroupSizes(F).second)))) {} + explicit GCNTTIImpl(const AMDGPUTargetMachine *TM, const Function &F); bool hasBranchDivergence() { return true; } bool useGPUDivergenceAnalysis() const; @@ -162,6 +122,7 @@ public: unsigned getNumberOfRegisters(unsigned RCID) const; unsigned getRegisterBitWidth(bool Vector) const; unsigned getMinVectorRegisterBitWidth() const; + unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const; unsigned getLoadVectorFactor(unsigned VF, unsigned LoadSize, unsigned ChainSizeInBytes, VectorType *VecTy) const; @@ -213,7 +174,7 @@ public: unsigned getFlatAddressSpace() const { // Don't bother running InferAddressSpaces pass on graphics shaders which // don't use flat addressing. - if (IsGraphicsShader) + if (IsGraphics) return -1; return AMDGPUAS::FLAT_ADDRESS; } @@ -223,6 +184,16 @@ public: Value *rewriteIntrinsicWithAddressSpace(IntrinsicInst *II, Value *OldV, Value *NewV) const; + bool canSimplifyLegacyMulToMul(const Value *Op0, const Value *Op1, + InstCombiner &IC) const; + Optional<Instruction *> instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; + Optional<Value *> simplifyDemandedVectorEltsIntrinsic( + InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, + APInt &UndefElts2, APInt &UndefElts3, + std::function<void(Instruction *, unsigned, APInt, APInt &)> + SimplifyAndSetOp) const; + unsigned getVectorSplitCost() { return 0; } unsigned getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, int Index, @@ -232,6 +203,7 @@ public: const Function *Callee) const; unsigned getInliningThresholdMultiplier() { return 11; } + unsigned adjustInliningThreshold(const CallBase *CB) const; int getInlinerVectorBonusPercent() { return 0; } @@ -259,11 +231,7 @@ class R600TTIImpl final : public BasicTTIImplBase<R600TTIImpl> { AMDGPUTTIImpl CommonTTI; public: - explicit R600TTIImpl(const AMDGPUTargetMachine *TM, const Function &F) - : BaseT(TM, F.getParent()->getDataLayout()), - ST(static_cast<const R600Subtarget*>(TM->getSubtargetImpl(F))), - TLI(ST->getTargetLowering()), - CommonTTI(TM, F) {} + explicit R600TTIImpl(const AMDGPUTargetMachine *TM, const Function &F); const R600Subtarget *getST() const { return ST; } const AMDGPUTargetLowering *getTLI() const { return TLI; } |
