1 //===- AMDGPURegisterBankInfo -----------------------------------*- 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 /// \file 9 /// This file declares the targeting of the RegisterBankInfo class for AMDGPU. 10 /// \todo This should be generated by TableGen. 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUREGISTERBANKINFO_H 14 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUREGISTERBANKINFO_H 15 16 #include "llvm/ADT/SmallSet.h" 17 #include "llvm/CodeGen/MachineBasicBlock.h" 18 #include "llvm/CodeGen/Register.h" 19 #include "llvm/CodeGen/RegisterBankInfo.h" 20 21 #define GET_REGBANK_DECLARATIONS 22 #include "AMDGPUGenRegisterBank.inc" 23 24 namespace llvm { 25 26 class LLT; 27 class GCNSubtarget; 28 class MachineIRBuilder; 29 class SIInstrInfo; 30 class SIRegisterInfo; 31 class TargetRegisterInfo; 32 33 /// This class provides the information for the target register banks. 34 class AMDGPUGenRegisterBankInfo : public RegisterBankInfo { 35 36 protected: 37 38 #define GET_TARGET_REGBANK_CLASS 39 #include "AMDGPUGenRegisterBank.inc" 40 }; 41 42 class AMDGPURegisterBankInfo final : public AMDGPUGenRegisterBankInfo { 43 public: 44 const GCNSubtarget &Subtarget; 45 const SIRegisterInfo *TRI; 46 const SIInstrInfo *TII; 47 48 bool buildVCopy(MachineIRBuilder &B, Register DstReg, Register SrcReg) const; 49 50 bool collectWaterfallOperands( 51 SmallSet<Register, 4> &SGPROperandRegs, 52 MachineInstr &MI, 53 MachineRegisterInfo &MRI, 54 ArrayRef<unsigned> OpIndices) const; 55 56 bool executeInWaterfallLoop(MachineIRBuilder &B, 57 iterator_range<MachineBasicBlock::iterator> Range, 58 SmallSet<Register, 4> &SGPROperandRegs) const; 59 60 Register buildReadFirstLane(MachineIRBuilder &B, MachineRegisterInfo &MRI, 61 Register Src) const; 62 63 bool executeInWaterfallLoop(MachineIRBuilder &B, MachineInstr &MI, 64 ArrayRef<unsigned> OpIndices) const; 65 66 void constrainOpWithReadfirstlane(MachineIRBuilder &B, MachineInstr &MI, 67 unsigned OpIdx) const; 68 bool applyMappingDynStackAlloc(MachineIRBuilder &B, 69 const OperandsMapper &OpdMapper, 70 MachineInstr &MI) const; 71 bool applyMappingLoad(MachineIRBuilder &B, const OperandsMapper &OpdMapper, 72 MachineInstr &MI) const; 73 bool applyMappingImage(MachineIRBuilder &B, MachineInstr &MI, 74 const OperandsMapper &OpdMapper, int RSrcIdx) const; 75 unsigned setBufferOffsets(MachineIRBuilder &B, Register CombinedOffset, 76 Register &VOffsetReg, Register &SOffsetReg, 77 int64_t &InstOffsetVal, Align Alignment) const; 78 bool applyMappingSBufferLoad(MachineIRBuilder &B, 79 const OperandsMapper &OpdMapper) const; 80 81 bool applyMappingBFE(MachineIRBuilder &B, const OperandsMapper &OpdMapper, 82 bool Signed) const; 83 84 bool applyMappingMAD_64_32(MachineIRBuilder &B, 85 const OperandsMapper &OpdMapper) const; 86 87 Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI, 88 Register Reg) const; 89 90 std::pair<Register, unsigned> 91 splitBufferOffsets(MachineIRBuilder &B, Register Offset) const; 92 93 /// See RegisterBankInfo::applyMapping. 94 void applyMappingImpl(MachineIRBuilder &Builder, 95 const OperandsMapper &OpdMapper) const override; 96 97 const ValueMapping *getValueMappingForPtr(const MachineRegisterInfo &MRI, 98 Register Ptr) const; 99 100 const RegisterBankInfo::InstructionMapping & 101 getInstrMappingForLoad(const MachineInstr &MI) const; 102 103 unsigned getRegBankID(Register Reg, const MachineRegisterInfo &MRI, 104 unsigned Default = AMDGPU::VGPRRegBankID) const; 105 106 // Return a value mapping for an operand that is required to be an SGPR. 107 const ValueMapping *getSGPROpMapping(Register Reg, 108 const MachineRegisterInfo &MRI, 109 const TargetRegisterInfo &TRI) const; 110 111 // Return a value mapping for an operand that is required to be a VGPR. 112 const ValueMapping *getVGPROpMapping(Register Reg, 113 const MachineRegisterInfo &MRI, 114 const TargetRegisterInfo &TRI) const; 115 116 // Return a value mapping for an operand that is required to be a AGPR. 117 const ValueMapping *getAGPROpMapping(Register Reg, 118 const MachineRegisterInfo &MRI, 119 const TargetRegisterInfo &TRI) const; 120 121 /// Split 64-bit value \p Reg into two 32-bit halves and populate them into \p 122 /// Regs. This appropriately sets the regbank of the new registers. 123 void split64BitValueForMapping(MachineIRBuilder &B, 124 SmallVector<Register, 2> &Regs, 125 LLT HalfTy, 126 Register Reg) const; 127 128 template <unsigned NumOps> 129 struct OpRegBankEntry { 130 int8_t RegBanks[NumOps]; 131 int16_t Cost; 132 }; 133 134 template <unsigned NumOps> 135 InstructionMappings 136 addMappingFromTable(const MachineInstr &MI, const MachineRegisterInfo &MRI, 137 const std::array<unsigned, NumOps> RegSrcOpIdx, 138 ArrayRef<OpRegBankEntry<NumOps>> Table) const; 139 140 RegisterBankInfo::InstructionMappings 141 getInstrAlternativeMappingsIntrinsic( 142 const MachineInstr &MI, const MachineRegisterInfo &MRI) const; 143 144 RegisterBankInfo::InstructionMappings 145 getInstrAlternativeMappingsIntrinsicWSideEffects( 146 const MachineInstr &MI, const MachineRegisterInfo &MRI) const; 147 148 unsigned getMappingType(const MachineRegisterInfo &MRI, 149 const MachineInstr &MI) const; 150 151 bool isSALUMapping(const MachineInstr &MI) const; 152 153 const InstructionMapping &getDefaultMappingSOP(const MachineInstr &MI) const; 154 const InstructionMapping &getDefaultMappingVOP(const MachineInstr &MI) const; 155 const InstructionMapping &getDefaultMappingAllVGPR( 156 const MachineInstr &MI) const; 157 158 const InstructionMapping &getImageMapping(const MachineRegisterInfo &MRI, 159 const MachineInstr &MI, 160 int RsrcIdx) const; 161 162 public: 163 AMDGPURegisterBankInfo(const GCNSubtarget &STI); 164 165 bool isDivergentRegBank(const RegisterBank *RB) const override; 166 167 unsigned copyCost(const RegisterBank &A, const RegisterBank &B, 168 TypeSize Size) const override; 169 170 unsigned getBreakDownCost(const ValueMapping &ValMapping, 171 const RegisterBank *CurBank = nullptr) const override; 172 173 const RegisterBank &getRegBankFromRegClass(const TargetRegisterClass &RC, 174 LLT) const override; 175 176 InstructionMappings 177 getInstrAlternativeMappings(const MachineInstr &MI) const override; 178 179 const InstructionMapping & 180 getInstrMapping(const MachineInstr &MI) const override; 181 182 private: 183 bool foldExtractEltToCmpSelect(MachineIRBuilder &B, MachineInstr &MI, 184 const OperandsMapper &OpdMapper) const; 185 bool foldInsertEltToCmpSelect(MachineIRBuilder &B, MachineInstr &MI, 186 const OperandsMapper &OpdMapper) const; 187 }; 188 } // End llvm namespace. 189 #endif 190