blob: 9a320bdfcc3d4aee3470ee4d6432cec6cc91e050 [file] [log] [blame]
Chandler Carruth93dcdc42015-01-31 11:17:59 +00001//===-- AMDGPUTargetTransformInfo.h - AMDGPU specific TTI -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9/// \file
10/// This file a TargetTransformInfo::Concept conforming object specific to the
11/// AMDGPU target machine. It uses the target's detailed information to
12/// provide more precise answers to certain TTI queries, while letting the
13/// target independent and default TTI implementations handle the rest.
14///
15//===----------------------------------------------------------------------===//
16
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000017#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETTRANSFORMINFO_H
18#define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETTRANSFORMINFO_H
Chandler Carruth93dcdc42015-01-31 11:17:59 +000019
20#include "AMDGPU.h"
21#include "AMDGPUTargetMachine.h"
22#include "llvm/Analysis/TargetTransformInfo.h"
23#include "llvm/CodeGen/BasicTTIImpl.h"
Chandler Carruth93dcdc42015-01-31 11:17:59 +000024
25namespace llvm {
Matt Arsenault96518132016-03-25 01:00:32 +000026class AMDGPUTargetLowering;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000027
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000028class AMDGPUTTIImpl final : public BasicTTIImplBase<AMDGPUTTIImpl> {
Chandler Carruth93dcdc42015-01-31 11:17:59 +000029 typedef BasicTTIImplBase<AMDGPUTTIImpl> BaseT;
30 typedef TargetTransformInfo TTI;
Chandler Carruthc340ca82015-02-01 14:01:15 +000031 friend BaseT;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000032
33 const AMDGPUSubtarget *ST;
Chandler Carruthc340ca82015-02-01 14:01:15 +000034 const AMDGPUTargetLowering *TLI;
Matt Arsenaultb6491cc2017-01-31 01:20:54 +000035 bool IsGraphicsShader;
Chandler Carruthc340ca82015-02-01 14:01:15 +000036
Chandler Carruthc956ab662015-02-01 14:22:17 +000037 const AMDGPUSubtarget *getST() const { return ST; }
Chandler Carruthc340ca82015-02-01 14:01:15 +000038 const AMDGPUTargetLowering *getTLI() const { return TLI; }
Chandler Carruth93dcdc42015-01-31 11:17:59 +000039
Matt Arsenault96518132016-03-25 01:00:32 +000040
41 static inline int getFullRateInstrCost() {
42 return TargetTransformInfo::TCC_Basic;
43 }
44
45 static inline int getHalfRateInstrCost() {
46 return 2 * TargetTransformInfo::TCC_Basic;
47 }
48
49 // TODO: The size is usually 8 bytes, but takes 4x as many cycles. Maybe
50 // should be 2 or 4.
51 static inline int getQuarterRateInstrCost() {
52 return 3 * TargetTransformInfo::TCC_Basic;
53 }
54
55 // On some parts, normal fp64 operations are half rate, and others
56 // quarter. This also applies to some integer operations.
57 inline int get64BitInstrCost() const {
58 return ST->hasHalfRate64Ops() ?
59 getHalfRateInstrCost() : getQuarterRateInstrCost();
60 }
61
Chandler Carruth93dcdc42015-01-31 11:17:59 +000062public:
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000063 explicit AMDGPUTTIImpl(const AMDGPUTargetMachine *TM, const Function &F)
64 : BaseT(TM, F.getParent()->getDataLayout()),
65 ST(TM->getSubtargetImpl(F)),
Matt Arsenaultb6491cc2017-01-31 01:20:54 +000066 TLI(ST->getTargetLowering()),
67 IsGraphicsShader(AMDGPU::isShader(F.getCallingConv())) {}
Chandler Carruth93dcdc42015-01-31 11:17:59 +000068
Chandler Carruth93dcdc42015-01-31 11:17:59 +000069 bool hasBranchDivergence() { return true; }
70
Geoff Berry66d9bdb2017-06-28 15:53:17 +000071 void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
72 TTI::UnrollingPreferences &UP);
Chandler Carruth93dcdc42015-01-31 11:17:59 +000073
74 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) {
75 assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
Matt Arsenault1735da42016-05-18 16:10:19 +000076 return TTI::PSK_FastHardware;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000077 }
78
Matt Arsenault67cd3472017-06-20 20:38:06 +000079 unsigned getHardwareNumberOfRegisters(bool Vector) const;
80 unsigned getNumberOfRegisters(bool Vector) const;
81 unsigned getRegisterBitWidth(bool Vector) const ;
82 unsigned getMinVectorRegisterBitWidth() const;
Volkan Keles1c386812016-10-03 10:31:34 +000083 unsigned getLoadStoreVecRegBitWidth(unsigned AddrSpace) const;
Matt Arsenaultf0a88db2017-02-23 03:58:53 +000084
85 bool isLegalToVectorizeMemChain(unsigned ChainSizeInBytes,
86 unsigned Alignment,
87 unsigned AddrSpace) const;
88 bool isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes,
89 unsigned Alignment,
90 unsigned AddrSpace) const;
91 bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes,
92 unsigned Alignment,
93 unsigned AddrSpace) const;
94
Wei Mi062c7442015-05-06 17:12:25 +000095 unsigned getMaxInterleaveFactor(unsigned VF);
Matt Arsenaulte830f542015-12-01 19:08:39 +000096
Matt Arsenault96518132016-03-25 01:00:32 +000097 int getArithmeticInstrCost(
98 unsigned Opcode, Type *Ty,
99 TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
100 TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
101 TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
Mohammed Agabaria2c96c432017-01-11 08:23:37 +0000102 TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
103 ArrayRef<const Value *> Args = ArrayRef<const Value *>());
Matt Arsenault96518132016-03-25 01:00:32 +0000104
Matt Arsenaulte05ff152015-12-16 18:37:19 +0000105 unsigned getCFInstrCost(unsigned Opcode);
106
Matt Arsenaulte830f542015-12-01 19:08:39 +0000107 int getVectorInstrCost(unsigned Opcode, Type *ValTy, unsigned Index);
Tom Stellarddbe374b2015-12-15 18:04:38 +0000108 bool isSourceOfDivergence(const Value *V) const;
Alexander Timofeev0f9c84c2017-06-15 19:33:10 +0000109 bool isAlwaysUniform(const Value *V) const;
Michael Kupersteinaa71bdd2016-07-06 17:30:56 +0000110
Matt Arsenaultb6491cc2017-01-31 01:20:54 +0000111 unsigned getFlatAddressSpace() const {
112 // Don't bother running InferAddressSpaces pass on graphics shaders which
113 // don't use flat addressing.
114 if (IsGraphicsShader)
115 return -1;
Matt Arsenault1575cb82017-01-31 23:48:37 +0000116 return ST->hasFlatAddressSpace() ?
Yaxun Liu1a14bfa2017-03-27 14:04:01 +0000117 ST->getAMDGPUAS().FLAT_ADDRESS : ST->getAMDGPUAS().UNKNOWN_ADDRESS_SPACE;
Matt Arsenaultb6491cc2017-01-31 01:20:54 +0000118 }
119
Michael Kupersteinaa71bdd2016-07-06 17:30:56 +0000120 unsigned getVectorSplitCost() { return 0; }
Matt Arsenault3c5e4232017-05-10 21:29:33 +0000121
122 unsigned getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
123 Type *SubTp);
Chandler Carruth93dcdc42015-01-31 11:17:59 +0000124};
125
126} // end namespace llvm
127
128#endif