summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h106
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; }