blob: 036f627e4662eed1c3a45eb5a2b51d55cce981de [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;
35
Chandler Carruthc956ab662015-02-01 14:22:17 +000036 const AMDGPUSubtarget *getST() const { return ST; }
Chandler Carruthc340ca82015-02-01 14:01:15 +000037 const AMDGPUTargetLowering *getTLI() const { return TLI; }
Chandler Carruth93dcdc42015-01-31 11:17:59 +000038
Matt Arsenault96518132016-03-25 01:00:32 +000039
40 static inline int getFullRateInstrCost() {
41 return TargetTransformInfo::TCC_Basic;
42 }
43
44 static inline int getHalfRateInstrCost() {
45 return 2 * TargetTransformInfo::TCC_Basic;
46 }
47
48 // TODO: The size is usually 8 bytes, but takes 4x as many cycles. Maybe
49 // should be 2 or 4.
50 static inline int getQuarterRateInstrCost() {
51 return 3 * TargetTransformInfo::TCC_Basic;
52 }
53
54 // On some parts, normal fp64 operations are half rate, and others
55 // quarter. This also applies to some integer operations.
56 inline int get64BitInstrCost() const {
57 return ST->hasHalfRate64Ops() ?
58 getHalfRateInstrCost() : getQuarterRateInstrCost();
59 }
60
Chandler Carruth93dcdc42015-01-31 11:17:59 +000061public:
Mehdi Amini5010ebf2015-07-09 02:08:42 +000062 explicit AMDGPUTTIImpl(const AMDGPUTargetMachine *TM, const DataLayout &DL)
63 : BaseT(TM, DL), ST(TM->getSubtargetImpl()),
64 TLI(ST->getTargetLowering()) {}
Chandler Carruth93dcdc42015-01-31 11:17:59 +000065
66 // Provide value semantics. MSVC requires that we spell all of these out.
67 AMDGPUTTIImpl(const AMDGPUTTIImpl &Arg)
Chandler Carruthc956ab662015-02-01 14:22:17 +000068 : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {}
Chandler Carruth93dcdc42015-01-31 11:17:59 +000069 AMDGPUTTIImpl(AMDGPUTTIImpl &&Arg)
Chandler Carruthc956ab662015-02-01 14:22:17 +000070 : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)),
71 TLI(std::move(Arg.TLI)) {}
Chandler Carruth93dcdc42015-01-31 11:17:59 +000072
73 bool hasBranchDivergence() { return true; }
74
Chandler Carruthab5cb362015-02-01 14:31:23 +000075 void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
Chandler Carruth93dcdc42015-01-31 11:17:59 +000076
77 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) {
78 assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
79 return ST->hasBCNT(TyWidth) ? TTI::PSK_FastHardware : TTI::PSK_Software;
80 }
81
82 unsigned getNumberOfRegisters(bool Vector);
83 unsigned getRegisterBitWidth(bool Vector);
Wei Mi062c7442015-05-06 17:12:25 +000084 unsigned getMaxInterleaveFactor(unsigned VF);
Matt Arsenaulte830f542015-12-01 19:08:39 +000085
Matt Arsenault96518132016-03-25 01:00:32 +000086 int getArithmeticInstrCost(
87 unsigned Opcode, Type *Ty,
88 TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
89 TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
90 TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
91 TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None);
92
Matt Arsenaulte05ff152015-12-16 18:37:19 +000093 unsigned getCFInstrCost(unsigned Opcode);
94
Matt Arsenaulte830f542015-12-01 19:08:39 +000095 int getVectorInstrCost(unsigned Opcode, Type *ValTy, unsigned Index);
Tom Stellarddbe374b2015-12-15 18:04:38 +000096 bool isSourceOfDivergence(const Value *V) const;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000097};
98
99} // end namespace llvm
100
101#endif