LLVM  13.0.0git
LanaiTargetTransformInfo.h
Go to the documentation of this file.
1 //===-- LanaiTargetTransformInfo.h - Lanai specific TTI ---------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file a TargetTransformInfo::Concept conforming object specific to the
10 // Lanai target machine. It uses the target's detailed information to
11 // provide more precise answers to certain TTI queries, while letting the
12 // target independent and default TTI implementations handle the rest.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_LIB_TARGET_LANAI_LANAITARGETTRANSFORMINFO_H
17 #define LLVM_LIB_TARGET_LANAI_LANAITARGETTRANSFORMINFO_H
18 
19 #include "Lanai.h"
20 #include "LanaiSubtarget.h"
21 #include "LanaiTargetMachine.h"
26 
27 namespace llvm {
28 class LanaiTTIImpl : public BasicTTIImplBase<LanaiTTIImpl> {
30  typedef TargetTransformInfo TTI;
31  friend BaseT;
32 
33  const LanaiSubtarget *ST;
34  const LanaiTargetLowering *TLI;
35 
36  const LanaiSubtarget *getST() const { return ST; }
37  const LanaiTargetLowering *getTLI() const { return TLI; }
38 
39 public:
40  explicit LanaiTTIImpl(const LanaiTargetMachine *TM, const Function &F)
41  : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)),
42  TLI(ST->getTargetLowering()) {}
43 
44  bool shouldBuildLookupTables() const { return false; }
45 
47  if (TyWidth == 32)
48  return TTI::PSK_FastHardware;
49  return TTI::PSK_Software;
50  }
51 
53  assert(Ty->isIntegerTy());
54  if (Imm == 0)
55  return TTI::TCC_Free;
56  if (isInt<16>(Imm.getSExtValue()))
57  return TTI::TCC_Basic;
58  if (isInt<21>(Imm.getZExtValue()))
59  return TTI::TCC_Basic;
60  if (isInt<32>(Imm.getSExtValue())) {
61  if ((Imm.getSExtValue() & 0xFFFF) == 0)
62  return TTI::TCC_Basic;
63  return 2 * TTI::TCC_Basic;
64  }
65 
66  return 4 * TTI::TCC_Basic;
67  }
68 
69  int getIntImmCostInst(unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty,
71  Instruction *Inst = nullptr) {
72  return getIntImmCost(Imm, Ty, CostKind);
73  }
74 
75  int getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
77  return getIntImmCost(Imm, Ty, CostKind);
78  }
79 
81  unsigned Opcode, Type *Ty,
88  const Instruction *CxtI = nullptr) {
89  int ISD = TLI->InstructionOpcodeToISD(Opcode);
90 
91  switch (ISD) {
92  default:
93  return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
94  Opd2Info,
95  Opd1PropInfo, Opd2PropInfo);
96  case ISD::MUL:
97  case ISD::SDIV:
98  case ISD::UDIV:
99  case ISD::UREM:
100  // This increases the cost associated with multiplication and division
101  // to 64 times what the baseline arithmetic cost is. The arithmetic
102  // instruction cost was arbitrarily chosen to reduce the desirability
103  // of emitting arithmetic instructions that are emulated in software.
104  // TODO: Investigate the performance impact given specialized lowerings.
105  return 64 * BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
106  Opd2Info,
107  Opd1PropInfo, Opd2PropInfo);
108  }
109  }
110 };
111 
112 } // end namespace llvm
113 
114 #endif // LLVM_LIB_TARGET_LANAI_LANAITARGETTRANSFORMINFO_H
llvm::InstructionCost
Definition: InstructionCost.h:26
llvm::TargetTransformInfo::PSK_FastHardware
@ PSK_FastHardware
Definition: TargetTransformInfo.h:586
llvm::TargetTransformInfo::TargetCostKind
TargetCostKind
The kind of cost model.
Definition: TargetTransformInfo.h:211
MathExtras.h
llvm
Definition: AllocatorList.h:23
llvm::LanaiTTIImpl::getIntImmCostInst
int getIntImmCostInst(unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind, Instruction *Inst=nullptr)
Definition: LanaiTargetTransformInfo.h:69
llvm::SystemZISD::TM
@ TM
Definition: SystemZISelLowering.h:65
llvm::Function
Definition: Function.h:61
llvm::ISD::UDIV
@ UDIV
Definition: ISDOpcodes.h:236
llvm::TargetTransformInfo::PopcntSupportKind
PopcntSupportKind
Flags indicating the kind of support for population count.
Definition: TargetTransformInfo.h:586
llvm::APInt::getSExtValue
int64_t getSExtValue() const
Get sign extended value.
Definition: APInt.h:1644
llvm::BasicTTIImplBase< LanaiTTIImpl >::getArithmeticInstrCost
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, TTI::OperandValueKind Opd1Info=TTI::OK_AnyValue, TTI::OperandValueKind Opd2Info=TTI::OK_AnyValue, TTI::OperandValueProperties Opd1PropInfo=TTI::OP_None, TTI::OperandValueProperties Opd2PropInfo=TTI::OP_None, ArrayRef< const Value * > Args=ArrayRef< const Value * >(), const Instruction *CxtI=nullptr)
Definition: BasicTTIImpl.h:683
llvm::TargetTransformInfo
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Definition: TargetTransformInfo.h:168
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:46
llvm::LanaiTTIImpl::getArithmeticInstrCost
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind=TTI::TCK_RecipThroughput, TTI::OperandValueKind Opd1Info=TTI::OK_AnyValue, TTI::OperandValueKind Opd2Info=TTI::OK_AnyValue, TTI::OperandValueProperties Opd1PropInfo=TTI::OP_None, TTI::OperandValueProperties Opd2PropInfo=TTI::OP_None, ArrayRef< const Value * > Args=ArrayRef< const Value * >(), const Instruction *CxtI=nullptr)
Definition: LanaiTargetTransformInfo.h:80
Lanai.h
llvm::LanaiTTIImpl
Definition: LanaiTargetTransformInfo.h:28
F
#define F(x, y, z)
Definition: MD5.cpp:56
llvm::TargetTransformInfoImplBase::getDataLayout
const DataLayout & getDataLayout() const
Definition: TargetTransformInfoImpl.h:48
TargetLowering.h
llvm::TargetTransformInfo::OP_None
@ OP_None
Definition: TargetTransformInfo.h:903
llvm::Instruction
Definition: Instruction.h:45
llvm::APInt::getZExtValue
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1632
llvm::LanaiTargetLowering
Definition: LanaiISelLowering.h:67
llvm::TargetTransformInfo::PSK_Software
@ PSK_Software
Definition: TargetTransformInfo.h:586
llvm::Type::isIntegerTy
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:202
llvm::isInt< 32 >
constexpr bool isInt< 32 >(int64_t x)
Definition: MathExtras.h:373
llvm::LanaiTTIImpl::getPopcntSupport
TargetTransformInfo::PopcntSupportKind getPopcntSupport(unsigned TyWidth)
Definition: LanaiTargetTransformInfo.h:46
llvm::TargetTransformInfo::OperandValueProperties
OperandValueProperties
Additional properties of an operand's values.
Definition: TargetTransformInfo.h:903
llvm::BasicTTIImplBase
Base class which can be used to help build a TTI implementation.
Definition: BasicTTIImpl.h:76
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::TargetTransformInfo::OperandValueKind
OperandValueKind
Additional information about an operand's possible values.
Definition: TargetTransformInfo.h:895
llvm::APInt
Class for arbitrary precision integers.
Definition: APInt.h:71
llvm::TargetTransformInfo::TCC_Free
@ TCC_Free
Expected to fold away in lowering.
Definition: TargetTransformInfo.h:262
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: APInt.h:33
llvm::LanaiTTIImpl::getIntImmCostIntrin
int getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind)
Definition: LanaiTargetTransformInfo.h:75
llvm::LanaiSubtarget
Definition: LanaiSubtarget.h:29
CostKind
static cl::opt< TargetTransformInfo::TargetCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(TargetTransformInfo::TCK_RecipThroughput), cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(TargetTransformInfo::TCK_Latency, "latency", "Instruction latency"), clEnumValN(TargetTransformInfo::TCK_CodeSize, "code-size", "Code size"), clEnumValN(TargetTransformInfo::TCK_SizeAndLatency, "size-latency", "Code size and latency")))
getParent
static const Function * getParent(const Value *V)
Definition: BasicAliasAnalysis.cpp:759
llvm::TargetLoweringBase::InstructionOpcodeToISD
int InstructionOpcodeToISD(unsigned Opcode) const
Get the ISD node that corresponds to the Instruction class opcode.
Definition: TargetLoweringBase.cpp:1731
llvm::TargetTransformInfo::OK_AnyValue
@ OK_AnyValue
Definition: TargetTransformInfo.h:896
llvm::LanaiTTIImpl::LanaiTTIImpl
LanaiTTIImpl(const LanaiTargetMachine *TM, const Function &F)
Definition: LanaiTargetTransformInfo.h:40
llvm::LanaiTTIImpl::getIntImmCost
int getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind)
Definition: LanaiTargetTransformInfo.h:52
llvm::isInt< 16 >
constexpr bool isInt< 16 >(int64_t x)
Definition: MathExtras.h:370
llvm::ISD::SDIV
@ SDIV
Definition: ISDOpcodes.h:235
llvm::LanaiTargetMachine
Definition: LanaiTargetMachine.h:24
llvm::LanaiTTIImpl::shouldBuildLookupTables
bool shouldBuildLookupTables() const
Definition: LanaiTargetTransformInfo.h:44
llvm::ISD::MUL
@ MUL
Definition: ISDOpcodes.h:234
llvm::ISD::UREM
@ UREM
Definition: ISDOpcodes.h:238
TargetTransformInfo.h
LanaiTargetMachine.h
llvm::TargetTransformInfo::TCC_Basic
@ TCC_Basic
The cost of a typical 'add' instruction.
Definition: TargetTransformInfo.h:263
llvm::AMDGPU::HSAMD::Kernel::Key::Args
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
Definition: AMDGPUMetadata.h:389
BasicTTIImpl.h
LanaiSubtarget.h
llvm::TargetTransformInfo::TCK_RecipThroughput
@ TCK_RecipThroughput
Reciprocal throughput.
Definition: TargetTransformInfo.h:212
llvm::Intrinsic::ID
unsigned ID
Definition: TargetTransformInfo.h:38