1 //===- AMDGPURegisterBankInfo.cpp -------------------------------*- 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 implements the targeting of the RegisterBankInfo class for 10 /// AMDGPU. 11 /// \todo This should be generated by TableGen. 12 //===----------------------------------------------------------------------===// 13 14 #include "AMDGPURegisterBankInfo.h" 15 #include "AMDGPUInstrInfo.h" 16 #include "AMDGPUSubtarget.h" 17 #include "SIMachineFunctionInfo.h" 18 #include "SIRegisterInfo.h" 19 #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 20 #include "llvm/ADT/SmallSet.h" 21 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 22 #include "llvm/CodeGen/GlobalISel/RegisterBank.h" 23 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" 24 #include "llvm/CodeGen/TargetRegisterInfo.h" 25 #include "llvm/CodeGen/TargetSubtargetInfo.h" 26 #include "llvm/IR/Constants.h" 27 28 #define GET_TARGET_REGBANK_IMPL 29 #include "AMDGPUGenRegisterBank.inc" 30 31 // This file will be TableGen'ed at some point. 32 #include "AMDGPUGenRegisterBankInfo.def" 33 34 using namespace llvm; 35 36 AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI) 37 : AMDGPUGenRegisterBankInfo(), 38 TRI(static_cast<const SIRegisterInfo*>(&TRI)) { 39 40 // HACK: Until this is fully tablegen'd. 41 static bool AlreadyInit = false; 42 if (AlreadyInit) 43 return; 44 45 AlreadyInit = true; 46 47 const RegisterBank &RBSGPR = getRegBank(AMDGPU::SGPRRegBankID); 48 (void)RBSGPR; 49 assert(&RBSGPR == &AMDGPU::SGPRRegBank); 50 51 const RegisterBank &RBVGPR = getRegBank(AMDGPU::VGPRRegBankID); 52 (void)RBVGPR; 53 assert(&RBVGPR == &AMDGPU::VGPRRegBank); 54 55 } 56 57 unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst, 58 const RegisterBank &Src, 59 unsigned Size) const { 60 if (Dst.getID() == AMDGPU::SGPRRegBankID && 61 Src.getID() == AMDGPU::VGPRRegBankID) { 62 return std::numeric_limits<unsigned>::max(); 63 } 64 65 // SGPRRegBank with size 1 is actually vcc or another 64-bit sgpr written by 66 // the valu. 67 if (Size == 1 && Dst.getID() == AMDGPU::SCCRegBankID && 68 (Src.getID() == AMDGPU::SGPRRegBankID || 69 Src.getID() == AMDGPU::VGPRRegBankID || 70 Src.getID() == AMDGPU::VCCRegBankID)) 71 return std::numeric_limits<unsigned>::max(); 72 73 if (Dst.getID() == AMDGPU::SCCRegBankID && 74 Src.getID() == AMDGPU::VCCRegBankID) 75 return std::numeric_limits<unsigned>::max(); 76 77 return RegisterBankInfo::copyCost(Dst, Src, Size); 78 } 79 80 unsigned AMDGPURegisterBankInfo::getBreakDownCost( 81 const ValueMapping &ValMapping, 82 const RegisterBank *CurBank) const { 83 assert(ValMapping.NumBreakDowns == 2 && 84 ValMapping.BreakDown[0].Length == 32 && 85 ValMapping.BreakDown[0].StartIdx == 0 && 86 ValMapping.BreakDown[1].Length == 32 && 87 ValMapping.BreakDown[1].StartIdx == 32 && 88 ValMapping.BreakDown[0].RegBank == ValMapping.BreakDown[1].RegBank); 89 90 // 32-bit extract of a 64-bit value is just access of a subregister, so free. 91 // TODO: Cost of 0 hits assert, though it's not clear it's what we really 92 // want. 93 94 // TODO: 32-bit insert to a 64-bit SGPR may incur a non-free copy due to SGPR 95 // alignment restrictions, but this probably isn't important. 96 return 1; 97 } 98 99 const RegisterBank &AMDGPURegisterBankInfo::getRegBankFromRegClass( 100 const TargetRegisterClass &RC) const { 101 102 if (TRI->isSGPRClass(&RC)) 103 return getRegBank(AMDGPU::SGPRRegBankID); 104 105 return getRegBank(AMDGPU::VGPRRegBankID); 106 } 107 108 template <unsigned NumOps> 109 RegisterBankInfo::InstructionMappings 110 AMDGPURegisterBankInfo::addMappingFromTable( 111 const MachineInstr &MI, const MachineRegisterInfo &MRI, 112 const std::array<unsigned, NumOps> RegSrcOpIdx, 113 ArrayRef<OpRegBankEntry<NumOps>> Table) const { 114 115 InstructionMappings AltMappings; 116 117 SmallVector<const ValueMapping *, 10> Operands(MI.getNumOperands()); 118 119 unsigned Sizes[NumOps]; 120 for (unsigned I = 0; I < NumOps; ++I) { 121 unsigned Reg = MI.getOperand(RegSrcOpIdx[I]).getReg(); 122 Sizes[I] = getSizeInBits(Reg, MRI, *TRI); 123 } 124 125 for (unsigned I = 0, E = MI.getNumExplicitDefs(); I != E; ++I) { 126 unsigned SizeI = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI); 127 Operands[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SizeI); 128 } 129 130 unsigned MappingID = 0; 131 for (const auto &Entry : Table) { 132 for (unsigned I = 0; I < NumOps; ++I) { 133 int OpIdx = RegSrcOpIdx[I]; 134 Operands[OpIdx] = AMDGPU::getValueMapping(Entry.RegBanks[I], Sizes[I]); 135 } 136 137 AltMappings.push_back(&getInstructionMapping(MappingID++, Entry.Cost, 138 getOperandsMapping(Operands), 139 Operands.size())); 140 } 141 142 return AltMappings; 143 } 144 145 RegisterBankInfo::InstructionMappings 146 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsicWSideEffects( 147 const MachineInstr &MI, const MachineRegisterInfo &MRI) const { 148 149 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 150 case Intrinsic::amdgcn_buffer_load: { 151 static const OpRegBankEntry<3> Table[4] = { 152 // Perfectly legal. 153 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 154 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 155 156 // Waterfall loop needed for rsrc. In the worst case this will execute 157 // approximately an extra 10 * wavesize + 2 instructions. 158 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 }, 159 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1000 } 160 }; 161 162 // rsrc, voffset, offset 163 const std::array<unsigned, 3> RegSrcOpIdx = { { 2, 3, 4 } }; 164 return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 165 } 166 case Intrinsic::amdgcn_s_buffer_load: { 167 static const OpRegBankEntry<2> Table[4] = { 168 // Perfectly legal. 169 { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 170 171 // Only need 1 register in loop 172 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 300 }, 173 174 // Have to waterfall the resource. 175 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 }, 176 177 // Have to waterfall the resource, and the offset. 178 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1500 } 179 }; 180 181 // rsrc, offset 182 const std::array<unsigned, 2> RegSrcOpIdx = { { 2, 3 } }; 183 return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 184 } 185 default: 186 return RegisterBankInfo::getInstrAlternativeMappings(MI); 187 } 188 } 189 190 RegisterBankInfo::InstructionMappings 191 AMDGPURegisterBankInfo::getInstrAlternativeMappings( 192 const MachineInstr &MI) const { 193 194 const MachineFunction &MF = *MI.getParent()->getParent(); 195 const MachineRegisterInfo &MRI = MF.getRegInfo(); 196 197 198 InstructionMappings AltMappings; 199 switch (MI.getOpcode()) { 200 case TargetOpcode::G_AND: 201 case TargetOpcode::G_OR: 202 case TargetOpcode::G_XOR: { 203 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 204 if (Size != 64) 205 break; 206 207 const InstructionMapping &SSMapping = getInstructionMapping( 208 1, 1, getOperandsMapping( 209 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 210 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 211 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 212 3); // Num Operands 213 AltMappings.push_back(&SSMapping); 214 215 const InstructionMapping &VVMapping = getInstructionMapping( 216 2, 2, getOperandsMapping( 217 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 218 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 219 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 220 3); // Num Operands 221 AltMappings.push_back(&VVMapping); 222 223 const InstructionMapping &SVMapping = getInstructionMapping( 224 3, 3, getOperandsMapping( 225 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 226 AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size), 227 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 228 3); // Num Operands 229 AltMappings.push_back(&SVMapping); 230 231 // SGPR in LHS is slightly preferrable, so make it VS more expnesive than 232 // SV. 233 const InstructionMapping &VSMapping = getInstructionMapping( 234 3, 4, getOperandsMapping( 235 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 236 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 237 AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size)}), 238 3); // Num Operands 239 AltMappings.push_back(&VSMapping); 240 break; 241 } 242 case TargetOpcode::G_LOAD: { 243 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 244 // FIXME: Should we be hard coding the size for these mappings? 245 const InstructionMapping &SSMapping = getInstructionMapping( 246 1, 1, getOperandsMapping( 247 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 248 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 64)}), 249 2); // Num Operands 250 AltMappings.push_back(&SSMapping); 251 252 const InstructionMapping &VVMapping = getInstructionMapping( 253 2, 1, getOperandsMapping( 254 {AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 255 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64)}), 256 2); // Num Operands 257 AltMappings.push_back(&VVMapping); 258 259 // FIXME: Should this be the pointer-size (64-bits) or the size of the 260 // register that will hold the bufffer resourc (128-bits). 261 const InstructionMapping &VSMapping = getInstructionMapping( 262 3, 1, getOperandsMapping( 263 {AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 264 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 64)}), 265 2); // Num Operands 266 AltMappings.push_back(&VSMapping); 267 268 return AltMappings; 269 270 } 271 case TargetOpcode::G_ICMP: { 272 unsigned Size = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI); 273 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 274 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 275 nullptr, // Predicate operand. 276 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 277 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 278 4); // Num Operands 279 AltMappings.push_back(&SSMapping); 280 281 const InstructionMapping &SVMapping = getInstructionMapping(2, 1, 282 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 283 nullptr, // Predicate operand. 284 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 285 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}), 286 4); // Num Operands 287 AltMappings.push_back(&SVMapping); 288 289 const InstructionMapping &VSMapping = getInstructionMapping(3, 1, 290 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 291 nullptr, // Predicate operand. 292 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 293 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 294 4); // Num Operands 295 AltMappings.push_back(&VSMapping); 296 297 const InstructionMapping &VVMapping = getInstructionMapping(4, 1, 298 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 299 nullptr, // Predicate operand. 300 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 301 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}), 302 4); // Num Operands 303 AltMappings.push_back(&VVMapping); 304 305 return AltMappings; 306 } 307 case TargetOpcode::G_SELECT: { 308 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 309 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 310 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 311 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 312 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 313 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 314 4); // Num Operands 315 AltMappings.push_back(&SSMapping); 316 317 const InstructionMapping &VVMapping = getInstructionMapping(2, 1, 318 getOperandsMapping({AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 319 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 320 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 321 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 322 4); // Num Operands 323 AltMappings.push_back(&VVMapping); 324 325 return AltMappings; 326 } 327 case TargetOpcode::G_UADDE: 328 case TargetOpcode::G_USUBE: 329 case TargetOpcode::G_SADDE: 330 case TargetOpcode::G_SSUBE: { 331 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 332 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 333 getOperandsMapping( 334 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 335 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 336 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 337 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 338 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1)}), 339 5); // Num Operands 340 AltMappings.push_back(&SSMapping); 341 342 const InstructionMapping &VVMapping = getInstructionMapping(2, 1, 343 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 344 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 345 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 346 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 347 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1)}), 348 5); // Num Operands 349 AltMappings.push_back(&VVMapping); 350 return AltMappings; 351 } 352 case AMDGPU::G_BRCOND: { 353 assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1); 354 355 const InstructionMapping &SMapping = getInstructionMapping( 356 1, 1, getOperandsMapping( 357 {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), nullptr}), 358 2); // Num Operands 359 AltMappings.push_back(&SMapping); 360 361 const InstructionMapping &VMapping = getInstructionMapping( 362 1, 1, getOperandsMapping( 363 {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), nullptr }), 364 2); // Num Operands 365 AltMappings.push_back(&VMapping); 366 return AltMappings; 367 } 368 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: 369 return getInstrAlternativeMappingsIntrinsicWSideEffects(MI, MRI); 370 default: 371 break; 372 } 373 return RegisterBankInfo::getInstrAlternativeMappings(MI); 374 } 375 376 void AMDGPURegisterBankInfo::split64BitValueForMapping( 377 MachineIRBuilder &B, 378 SmallVector<Register, 2> &Regs, 379 LLT HalfTy, 380 unsigned Reg) const { 381 assert(HalfTy.getSizeInBits() == 32); 382 MachineRegisterInfo *MRI = B.getMRI(); 383 unsigned LoLHS = MRI->createGenericVirtualRegister(HalfTy); 384 unsigned HiLHS = MRI->createGenericVirtualRegister(HalfTy); 385 const RegisterBank *Bank = getRegBank(Reg, *MRI, *TRI); 386 MRI->setRegBank(LoLHS, *Bank); 387 MRI->setRegBank(HiLHS, *Bank); 388 389 Regs.push_back(LoLHS); 390 Regs.push_back(HiLHS); 391 392 B.buildInstr(AMDGPU::G_UNMERGE_VALUES) 393 .addDef(LoLHS) 394 .addDef(HiLHS) 395 .addUse(Reg); 396 } 397 398 /// Replace the current type each register in \p Regs has with \p NewTy 399 static void setRegsToType(MachineRegisterInfo &MRI, ArrayRef<Register> Regs, 400 LLT NewTy) { 401 for (unsigned Reg : Regs) { 402 assert(MRI.getType(Reg).getSizeInBits() == NewTy.getSizeInBits()); 403 MRI.setType(Reg, NewTy); 404 } 405 } 406 407 static LLT getHalfSizedType(LLT Ty) { 408 if (Ty.isVector()) { 409 assert(Ty.getNumElements() % 2 == 0); 410 return LLT::scalarOrVector(Ty.getNumElements() / 2, Ty.getElementType()); 411 } 412 413 assert(Ty.getSizeInBits() % 2 == 0); 414 return LLT::scalar(Ty.getSizeInBits() / 2); 415 } 416 417 /// Legalize instruction \p MI where operands in \p OpIndices must be SGPRs. If 418 /// any of the required SGPR operands are VGPRs, perform a waterfall loop to 419 /// execute the instruction for each unique combination of values in all lanes 420 /// in the wave. The block will be split such that rest of the instructions are 421 /// moved to a new block. 422 /// 423 /// Essentially performs this loop: 424 // 425 /// Save Execution Mask 426 /// For (Lane : Wavefront) { 427 /// Enable Lane, Disable all other lanes 428 /// SGPR = read SGPR value for current lane from VGPR 429 /// VGPRResult[Lane] = use_op SGPR 430 /// } 431 /// Restore Execution Mask 432 /// 433 /// There is additional complexity to try for compare values to identify the 434 /// unique values used. 435 void AMDGPURegisterBankInfo::executeInWaterfallLoop( 436 MachineInstr &MI, MachineRegisterInfo &MRI, 437 ArrayRef<unsigned> OpIndices) const { 438 MachineFunction *MF = MI.getParent()->getParent(); 439 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 440 const SIInstrInfo *TII = ST.getInstrInfo(); 441 MachineBasicBlock::iterator I(MI); 442 443 MachineBasicBlock &MBB = *MI.getParent(); 444 const DebugLoc &DL = MI.getDebugLoc(); 445 446 // Use a set to avoid extra readfirstlanes in the case where multiple operands 447 // are the same register. 448 SmallSet<Register, 4> SGPROperandRegs; 449 for (unsigned Op : OpIndices) { 450 assert(MI.getOperand(Op).isUse()); 451 unsigned Reg = MI.getOperand(Op).getReg(); 452 const RegisterBank *OpBank = getRegBank(Reg, MRI, *TRI); 453 if (OpBank->getID() == AMDGPU::VGPRRegBankID) 454 SGPROperandRegs.insert(Reg); 455 } 456 457 // No operands need to be replaced, so no need to loop. 458 if (SGPROperandRegs.empty()) 459 return; 460 461 MachineIRBuilder B(MI); 462 SmallVector<Register, 4> ResultRegs; 463 SmallVector<Register, 4> InitResultRegs; 464 SmallVector<Register, 4> PhiRegs; 465 for (MachineOperand &Def : MI.defs()) { 466 LLT ResTy = MRI.getType(Def.getReg()); 467 const RegisterBank *DefBank = getRegBank(Def.getReg(), MRI, *TRI); 468 ResultRegs.push_back(Def.getReg()); 469 unsigned InitReg = B.buildUndef(ResTy).getReg(0); 470 unsigned PhiReg = MRI.createGenericVirtualRegister(ResTy); 471 InitResultRegs.push_back(InitReg); 472 PhiRegs.push_back(PhiReg); 473 MRI.setRegBank(PhiReg, *DefBank); 474 MRI.setRegBank(InitReg, *DefBank); 475 } 476 477 unsigned SaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 478 unsigned InitSaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 479 480 // Don't bother using generic instructions/registers for the exec mask. 481 B.buildInstr(TargetOpcode::IMPLICIT_DEF) 482 .addDef(InitSaveExecReg); 483 484 unsigned PhiExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 485 unsigned NewExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 486 487 // To insert the loop we need to split the block. Move everything before this 488 // point to a new block, and insert a new empty block before this instruction. 489 MachineBasicBlock *LoopBB = MF->CreateMachineBasicBlock(); 490 MachineBasicBlock *RemainderBB = MF->CreateMachineBasicBlock(); 491 MachineBasicBlock *RestoreExecBB = MF->CreateMachineBasicBlock(); 492 MachineFunction::iterator MBBI(MBB); 493 ++MBBI; 494 MF->insert(MBBI, LoopBB); 495 MF->insert(MBBI, RestoreExecBB); 496 MF->insert(MBBI, RemainderBB); 497 498 LoopBB->addSuccessor(RestoreExecBB); 499 LoopBB->addSuccessor(LoopBB); 500 501 // Move the rest of the block into a new block. 502 RemainderBB->transferSuccessorsAndUpdatePHIs(&MBB); 503 RemainderBB->splice(RemainderBB->begin(), &MBB, I, MBB.end()); 504 505 MBB.addSuccessor(LoopBB); 506 RestoreExecBB->addSuccessor(RemainderBB); 507 508 B.setInsertPt(*LoopBB, LoopBB->end()); 509 510 B.buildInstr(TargetOpcode::PHI) 511 .addDef(PhiExec) 512 .addReg(InitSaveExecReg) 513 .addMBB(&MBB) 514 .addReg(NewExec) 515 .addMBB(LoopBB); 516 517 for (auto Result : zip(InitResultRegs, ResultRegs, PhiRegs)) { 518 B.buildInstr(TargetOpcode::G_PHI) 519 .addDef(std::get<2>(Result)) 520 .addReg(std::get<0>(Result)) // Initial value / implicit_def 521 .addMBB(&MBB) 522 .addReg(std::get<1>(Result)) // Mid-loop value. 523 .addMBB(LoopBB); 524 } 525 526 // Move the instruction into the loop. 527 LoopBB->splice(LoopBB->end(), &MBB, I); 528 I = std::prev(LoopBB->end()); 529 530 B.setInstr(*I); 531 532 unsigned CondReg = AMDGPU::NoRegister; 533 534 for (MachineOperand &Op : MI.uses()) { 535 if (!Op.isReg()) 536 continue; 537 538 assert(!Op.isDef()); 539 if (SGPROperandRegs.count(Op.getReg())) { 540 LLT OpTy = MRI.getType(Op.getReg()); 541 unsigned OpSize = OpTy.getSizeInBits(); 542 543 // Can only do a readlane of 32-bit pieces. 544 if (OpSize == 32) { 545 // Avoid extra copies in the simple case of one 32-bit register. 546 unsigned CurrentLaneOpReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 547 MRI.setType(CurrentLaneOpReg, OpTy); 548 549 constrainGenericRegister(Op.getReg(), AMDGPU::VGPR_32RegClass, MRI); 550 // Read the next variant <- also loop target. 551 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), CurrentLaneOpReg) 552 .addReg(Op.getReg()); 553 554 unsigned NewCondReg = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 555 bool First = CondReg == AMDGPU::NoRegister; 556 if (First) 557 CondReg = NewCondReg; 558 559 // Compare the just read M0 value to all possible Idx values. 560 B.buildInstr(AMDGPU::V_CMP_EQ_U32_e64) 561 .addDef(NewCondReg) 562 .addReg(CurrentLaneOpReg) 563 .addReg(Op.getReg()); 564 Op.setReg(CurrentLaneOpReg); 565 566 if (!First) { 567 unsigned AndReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 568 569 // If there are multiple operands to consider, and the conditions. 570 B.buildInstr(AMDGPU::S_AND_B64) 571 .addDef(AndReg) 572 .addReg(NewCondReg) 573 .addReg(CondReg); 574 CondReg = AndReg; 575 } 576 } else { 577 LLT S32 = LLT::scalar(32); 578 SmallVector<Register, 8> ReadlanePieces; 579 580 // The compares can be done as 64-bit, but the extract needs to be done 581 // in 32-bit pieces. 582 583 bool Is64 = OpSize % 64 == 0; 584 585 LLT UnmergeTy = OpSize % 64 == 0 ? LLT::scalar(64) : LLT::scalar(32); 586 unsigned CmpOp = OpSize % 64 == 0 ? AMDGPU::V_CMP_EQ_U64_e64 587 : AMDGPU::V_CMP_EQ_U32_e64; 588 589 // The compares can be done as 64-bit, but the extract needs to be done 590 // in 32-bit pieces. 591 592 // Insert the unmerge before the loop. 593 594 B.setMBB(MBB); 595 auto Unmerge = B.buildUnmerge(UnmergeTy, Op.getReg()); 596 B.setInstr(*I); 597 598 unsigned NumPieces = Unmerge->getNumOperands() - 1; 599 for (unsigned PieceIdx = 0; PieceIdx != NumPieces; ++PieceIdx) { 600 unsigned UnmergePiece = Unmerge.getReg(PieceIdx); 601 602 unsigned CurrentLaneOpReg; 603 if (Is64) { 604 unsigned CurrentLaneOpRegLo = MRI.createGenericVirtualRegister(S32); 605 unsigned CurrentLaneOpRegHi = MRI.createGenericVirtualRegister(S32); 606 607 MRI.setRegClass(UnmergePiece, &AMDGPU::VReg_64RegClass); 608 MRI.setRegClass(CurrentLaneOpRegLo, &AMDGPU::SReg_32_XM0RegClass); 609 MRI.setRegClass(CurrentLaneOpRegHi, &AMDGPU::SReg_32_XM0RegClass); 610 611 // Read the next variant <- also loop target. 612 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 613 CurrentLaneOpRegLo) 614 .addReg(UnmergePiece, 0, AMDGPU::sub0); 615 616 // Read the next variant <- also loop target. 617 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 618 CurrentLaneOpRegHi) 619 .addReg(UnmergePiece, 0, AMDGPU::sub1); 620 621 CurrentLaneOpReg = 622 B.buildMerge(LLT::scalar(64), 623 {CurrentLaneOpRegLo, CurrentLaneOpRegHi}) 624 .getReg(0); 625 626 MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_64_XEXECRegClass); 627 628 if (OpTy.getScalarSizeInBits() == 64) { 629 // If we need to produce a 64-bit element vector, so use the 630 // merged pieces 631 ReadlanePieces.push_back(CurrentLaneOpReg); 632 } else { 633 // 32-bit element type. 634 ReadlanePieces.push_back(CurrentLaneOpRegLo); 635 ReadlanePieces.push_back(CurrentLaneOpRegHi); 636 } 637 } else { 638 CurrentLaneOpReg = MRI.createGenericVirtualRegister(LLT::scalar(32)); 639 MRI.setRegClass(UnmergePiece, &AMDGPU::VGPR_32RegClass); 640 MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_32_XM0RegClass); 641 642 // Read the next variant <- also loop target. 643 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 644 CurrentLaneOpReg) 645 .addReg(UnmergePiece); 646 ReadlanePieces.push_back(CurrentLaneOpReg); 647 } 648 649 unsigned NewCondReg 650 = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 651 bool First = CondReg == AMDGPU::NoRegister; 652 if (First) 653 CondReg = NewCondReg; 654 655 B.buildInstr(CmpOp) 656 .addDef(NewCondReg) 657 .addReg(CurrentLaneOpReg) 658 .addReg(UnmergePiece); 659 660 if (!First) { 661 unsigned AndReg 662 = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 663 664 // If there are multiple operands to consider, and the conditions. 665 B.buildInstr(AMDGPU::S_AND_B64) 666 .addDef(AndReg) 667 .addReg(NewCondReg) 668 .addReg(CondReg); 669 CondReg = AndReg; 670 } 671 } 672 673 // FIXME: Build merge seems to switch to CONCAT_VECTORS but not 674 // BUILD_VECTOR 675 if (OpTy.isVector()) { 676 auto Merge = B.buildBuildVector(OpTy, ReadlanePieces); 677 Op.setReg(Merge.getReg(0)); 678 } else { 679 auto Merge = B.buildMerge(OpTy, ReadlanePieces); 680 Op.setReg(Merge.getReg(0)); 681 } 682 683 MRI.setRegBank(Op.getReg(), getRegBank(AMDGPU::SGPRRegBankID)); 684 } 685 } 686 } 687 688 B.setInsertPt(*LoopBB, LoopBB->end()); 689 690 // Update EXEC, save the original EXEC value to VCC. 691 B.buildInstr(AMDGPU::S_AND_SAVEEXEC_B64) 692 .addDef(NewExec) 693 .addReg(CondReg, RegState::Kill); 694 695 MRI.setSimpleHint(NewExec, CondReg); 696 697 // Update EXEC, switch all done bits to 0 and all todo bits to 1. 698 B.buildInstr(AMDGPU::S_XOR_B64_term) 699 .addDef(AMDGPU::EXEC) 700 .addReg(AMDGPU::EXEC) 701 .addReg(NewExec); 702 703 // XXX - s_xor_b64 sets scc to 1 if the result is nonzero, so can we use 704 // s_cbranch_scc0? 705 706 // Loop back to V_READFIRSTLANE_B32 if there are still variants to cover. 707 B.buildInstr(AMDGPU::S_CBRANCH_EXECNZ) 708 .addMBB(LoopBB); 709 710 // Save the EXEC mask before the loop. 711 BuildMI(MBB, MBB.end(), DL, TII->get(AMDGPU::S_MOV_B64_term), SaveExecReg) 712 .addReg(AMDGPU::EXEC); 713 714 // Restore the EXEC mask after the loop. 715 B.setMBB(*RestoreExecBB); 716 B.buildInstr(AMDGPU::S_MOV_B64_term) 717 .addDef(AMDGPU::EXEC) 718 .addReg(SaveExecReg); 719 } 720 721 void AMDGPURegisterBankInfo::applyMappingImpl( 722 const OperandsMapper &OpdMapper) const { 723 MachineInstr &MI = OpdMapper.getMI(); 724 unsigned Opc = MI.getOpcode(); 725 MachineRegisterInfo &MRI = OpdMapper.getMRI(); 726 switch (Opc) { 727 case AMDGPU::G_SELECT: { 728 unsigned DstReg = MI.getOperand(0).getReg(); 729 LLT DstTy = MRI.getType(DstReg); 730 if (DstTy.getSizeInBits() != 64) 731 break; 732 733 LLT HalfTy = getHalfSizedType(DstTy); 734 735 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 736 SmallVector<Register, 1> Src0Regs(OpdMapper.getVRegs(1)); 737 SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2)); 738 SmallVector<Register, 2> Src2Regs(OpdMapper.getVRegs(3)); 739 740 // All inputs are SGPRs, nothing special to do. 741 if (DefRegs.empty()) { 742 assert(Src1Regs.empty() && Src2Regs.empty()); 743 break; 744 } 745 746 MachineIRBuilder B(MI); 747 if (Src0Regs.empty()) 748 Src0Regs.push_back(MI.getOperand(1).getReg()); 749 else { 750 assert(Src0Regs.size() == 1); 751 } 752 753 if (Src1Regs.empty()) 754 split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg()); 755 else { 756 setRegsToType(MRI, Src1Regs, HalfTy); 757 } 758 759 if (Src2Regs.empty()) 760 split64BitValueForMapping(B, Src2Regs, HalfTy, MI.getOperand(3).getReg()); 761 else 762 setRegsToType(MRI, Src2Regs, HalfTy); 763 764 setRegsToType(MRI, DefRegs, HalfTy); 765 766 B.buildSelect(DefRegs[0], Src0Regs[0], Src1Regs[0], Src2Regs[0]); 767 B.buildSelect(DefRegs[1], Src0Regs[0], Src1Regs[1], Src2Regs[1]); 768 769 MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID)); 770 MI.eraseFromParent(); 771 return; 772 } 773 case AMDGPU::G_AND: 774 case AMDGPU::G_OR: 775 case AMDGPU::G_XOR: { 776 // 64-bit and is only available on the SALU, so split into 2 32-bit ops if 777 // there is a VGPR input. 778 unsigned DstReg = MI.getOperand(0).getReg(); 779 LLT DstTy = MRI.getType(DstReg); 780 if (DstTy.getSizeInBits() != 64) 781 break; 782 783 LLT HalfTy = getHalfSizedType(DstTy); 784 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 785 SmallVector<Register, 2> Src0Regs(OpdMapper.getVRegs(1)); 786 SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2)); 787 788 // All inputs are SGPRs, nothing special to do. 789 if (DefRegs.empty()) { 790 assert(Src0Regs.empty() && Src1Regs.empty()); 791 break; 792 } 793 794 assert(DefRegs.size() == 2); 795 assert(Src0Regs.size() == Src1Regs.size() && 796 (Src0Regs.empty() || Src0Regs.size() == 2)); 797 798 // Depending on where the source registers came from, the generic code may 799 // have decided to split the inputs already or not. If not, we still need to 800 // extract the values. 801 MachineIRBuilder B(MI); 802 803 if (Src0Regs.empty()) 804 split64BitValueForMapping(B, Src0Regs, HalfTy, MI.getOperand(1).getReg()); 805 else 806 setRegsToType(MRI, Src0Regs, HalfTy); 807 808 if (Src1Regs.empty()) 809 split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg()); 810 else 811 setRegsToType(MRI, Src1Regs, HalfTy); 812 813 setRegsToType(MRI, DefRegs, HalfTy); 814 815 B.buildInstr(Opc) 816 .addDef(DefRegs[0]) 817 .addUse(Src0Regs[0]) 818 .addUse(Src1Regs[0]); 819 820 B.buildInstr(Opc) 821 .addDef(DefRegs[1]) 822 .addUse(Src0Regs[1]) 823 .addUse(Src1Regs[1]); 824 825 MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID)); 826 MI.eraseFromParent(); 827 return; 828 } 829 case AMDGPU::G_SEXT: 830 case AMDGPU::G_ZEXT: { 831 Register SrcReg = MI.getOperand(1).getReg(); 832 LLT SrcTy = MRI.getType(SrcReg); 833 bool Signed = Opc == AMDGPU::G_SEXT; 834 835 MachineIRBuilder B(MI); 836 const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI); 837 838 Register DstReg = MI.getOperand(0).getReg(); 839 LLT DstTy = MRI.getType(DstReg); 840 if (DstTy.isScalar() && 841 SrcBank != &AMDGPU::SGPRRegBank && 842 SrcBank != &AMDGPU::SCCRegBank && 843 SrcBank != &AMDGPU::VCCRegBank && 844 // FIXME: Should handle any type that round to s64 when irregular 845 // breakdowns supported. 846 DstTy.getSizeInBits() == 64 && 847 SrcTy.getSizeInBits() <= 32) { 848 const LLT S32 = LLT::scalar(32); 849 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 850 851 // Extend to 32-bit, and then extend the low half. 852 if (Signed) { 853 // TODO: Should really be buildSExtOrCopy 854 B.buildSExtOrTrunc(DefRegs[0], SrcReg); 855 856 // Replicate sign bit from 32-bit extended part. 857 auto ShiftAmt = B.buildConstant(S32, 31); 858 MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank); 859 B.buildAShr(DefRegs[1], DefRegs[0], ShiftAmt); 860 } else { 861 B.buildZExtOrTrunc(DefRegs[0], SrcReg); 862 B.buildConstant(DefRegs[1], 0); 863 } 864 865 MRI.setRegBank(DstReg, *SrcBank); 866 MI.eraseFromParent(); 867 return; 868 } 869 870 if (SrcTy != LLT::scalar(1)) 871 return; 872 873 if (SrcBank == &AMDGPU::SCCRegBank || SrcBank == &AMDGPU::VCCRegBank) { 874 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 875 876 const RegisterBank *DstBank = SrcBank == &AMDGPU::SCCRegBank ? 877 &AMDGPU::SGPRRegBank : &AMDGPU::VGPRRegBank; 878 879 unsigned DstSize = DstTy.getSizeInBits(); 880 // 64-bit select is SGPR only 881 const bool UseSel64 = DstSize > 32 && 882 SrcBank->getID() == AMDGPU::SCCRegBankID; 883 884 // TODO: Should s16 select be legal? 885 LLT SelType = UseSel64 ? LLT::scalar(64) : LLT::scalar(32); 886 auto True = B.buildConstant(SelType, Signed ? -1 : 1); 887 auto False = B.buildConstant(SelType, 0); 888 889 MRI.setRegBank(True.getReg(0), *DstBank); 890 MRI.setRegBank(False.getReg(0), *DstBank); 891 MRI.setRegBank(DstReg, *DstBank); 892 893 if (DstSize > 32 && SrcBank->getID() != AMDGPU::SCCRegBankID) { 894 B.buildSelect(DefRegs[0], SrcReg, True, False); 895 B.buildCopy(DefRegs[1], DefRegs[0]); 896 } else if (DstSize < 32) { 897 auto Sel = B.buildSelect(SelType, SrcReg, True, False); 898 MRI.setRegBank(Sel.getReg(0), *DstBank); 899 B.buildTrunc(DstReg, Sel); 900 } else { 901 B.buildSelect(DstReg, SrcReg, True, False); 902 } 903 904 MI.eraseFromParent(); 905 return; 906 } 907 908 // Fixup the case with an s1 src that isn't a condition register. Use shifts 909 // instead of introducing a compare to avoid an unnecessary condition 910 // register (and since there's no scalar 16-bit compares). 911 auto Ext = B.buildAnyExt(DstTy, SrcReg); 912 auto ShiftAmt = B.buildConstant(LLT::scalar(32), DstTy.getSizeInBits() - 1); 913 auto Shl = B.buildShl(DstTy, Ext, ShiftAmt); 914 915 if (MI.getOpcode() == AMDGPU::G_SEXT) 916 B.buildAShr(DstReg, Shl, ShiftAmt); 917 else 918 B.buildLShr(DstReg, Shl, ShiftAmt); 919 920 MRI.setRegBank(DstReg, *SrcBank); 921 MRI.setRegBank(Ext.getReg(0), *SrcBank); 922 MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank); 923 MRI.setRegBank(Shl.getReg(0), *SrcBank); 924 MI.eraseFromParent(); 925 return; 926 } 927 case AMDGPU::G_EXTRACT_VECTOR_ELT: 928 applyDefaultMapping(OpdMapper); 929 executeInWaterfallLoop(MI, MRI, { 2 }); 930 return; 931 case AMDGPU::G_INTRINSIC: { 932 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 933 case Intrinsic::amdgcn_s_buffer_load: { 934 // FIXME: Move to G_INTRINSIC_W_SIDE_EFFECTS 935 executeInWaterfallLoop(MI, MRI, { 2, 3 }); 936 return; 937 } 938 default: 939 break; 940 } 941 break; 942 } 943 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: { 944 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 945 case Intrinsic::amdgcn_buffer_load: { 946 executeInWaterfallLoop(MI, MRI, { 2 }); 947 return; 948 } 949 default: 950 break; 951 } 952 break; 953 } 954 default: 955 break; 956 } 957 958 return applyDefaultMapping(OpdMapper); 959 } 960 961 static bool isInstrUniform(const MachineInstr &MI) { 962 if (!MI.hasOneMemOperand()) 963 return false; 964 965 const MachineMemOperand *MMO = *MI.memoperands_begin(); 966 return AMDGPUInstrInfo::isUniformMMO(MMO); 967 } 968 969 bool AMDGPURegisterBankInfo::isSALUMapping(const MachineInstr &MI) const { 970 const MachineFunction &MF = *MI.getParent()->getParent(); 971 const MachineRegisterInfo &MRI = MF.getRegInfo(); 972 for (unsigned i = 0, e = MI.getNumOperands();i != e; ++i) { 973 if (!MI.getOperand(i).isReg()) 974 continue; 975 unsigned Reg = MI.getOperand(i).getReg(); 976 if (const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI)) { 977 if (Bank->getID() == AMDGPU::VGPRRegBankID) 978 return false; 979 980 assert(Bank->getID() == AMDGPU::SGPRRegBankID || 981 Bank->getID() == AMDGPU::SCCRegBankID); 982 } 983 } 984 return true; 985 } 986 987 const RegisterBankInfo::InstructionMapping & 988 AMDGPURegisterBankInfo::getDefaultMappingSOP(const MachineInstr &MI) const { 989 const MachineFunction &MF = *MI.getParent()->getParent(); 990 const MachineRegisterInfo &MRI = MF.getRegInfo(); 991 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 992 993 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 994 unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); 995 unsigned BankID = Size == 1 ? AMDGPU::SCCRegBankID : AMDGPU::SGPRRegBankID; 996 OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size); 997 } 998 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 999 MI.getNumOperands()); 1000 } 1001 1002 const RegisterBankInfo::InstructionMapping & 1003 AMDGPURegisterBankInfo::getDefaultMappingVOP(const MachineInstr &MI) const { 1004 const MachineFunction &MF = *MI.getParent()->getParent(); 1005 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1006 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1007 unsigned OpdIdx = 0; 1008 1009 unsigned Size0 = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1010 OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0); 1011 1012 if (MI.getOperand(OpdIdx).isIntrinsicID()) 1013 OpdsMapping[OpdIdx++] = nullptr; 1014 1015 unsigned Reg1 = MI.getOperand(OpdIdx).getReg(); 1016 unsigned Size1 = getSizeInBits(Reg1, MRI, *TRI); 1017 1018 unsigned DefaultBankID = Size1 == 1 ? 1019 AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID; 1020 unsigned Bank1 = getRegBankID(Reg1, MRI, *TRI, DefaultBankID); 1021 1022 OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(Bank1, Size1); 1023 1024 for (unsigned e = MI.getNumOperands(); OpdIdx != e; ++OpdIdx) { 1025 const MachineOperand &MO = MI.getOperand(OpdIdx); 1026 if (!MO.isReg()) 1027 continue; 1028 1029 unsigned Size = getSizeInBits(MO.getReg(), MRI, *TRI); 1030 unsigned BankID = Size == 1 ? AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID; 1031 OpdsMapping[OpdIdx] = AMDGPU::getValueMapping(BankID, Size); 1032 } 1033 1034 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 1035 MI.getNumOperands()); 1036 } 1037 1038 const RegisterBankInfo::InstructionMapping & 1039 AMDGPURegisterBankInfo::getDefaultMappingAllVGPR(const MachineInstr &MI) const { 1040 const MachineFunction &MF = *MI.getParent()->getParent(); 1041 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1042 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1043 1044 for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) { 1045 unsigned Size = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI); 1046 OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1047 } 1048 1049 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 1050 MI.getNumOperands()); 1051 } 1052 1053 const RegisterBankInfo::InstructionMapping & 1054 AMDGPURegisterBankInfo::getInstrMappingForLoad(const MachineInstr &MI) const { 1055 1056 const MachineFunction &MF = *MI.getParent()->getParent(); 1057 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1058 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1059 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1060 unsigned PtrSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 1061 1062 const ValueMapping *ValMapping; 1063 const ValueMapping *PtrMapping; 1064 1065 if (isInstrUniform(MI)) { 1066 // We have a uniform instruction so we want to use an SMRD load 1067 ValMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1068 PtrMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize); 1069 } else { 1070 ValMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1071 // FIXME: What would happen if we used SGPRRegBankID here? 1072 PtrMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize); 1073 } 1074 1075 OpdsMapping[0] = ValMapping; 1076 OpdsMapping[1] = PtrMapping; 1077 const RegisterBankInfo::InstructionMapping &Mapping = getInstructionMapping( 1078 1, 1, getOperandsMapping(OpdsMapping), MI.getNumOperands()); 1079 return Mapping; 1080 1081 // FIXME: Do we want to add a mapping for FLAT load, or should we just 1082 // handle that during instruction selection? 1083 } 1084 1085 unsigned 1086 AMDGPURegisterBankInfo::getRegBankID(unsigned Reg, 1087 const MachineRegisterInfo &MRI, 1088 const TargetRegisterInfo &TRI, 1089 unsigned Default) const { 1090 1091 const RegisterBank *Bank = getRegBank(Reg, MRI, TRI); 1092 return Bank ? Bank->getID() : Default; 1093 } 1094 1095 /// 1096 /// This function must return a legal mapping, because 1097 /// AMDGPURegisterBankInfo::getInstrAlternativeMappings() is not called 1098 /// in RegBankSelect::Mode::Fast. Any mapping that would cause a 1099 /// VGPR to SGPR generated is illegal. 1100 /// 1101 const RegisterBankInfo::InstructionMapping & 1102 AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 1103 const MachineFunction &MF = *MI.getParent()->getParent(); 1104 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1105 1106 if (MI.isRegSequence()) { 1107 // If any input is a VGPR, the result must be a VGPR. The default handling 1108 // assumes any copy between banks is legal. 1109 unsigned BankID = AMDGPU::SGPRRegBankID; 1110 1111 for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) { 1112 auto OpBank = getRegBankID(MI.getOperand(I).getReg(), MRI, *TRI); 1113 // It doesn't make sense to use vcc or scc banks here, so just ignore 1114 // them. 1115 if (OpBank != AMDGPU::SGPRRegBankID) { 1116 BankID = AMDGPU::VGPRRegBankID; 1117 break; 1118 } 1119 } 1120 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1121 1122 const ValueMapping &ValMap = getValueMapping(0, Size, getRegBank(BankID)); 1123 return getInstructionMapping( 1124 1, /*Cost*/ 1, 1125 /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1); 1126 } 1127 1128 // The default handling is broken and doesn't handle illegal SGPR->VGPR copies 1129 // properly. 1130 // 1131 // TODO: There are additional exec masking dependencies to analyze. 1132 if (MI.getOpcode() == TargetOpcode::G_PHI) { 1133 // TODO: Generate proper invalid bank enum. 1134 int ResultBank = -1; 1135 1136 for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) { 1137 unsigned Reg = MI.getOperand(I).getReg(); 1138 const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI); 1139 1140 // FIXME: Assuming VGPR for any undetermined inputs. 1141 if (!Bank || Bank->getID() == AMDGPU::VGPRRegBankID) { 1142 ResultBank = AMDGPU::VGPRRegBankID; 1143 break; 1144 } 1145 1146 unsigned OpBank = Bank->getID(); 1147 // scc, scc -> sgpr 1148 if (OpBank == AMDGPU::SCCRegBankID) { 1149 // There's only one SCC register, so a phi requires copying to SGPR. 1150 OpBank = AMDGPU::SGPRRegBankID; 1151 } else if (OpBank == AMDGPU::VCCRegBankID) { 1152 // vcc, vcc -> vcc 1153 // vcc, sgpr -> vgpr 1154 if (ResultBank != -1 && ResultBank != AMDGPU::VCCRegBankID) { 1155 ResultBank = AMDGPU::VGPRRegBankID; 1156 break; 1157 } 1158 } 1159 1160 ResultBank = OpBank; 1161 } 1162 1163 assert(ResultBank != -1); 1164 1165 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1166 1167 const ValueMapping &ValMap = 1168 getValueMapping(0, Size, getRegBank(ResultBank)); 1169 return getInstructionMapping( 1170 1, /*Cost*/ 1, 1171 /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1); 1172 } 1173 1174 const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 1175 if (Mapping.isValid()) 1176 return Mapping; 1177 1178 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1179 1180 switch (MI.getOpcode()) { 1181 default: 1182 return getInvalidInstructionMapping(); 1183 1184 case AMDGPU::G_AND: 1185 case AMDGPU::G_OR: 1186 case AMDGPU::G_XOR: { 1187 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1188 if (Size == 1) { 1189 OpdsMapping[0] = OpdsMapping[1] = 1190 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size); 1191 break; 1192 } 1193 1194 if (Size == 64) { 1195 1196 if (isSALUMapping(MI)) { 1197 OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size); 1198 OpdsMapping[1] = OpdsMapping[2] = OpdsMapping[0]; 1199 } else { 1200 OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size); 1201 unsigned Bank1 = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI/*, DefaultBankID*/); 1202 OpdsMapping[1] = AMDGPU::getValueMapping(Bank1, Size); 1203 1204 unsigned Bank2 = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI/*, DefaultBankID*/); 1205 OpdsMapping[2] = AMDGPU::getValueMapping(Bank2, Size); 1206 } 1207 1208 break; 1209 } 1210 1211 LLVM_FALLTHROUGH; 1212 } 1213 1214 case AMDGPU::G_GEP: 1215 case AMDGPU::G_ADD: 1216 case AMDGPU::G_SUB: 1217 case AMDGPU::G_MUL: 1218 case AMDGPU::G_SHL: 1219 case AMDGPU::G_LSHR: 1220 case AMDGPU::G_ASHR: 1221 case AMDGPU::G_UADDO: 1222 case AMDGPU::G_SADDO: 1223 case AMDGPU::G_USUBO: 1224 case AMDGPU::G_SSUBO: 1225 case AMDGPU::G_UADDE: 1226 case AMDGPU::G_SADDE: 1227 case AMDGPU::G_USUBE: 1228 case AMDGPU::G_SSUBE: 1229 case AMDGPU::G_UMULH: 1230 case AMDGPU::G_SMULH: 1231 if (isSALUMapping(MI)) 1232 return getDefaultMappingSOP(MI); 1233 LLVM_FALLTHROUGH; 1234 1235 case AMDGPU::G_SMIN: 1236 case AMDGPU::G_SMAX: 1237 case AMDGPU::G_UMIN: 1238 case AMDGPU::G_UMAX: 1239 // TODO: min/max can be scalar, but requires expanding as a compare and 1240 // select. 1241 1242 case AMDGPU::G_FADD: 1243 case AMDGPU::G_FSUB: 1244 case AMDGPU::G_FPTOSI: 1245 case AMDGPU::G_FPTOUI: 1246 case AMDGPU::G_FMUL: 1247 case AMDGPU::G_FMA: 1248 case AMDGPU::G_FSQRT: 1249 case AMDGPU::G_SITOFP: 1250 case AMDGPU::G_UITOFP: 1251 case AMDGPU::G_FPTRUNC: 1252 case AMDGPU::G_FPEXT: 1253 case AMDGPU::G_FEXP2: 1254 case AMDGPU::G_FLOG2: 1255 case AMDGPU::G_INTRINSIC_TRUNC: 1256 case AMDGPU::G_INTRINSIC_ROUND: 1257 return getDefaultMappingVOP(MI); 1258 case AMDGPU::G_IMPLICIT_DEF: { 1259 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1260 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1261 break; 1262 } 1263 case AMDGPU::G_FCONSTANT: 1264 case AMDGPU::G_CONSTANT: 1265 case AMDGPU::G_FRAME_INDEX: 1266 case AMDGPU::G_BLOCK_ADDR: { 1267 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1268 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1269 break; 1270 } 1271 case AMDGPU::G_INSERT: { 1272 unsigned BankID = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID : 1273 AMDGPU::VGPRRegBankID; 1274 unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1275 unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 1276 unsigned EltSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI); 1277 OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize); 1278 OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize); 1279 OpdsMapping[2] = AMDGPU::getValueMapping(BankID, EltSize); 1280 OpdsMapping[3] = nullptr; 1281 break; 1282 } 1283 case AMDGPU::G_EXTRACT: { 1284 unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI); 1285 unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1286 unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 1287 OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize); 1288 OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize); 1289 OpdsMapping[2] = nullptr; 1290 break; 1291 } 1292 case AMDGPU::G_MERGE_VALUES: { 1293 unsigned Bank = isSALUMapping(MI) ? 1294 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1295 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1296 unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1297 1298 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize); 1299 // Op1 and Dst should use the same register bank. 1300 for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i) 1301 OpdsMapping[i] = AMDGPU::getValueMapping(Bank, SrcSize); 1302 break; 1303 } 1304 case AMDGPU::G_BITCAST: 1305 case AMDGPU::G_INTTOPTR: 1306 case AMDGPU::G_PTRTOINT: 1307 case AMDGPU::G_CTLZ: 1308 case AMDGPU::G_CTLZ_ZERO_UNDEF: 1309 case AMDGPU::G_CTTZ: 1310 case AMDGPU::G_CTTZ_ZERO_UNDEF: 1311 case AMDGPU::G_CTPOP: 1312 case AMDGPU::G_BSWAP: 1313 case AMDGPU::G_FABS: 1314 case AMDGPU::G_FNEG: { 1315 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1316 unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI); 1317 OpdsMapping[0] = OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size); 1318 break; 1319 } 1320 case AMDGPU::G_TRUNC: { 1321 unsigned Dst = MI.getOperand(0).getReg(); 1322 unsigned Src = MI.getOperand(1).getReg(); 1323 unsigned Bank = getRegBankID(Src, MRI, *TRI); 1324 unsigned DstSize = getSizeInBits(Dst, MRI, *TRI); 1325 unsigned SrcSize = getSizeInBits(Src, MRI, *TRI); 1326 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize); 1327 OpdsMapping[1] = AMDGPU::getValueMapping(Bank, SrcSize); 1328 break; 1329 } 1330 case AMDGPU::G_ZEXT: 1331 case AMDGPU::G_SEXT: 1332 case AMDGPU::G_ANYEXT: { 1333 unsigned Dst = MI.getOperand(0).getReg(); 1334 unsigned Src = MI.getOperand(1).getReg(); 1335 unsigned DstSize = getSizeInBits(Dst, MRI, *TRI); 1336 unsigned SrcSize = getSizeInBits(Src, MRI, *TRI); 1337 1338 unsigned DstBank; 1339 const RegisterBank *SrcBank = getRegBank(Src, MRI, *TRI); 1340 assert(SrcBank); 1341 switch (SrcBank->getID()) { 1342 case AMDGPU::SCCRegBankID: 1343 case AMDGPU::SGPRRegBankID: 1344 DstBank = AMDGPU::SGPRRegBankID; 1345 break; 1346 default: 1347 DstBank = AMDGPU::VGPRRegBankID; 1348 break; 1349 } 1350 1351 // TODO: Should anyext be split into 32-bit part as well? 1352 if (MI.getOpcode() == AMDGPU::G_ANYEXT) { 1353 OpdsMapping[0] = AMDGPU::getValueMapping(DstBank, DstSize); 1354 OpdsMapping[1] = AMDGPU::getValueMapping(SrcBank->getID(), SrcSize); 1355 } else { 1356 // Scalar extend can use 64-bit BFE, but VGPRs require extending to 1357 // 32-bits, and then to 64. 1358 OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(DstBank, DstSize); 1359 OpdsMapping[1] = AMDGPU::getValueMappingSGPR64Only(SrcBank->getID(), 1360 SrcSize); 1361 } 1362 break; 1363 } 1364 case AMDGPU::G_FCMP: { 1365 unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1366 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1367 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1); 1368 OpdsMapping[1] = nullptr; // Predicate Operand. 1369 OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size); 1370 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1371 break; 1372 } 1373 case AMDGPU::G_STORE: { 1374 assert(MI.getOperand(0).isReg()); 1375 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1376 // FIXME: We need to specify a different reg bank once scalar stores 1377 // are supported. 1378 const ValueMapping *ValMapping = 1379 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1380 // FIXME: Depending on the type of store, the pointer could be in 1381 // the SGPR Reg bank. 1382 // FIXME: Pointer size should be based on the address space. 1383 const ValueMapping *PtrMapping = 1384 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64); 1385 1386 OpdsMapping[0] = ValMapping; 1387 OpdsMapping[1] = PtrMapping; 1388 break; 1389 } 1390 1391 case AMDGPU::G_ICMP: { 1392 unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1393 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1394 unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 1395 unsigned Op0Bank = Op2Bank == AMDGPU::SGPRRegBankID && 1396 Op3Bank == AMDGPU::SGPRRegBankID ? 1397 AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID; 1398 OpdsMapping[0] = AMDGPU::getValueMapping(Op0Bank, 1); 1399 OpdsMapping[1] = nullptr; // Predicate Operand. 1400 OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size); 1401 OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size); 1402 break; 1403 } 1404 1405 1406 case AMDGPU::G_EXTRACT_VECTOR_ELT: { 1407 unsigned OutputBankID = isSALUMapping(MI) ? 1408 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1409 unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1410 unsigned IdxSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1411 unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1412 1413 OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, SrcSize); 1414 OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, SrcSize); 1415 1416 // The index can be either if the source vector is VGPR. 1417 OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, IdxSize); 1418 break; 1419 } 1420 case AMDGPU::G_INSERT_VECTOR_ELT: { 1421 unsigned OutputBankID = isSALUMapping(MI) ? 1422 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1423 1424 unsigned VecSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1425 unsigned InsertSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1426 unsigned IdxSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits(); 1427 unsigned InsertEltBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1428 unsigned IdxBank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 1429 1430 OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, VecSize); 1431 OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, VecSize); 1432 OpdsMapping[2] = AMDGPU::getValueMapping(InsertEltBank, InsertSize); 1433 1434 // The index can be either if the source vector is VGPR. 1435 OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize); 1436 break; 1437 } 1438 case AMDGPU::G_UNMERGE_VALUES: { 1439 unsigned Bank = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID : 1440 AMDGPU::VGPRRegBankID; 1441 1442 // Op1 and Dst should use the same register bank. 1443 // FIXME: Shouldn't this be the default? Why do we need to handle this? 1444 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 1445 unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); 1446 OpdsMapping[i] = AMDGPU::getValueMapping(Bank, Size); 1447 } 1448 break; 1449 } 1450 case AMDGPU::G_INTRINSIC: { 1451 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 1452 default: 1453 return getInvalidInstructionMapping(); 1454 case Intrinsic::maxnum: 1455 case Intrinsic::minnum: 1456 case Intrinsic::amdgcn_cvt_pkrtz: 1457 return getDefaultMappingVOP(MI); 1458 case Intrinsic::amdgcn_kernarg_segment_ptr: { 1459 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1460 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1461 break; 1462 } 1463 case Intrinsic::amdgcn_wqm_vote: { 1464 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1465 OpdsMapping[0] = OpdsMapping[2] 1466 = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1467 break; 1468 } 1469 case Intrinsic::amdgcn_s_buffer_load: { 1470 // FIXME: This should be moved to G_INTRINSIC_W_SIDE_EFFECTS 1471 unsigned RSrc = MI.getOperand(2).getReg(); // SGPR 1472 unsigned Offset = MI.getOperand(3).getReg(); // SGPR/imm 1473 1474 unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1475 unsigned Size2 = MRI.getType(RSrc).getSizeInBits(); 1476 unsigned Size3 = MRI.getType(Offset).getSizeInBits(); 1477 1478 unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI); 1479 unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI); 1480 1481 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size0); 1482 OpdsMapping[1] = nullptr; // intrinsic id 1483 1484 // Lie and claim everything is legal, even though some need to be 1485 // SGPRs. applyMapping will have to deal with it as a waterfall loop. 1486 OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc 1487 OpdsMapping[3] = AMDGPU::getValueMapping(OffsetBank, Size3); 1488 OpdsMapping[4] = nullptr; 1489 break; 1490 } 1491 case Intrinsic::amdgcn_div_scale: { 1492 unsigned Dst0Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1493 unsigned Dst1Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1494 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Dst0Size); 1495 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Dst1Size); 1496 1497 unsigned SrcSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits(); 1498 OpdsMapping[3] = AMDGPU::getValueMapping( 1499 getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI), SrcSize); 1500 OpdsMapping[4] = AMDGPU::getValueMapping( 1501 getRegBankID(MI.getOperand(4).getReg(), MRI, *TRI), SrcSize); 1502 1503 break; 1504 } 1505 case Intrinsic::amdgcn_class: { 1506 unsigned Src0Reg = MI.getOperand(2).getReg(); 1507 unsigned Src1Reg = MI.getOperand(3).getReg(); 1508 unsigned Src0Size = MRI.getType(Src0Reg).getSizeInBits(); 1509 unsigned Src1Size = MRI.getType(Src1Reg).getSizeInBits(); 1510 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1511 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, DstSize); 1512 OpdsMapping[2] = AMDGPU::getValueMapping(getRegBankID(Src0Reg, MRI, *TRI), 1513 Src0Size); 1514 OpdsMapping[3] = AMDGPU::getValueMapping(getRegBankID(Src1Reg, MRI, *TRI), 1515 Src1Size); 1516 break; 1517 } 1518 } 1519 break; 1520 } 1521 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: { 1522 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 1523 default: 1524 return getInvalidInstructionMapping(); 1525 case Intrinsic::amdgcn_exp_compr: 1526 OpdsMapping[0] = nullptr; // IntrinsicID 1527 // FIXME: These are immediate values which can't be read from registers. 1528 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1529 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1530 // FIXME: Could we support packed types here? 1531 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1532 OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1533 // FIXME: These are immediate values which can't be read from registers. 1534 OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1535 OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1536 break; 1537 case Intrinsic::amdgcn_exp: 1538 OpdsMapping[0] = nullptr; // IntrinsicID 1539 // FIXME: These are immediate values which can't be read from registers. 1540 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1541 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1542 // FIXME: Could we support packed types here? 1543 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1544 OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1545 OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1546 OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 1547 // FIXME: These are immediate values which can't be read from registers. 1548 OpdsMapping[7] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1549 OpdsMapping[8] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 1550 break; 1551 case Intrinsic::amdgcn_buffer_load: { 1552 unsigned RSrc = MI.getOperand(2).getReg(); // SGPR 1553 unsigned VIndex = MI.getOperand(3).getReg(); // VGPR 1554 unsigned Offset = MI.getOperand(4).getReg(); // SGPR/VGPR/imm 1555 1556 unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1557 unsigned Size2 = MRI.getType(RSrc).getSizeInBits(); 1558 unsigned Size3 = MRI.getType(VIndex).getSizeInBits(); 1559 unsigned Size4 = MRI.getType(Offset).getSizeInBits(); 1560 1561 unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI); 1562 unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI); 1563 1564 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0); 1565 OpdsMapping[1] = nullptr; // intrinsic id 1566 1567 // Lie and claim everything is legal, even though some need to be 1568 // SGPRs. applyMapping will have to deal with it as a waterfall loop. 1569 OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc 1570 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size3); 1571 OpdsMapping[4] = AMDGPU::getValueMapping(OffsetBank, Size4); 1572 OpdsMapping[5] = nullptr; 1573 OpdsMapping[6] = nullptr; 1574 break; 1575 } 1576 } 1577 1578 break; 1579 } 1580 case AMDGPU::G_SELECT: { 1581 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1582 unsigned Op1Bank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI, 1583 AMDGPU::SGPRRegBankID); 1584 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1585 unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 1586 bool SGPRSrcs = Op1Bank == AMDGPU::SCCRegBankID && 1587 Op2Bank == AMDGPU::SGPRRegBankID && 1588 Op3Bank == AMDGPU::SGPRRegBankID; 1589 unsigned Bank = SGPRSrcs ? AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1590 Op1Bank = SGPRSrcs ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID; 1591 1592 if (Size == 64) { 1593 OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 1594 OpdsMapping[1] = AMDGPU::getValueMapping(Op1Bank, 1); 1595 OpdsMapping[2] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 1596 OpdsMapping[3] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 1597 } else { 1598 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, Size); 1599 OpdsMapping[1] = AMDGPU::getValueMapping(Op1Bank, 1); 1600 OpdsMapping[2] = AMDGPU::getValueMapping(Bank, Size); 1601 OpdsMapping[3] = AMDGPU::getValueMapping(Bank, Size); 1602 } 1603 1604 break; 1605 } 1606 1607 case AMDGPU::G_LOAD: 1608 return getInstrMappingForLoad(MI); 1609 1610 case AMDGPU::G_ATOMICRMW_XCHG: 1611 case AMDGPU::G_ATOMICRMW_ADD: 1612 case AMDGPU::G_ATOMICRMW_SUB: 1613 case AMDGPU::G_ATOMICRMW_AND: 1614 case AMDGPU::G_ATOMICRMW_OR: 1615 case AMDGPU::G_ATOMICRMW_XOR: 1616 case AMDGPU::G_ATOMICRMW_MAX: 1617 case AMDGPU::G_ATOMICRMW_MIN: 1618 case AMDGPU::G_ATOMICRMW_UMAX: 1619 case AMDGPU::G_ATOMICRMW_UMIN: 1620 case AMDGPU::G_ATOMIC_CMPXCHG: { 1621 return getDefaultMappingAllVGPR(MI); 1622 } 1623 case AMDGPU::G_BRCOND: { 1624 unsigned Bank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI, 1625 AMDGPU::SGPRRegBankID); 1626 assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1); 1627 if (Bank != AMDGPU::SCCRegBankID) 1628 Bank = AMDGPU::VCCRegBankID; 1629 1630 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, 1); 1631 break; 1632 } 1633 } 1634 1635 return getInstructionMapping(/*ID*/1, /*Cost*/1, 1636 getOperandsMapping(OpdsMapping), 1637 MI.getNumOperands()); 1638 } 1639 1640