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 "MCTargetDesc/AMDGPUMCTargetDesc.h" 18 #include "SIMachineFunctionInfo.h" 19 #include "SIRegisterInfo.h" 20 #include "llvm/ADT/SmallSet.h" 21 #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h" 22 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 23 #include "llvm/CodeGen/GlobalISel/RegisterBank.h" 24 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" 25 #include "llvm/CodeGen/TargetRegisterInfo.h" 26 #include "llvm/CodeGen/TargetSubtargetInfo.h" 27 #include "llvm/IR/Constants.h" 28 29 #define GET_TARGET_REGBANK_IMPL 30 #include "AMDGPUGenRegisterBank.inc" 31 32 // This file will be TableGen'ed at some point. 33 #include "AMDGPUGenRegisterBankInfo.def" 34 35 using namespace llvm; 36 37 namespace { 38 39 // Observer to apply a register bank to new registers created by LegalizerHelper. 40 class ApplyRegBankMapping final : public GISelChangeObserver { 41 private: 42 MachineRegisterInfo &MRI; 43 const RegisterBank *NewBank; 44 SmallVector<MachineInstr *, 4> NewInsts; 45 46 public: 47 ApplyRegBankMapping(MachineRegisterInfo &MRI_, const RegisterBank *RB) 48 : MRI(MRI_), NewBank(RB) {} 49 50 ~ApplyRegBankMapping() { 51 for (MachineInstr *MI : NewInsts) 52 applyBank(*MI); 53 } 54 55 /// Set any registers that don't have a set register class or bank to SALU. 56 void applyBank(MachineInstr &MI) { 57 for (MachineOperand &Op : MI.operands()) { 58 if (!Op.isReg()) 59 continue; 60 61 Register Reg = Op.getReg(); 62 if (MRI.getRegClassOrRegBank(Reg)) 63 continue; 64 65 const RegisterBank *RB = NewBank; 66 // FIXME: This might not be enough to detect when SCC should be used. 67 if (MRI.getType(Reg) == LLT::scalar(1)) 68 RB = (NewBank == &AMDGPU::SGPRRegBank ? 69 &AMDGPU::SCCRegBank : &AMDGPU::VCCRegBank); 70 71 MRI.setRegBank(Reg, *RB); 72 } 73 } 74 75 void erasingInstr(MachineInstr &MI) override {} 76 77 void createdInstr(MachineInstr &MI) override { 78 // At this point, the instruction was just inserted and has no operands. 79 NewInsts.push_back(&MI); 80 } 81 82 void changingInstr(MachineInstr &MI) override {} 83 void changedInstr(MachineInstr &MI) override {} 84 }; 85 86 } 87 AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI) 88 : AMDGPUGenRegisterBankInfo(), 89 TRI(static_cast<const SIRegisterInfo*>(&TRI)) { 90 91 // HACK: Until this is fully tablegen'd. 92 static bool AlreadyInit = false; 93 if (AlreadyInit) 94 return; 95 96 AlreadyInit = true; 97 98 const RegisterBank &RBSGPR = getRegBank(AMDGPU::SGPRRegBankID); 99 (void)RBSGPR; 100 assert(&RBSGPR == &AMDGPU::SGPRRegBank); 101 102 const RegisterBank &RBVGPR = getRegBank(AMDGPU::VGPRRegBankID); 103 (void)RBVGPR; 104 assert(&RBVGPR == &AMDGPU::VGPRRegBank); 105 106 } 107 108 unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst, 109 const RegisterBank &Src, 110 unsigned Size) const { 111 // TODO: Should there be a UniformVGPRRegBank which can use readfirstlane? 112 if (Dst.getID() == AMDGPU::SGPRRegBankID && 113 Src.getID() == AMDGPU::VGPRRegBankID) { 114 return std::numeric_limits<unsigned>::max(); 115 } 116 117 // Bool values are tricky, because the meaning is based on context. The SCC 118 // and VCC banks are for the natural scalar and vector conditions produced by 119 // a compare. 120 // 121 // Legalization doesn't know about the necessary context, so an s1 use may 122 // have been a truncate from an arbitrary value, in which case a copy (lowered 123 // as a compare with 0) needs to be inserted. 124 if (Size == 1 && 125 (Dst.getID() == AMDGPU::SCCRegBankID || 126 Dst.getID() == AMDGPU::SGPRRegBankID) && 127 (Src.getID() == AMDGPU::SGPRRegBankID || 128 Src.getID() == AMDGPU::VGPRRegBankID || 129 Src.getID() == AMDGPU::VCCRegBankID)) 130 return std::numeric_limits<unsigned>::max(); 131 132 if (Dst.getID() == AMDGPU::SCCRegBankID && 133 Src.getID() == AMDGPU::VCCRegBankID) 134 return std::numeric_limits<unsigned>::max(); 135 136 return RegisterBankInfo::copyCost(Dst, Src, Size); 137 } 138 139 unsigned AMDGPURegisterBankInfo::getBreakDownCost( 140 const ValueMapping &ValMapping, 141 const RegisterBank *CurBank) const { 142 // Check if this is a breakdown for G_LOAD to move the pointer from SGPR to 143 // VGPR. 144 // FIXME: Is there a better way to do this? 145 if (ValMapping.NumBreakDowns >= 2 || ValMapping.BreakDown[0].Length >= 64) 146 return 10; // This is expensive. 147 148 assert(ValMapping.NumBreakDowns == 2 && 149 ValMapping.BreakDown[0].Length == 32 && 150 ValMapping.BreakDown[0].StartIdx == 0 && 151 ValMapping.BreakDown[1].Length == 32 && 152 ValMapping.BreakDown[1].StartIdx == 32 && 153 ValMapping.BreakDown[0].RegBank == ValMapping.BreakDown[1].RegBank); 154 155 // 32-bit extract of a 64-bit value is just access of a subregister, so free. 156 // TODO: Cost of 0 hits assert, though it's not clear it's what we really 157 // want. 158 159 // TODO: 32-bit insert to a 64-bit SGPR may incur a non-free copy due to SGPR 160 // alignment restrictions, but this probably isn't important. 161 return 1; 162 } 163 164 const RegisterBank &AMDGPURegisterBankInfo::getRegBankFromRegClass( 165 const TargetRegisterClass &RC) const { 166 if (&RC == &AMDGPU::SReg_1RegClass) 167 return AMDGPU::VCCRegBank; 168 169 return TRI->isSGPRClass(&RC) ? AMDGPU::SGPRRegBank : AMDGPU::VGPRRegBank; 170 } 171 172 template <unsigned NumOps> 173 RegisterBankInfo::InstructionMappings 174 AMDGPURegisterBankInfo::addMappingFromTable( 175 const MachineInstr &MI, const MachineRegisterInfo &MRI, 176 const std::array<unsigned, NumOps> RegSrcOpIdx, 177 ArrayRef<OpRegBankEntry<NumOps>> Table) const { 178 179 InstructionMappings AltMappings; 180 181 SmallVector<const ValueMapping *, 10> Operands(MI.getNumOperands()); 182 183 unsigned Sizes[NumOps]; 184 for (unsigned I = 0; I < NumOps; ++I) { 185 Register Reg = MI.getOperand(RegSrcOpIdx[I]).getReg(); 186 Sizes[I] = getSizeInBits(Reg, MRI, *TRI); 187 } 188 189 for (unsigned I = 0, E = MI.getNumExplicitDefs(); I != E; ++I) { 190 unsigned SizeI = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI); 191 Operands[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SizeI); 192 } 193 194 // getInstrMapping's default mapping uses ID 1, so start at 2. 195 unsigned MappingID = 2; 196 for (const auto &Entry : Table) { 197 for (unsigned I = 0; I < NumOps; ++I) { 198 int OpIdx = RegSrcOpIdx[I]; 199 Operands[OpIdx] = AMDGPU::getValueMapping(Entry.RegBanks[I], Sizes[I]); 200 } 201 202 AltMappings.push_back(&getInstructionMapping(MappingID++, Entry.Cost, 203 getOperandsMapping(Operands), 204 Operands.size())); 205 } 206 207 return AltMappings; 208 } 209 210 RegisterBankInfo::InstructionMappings 211 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsic( 212 const MachineInstr &MI, const MachineRegisterInfo &MRI) const { 213 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 214 case Intrinsic::amdgcn_readlane: { 215 static const OpRegBankEntry<3> Table[2] = { 216 // Perfectly legal. 217 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 218 219 // Need a readfirstlane for the index. 220 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 } 221 }; 222 223 const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } }; 224 return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 225 } 226 case Intrinsic::amdgcn_writelane: { 227 static const OpRegBankEntry<4> Table[4] = { 228 // Perfectly legal. 229 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 230 231 // Need readfirstlane of first op 232 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }, 233 234 // Need readfirstlane of second op 235 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }, 236 237 // Need readfirstlane of both ops 238 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 3 } 239 }; 240 241 // rsrc, voffset, offset 242 const std::array<unsigned, 4> RegSrcOpIdx = { { 0, 2, 3, 4 } }; 243 return addMappingFromTable<4>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 244 } 245 default: 246 return RegisterBankInfo::getInstrAlternativeMappings(MI); 247 } 248 } 249 250 RegisterBankInfo::InstructionMappings 251 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsicWSideEffects( 252 const MachineInstr &MI, const MachineRegisterInfo &MRI) const { 253 254 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 255 case Intrinsic::amdgcn_buffer_load: { 256 static const OpRegBankEntry<3> Table[4] = { 257 // Perfectly legal. 258 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 259 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 260 261 // Waterfall loop needed for rsrc. In the worst case this will execute 262 // approximately an extra 10 * wavesize + 2 instructions. 263 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 }, 264 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1000 } 265 }; 266 267 // rsrc, voffset, offset 268 const std::array<unsigned, 3> RegSrcOpIdx = { { 2, 3, 4 } }; 269 return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 270 } 271 case Intrinsic::amdgcn_s_buffer_load: { 272 static const OpRegBankEntry<2> Table[4] = { 273 // Perfectly legal. 274 { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 275 276 // Only need 1 register in loop 277 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 300 }, 278 279 // Have to waterfall the resource. 280 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 }, 281 282 // Have to waterfall the resource, and the offset. 283 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1500 } 284 }; 285 286 // rsrc, offset 287 const std::array<unsigned, 2> RegSrcOpIdx = { { 2, 3 } }; 288 return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 289 } 290 case Intrinsic::amdgcn_ds_ordered_add: 291 case Intrinsic::amdgcn_ds_ordered_swap: { 292 // VGPR = M0, VGPR 293 static const OpRegBankEntry<3> Table[2] = { 294 // Perfectly legal. 295 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 296 297 // Need a readfirstlane for m0 298 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 } 299 }; 300 301 const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } }; 302 return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 303 } 304 case Intrinsic::amdgcn_s_sendmsg: 305 case Intrinsic::amdgcn_s_sendmsghalt: { 306 // FIXME: Should have no register for immediate 307 static const OpRegBankEntry<2> Table[2] = { 308 // Perfectly legal. 309 { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 310 311 // Need readlane 312 { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 3 } 313 }; 314 315 const std::array<unsigned, 2> RegSrcOpIdx = { { 1, 2 } }; 316 return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 317 } 318 default: 319 return RegisterBankInfo::getInstrAlternativeMappings(MI); 320 } 321 } 322 323 static bool isInstrUniformNonExtLoadAlign4(const MachineInstr &MI) { 324 if (!MI.hasOneMemOperand()) 325 return false; 326 327 const MachineMemOperand *MMO = *MI.memoperands_begin(); 328 return MMO->getSize() >= 4 && MMO->getAlignment() >= 4 && 329 AMDGPUInstrInfo::isUniformMMO(MMO); 330 } 331 332 RegisterBankInfo::InstructionMappings 333 AMDGPURegisterBankInfo::getInstrAlternativeMappings( 334 const MachineInstr &MI) const { 335 336 const MachineFunction &MF = *MI.getParent()->getParent(); 337 const MachineRegisterInfo &MRI = MF.getRegInfo(); 338 339 340 InstructionMappings AltMappings; 341 switch (MI.getOpcode()) { 342 case TargetOpcode::G_CONSTANT: 343 case TargetOpcode::G_FCONSTANT: 344 case TargetOpcode::G_FRAME_INDEX: 345 case TargetOpcode::G_GLOBAL_VALUE: { 346 static const OpRegBankEntry<1> Table[2] = { 347 { { AMDGPU::VGPRRegBankID }, 1 }, 348 { { AMDGPU::SGPRRegBankID }, 1 } 349 }; 350 351 return addMappingFromTable<1>(MI, MRI, { 0 }, Table); 352 } 353 case TargetOpcode::G_AND: 354 case TargetOpcode::G_OR: 355 case TargetOpcode::G_XOR: { 356 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 357 358 if (Size == 1) { 359 // s_{and|or|xor}_b32 set scc when the result of the 32-bit op is not 0. 360 const InstructionMapping &SCCMapping = getInstructionMapping( 361 1, 1, getOperandsMapping( 362 {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, Size), 363 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 364 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 365 3); // Num Operands 366 AltMappings.push_back(&SCCMapping); 367 368 const InstructionMapping &SGPRMapping = getInstructionMapping( 369 1, 1, getOperandsMapping( 370 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 371 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 372 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 373 3); // Num Operands 374 AltMappings.push_back(&SGPRMapping); 375 376 const InstructionMapping &VCCMapping0 = getInstructionMapping( 377 2, 10, getOperandsMapping( 378 {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size), 379 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size), 380 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size)}), 381 3); // Num Operands 382 AltMappings.push_back(&VCCMapping0); 383 return AltMappings; 384 } 385 386 if (Size != 64) 387 break; 388 389 const InstructionMapping &SSMapping = getInstructionMapping( 390 1, 1, getOperandsMapping( 391 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 392 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 393 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 394 3); // Num Operands 395 AltMappings.push_back(&SSMapping); 396 397 const InstructionMapping &VVMapping = getInstructionMapping( 398 2, 2, getOperandsMapping( 399 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 400 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 401 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 402 3); // Num Operands 403 AltMappings.push_back(&VVMapping); 404 405 const InstructionMapping &SVMapping = getInstructionMapping( 406 3, 3, getOperandsMapping( 407 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 408 AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size), 409 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 410 3); // Num Operands 411 AltMappings.push_back(&SVMapping); 412 413 // SGPR in LHS is slightly preferrable, so make it VS more expensive than 414 // SV. 415 const InstructionMapping &VSMapping = getInstructionMapping( 416 3, 4, getOperandsMapping( 417 {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 418 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 419 AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size)}), 420 3); // Num Operands 421 AltMappings.push_back(&VSMapping); 422 break; 423 } 424 case TargetOpcode::G_LOAD: 425 case TargetOpcode::G_ZEXTLOAD: 426 case TargetOpcode::G_SEXTLOAD: { 427 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 428 LLT PtrTy = MRI.getType(MI.getOperand(1).getReg()); 429 unsigned PtrSize = PtrTy.getSizeInBits(); 430 unsigned AS = PtrTy.getAddressSpace(); 431 LLT LoadTy = MRI.getType(MI.getOperand(0).getReg()); 432 if (isInstrUniformNonExtLoadAlign4(MI) && 433 (AS != AMDGPUAS::LOCAL_ADDRESS && AS != AMDGPUAS::REGION_ADDRESS)) { 434 const InstructionMapping &SSMapping = getInstructionMapping( 435 1, 1, getOperandsMapping( 436 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 437 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize)}), 438 2); // Num Operands 439 AltMappings.push_back(&SSMapping); 440 } 441 442 const InstructionMapping &VVMapping = getInstructionMapping( 443 2, 1, getOperandsMapping( 444 {AMDGPU::getValueMappingLoadSGPROnly(AMDGPU::VGPRRegBankID, LoadTy), 445 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize)}), 446 2); // Num Operands 447 AltMappings.push_back(&VVMapping); 448 449 // It may be possible to have a vgpr = load sgpr mapping here, because 450 // the mubuf instructions support this kind of load, but probably for only 451 // gfx7 and older. However, the addressing mode matching in the instruction 452 // selector should be able to do a better job of detecting and selecting 453 // these kinds of loads from the vgpr = load vgpr mapping. 454 455 return AltMappings; 456 457 } 458 case TargetOpcode::G_ICMP: { 459 unsigned Size = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI); 460 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 461 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 462 nullptr, // Predicate operand. 463 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 464 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 465 4); // Num Operands 466 AltMappings.push_back(&SSMapping); 467 468 const InstructionMapping &SVMapping = getInstructionMapping(2, 1, 469 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 470 nullptr, // Predicate operand. 471 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 472 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}), 473 4); // Num Operands 474 AltMappings.push_back(&SVMapping); 475 476 const InstructionMapping &VSMapping = getInstructionMapping(3, 1, 477 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 478 nullptr, // Predicate operand. 479 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 480 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 481 4); // Num Operands 482 AltMappings.push_back(&VSMapping); 483 484 const InstructionMapping &VVMapping = getInstructionMapping(4, 1, 485 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 486 nullptr, // Predicate operand. 487 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 488 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}), 489 4); // Num Operands 490 AltMappings.push_back(&VVMapping); 491 492 return AltMappings; 493 } 494 case TargetOpcode::G_SELECT: { 495 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 496 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 497 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 498 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 499 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 500 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}), 501 4); // Num Operands 502 AltMappings.push_back(&SSMapping); 503 504 const InstructionMapping &VVMapping = getInstructionMapping(2, 1, 505 getOperandsMapping({AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 506 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 507 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size), 508 AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}), 509 4); // Num Operands 510 AltMappings.push_back(&VVMapping); 511 512 return AltMappings; 513 } 514 case TargetOpcode::G_SMIN: 515 case TargetOpcode::G_SMAX: 516 case TargetOpcode::G_UMIN: 517 case TargetOpcode::G_UMAX: { 518 static const OpRegBankEntry<3> Table[4] = { 519 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 520 { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 }, 521 { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 }, 522 523 // Scalar requires cmp+select, and extends if 16-bit. 524 // FIXME: Should there be separate costs for 32 and 16-bit 525 { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 3 } 526 }; 527 528 const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 1, 2 } }; 529 return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table)); 530 } 531 case TargetOpcode::G_UADDE: 532 case TargetOpcode::G_USUBE: 533 case TargetOpcode::G_SADDE: 534 case TargetOpcode::G_SSUBE: { 535 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 536 const InstructionMapping &SSMapping = getInstructionMapping(1, 1, 537 getOperandsMapping( 538 {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 539 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), 540 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 541 AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size), 542 AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1)}), 543 5); // Num Operands 544 AltMappings.push_back(&SSMapping); 545 546 const InstructionMapping &VVMapping = getInstructionMapping(2, 1, 547 getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 548 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), 549 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 550 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size), 551 AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1)}), 552 5); // Num Operands 553 AltMappings.push_back(&VVMapping); 554 return AltMappings; 555 } 556 case AMDGPU::G_BRCOND: { 557 assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1); 558 559 const InstructionMapping &SMapping = getInstructionMapping( 560 1, 1, getOperandsMapping( 561 {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), nullptr}), 562 2); // Num Operands 563 AltMappings.push_back(&SMapping); 564 565 const InstructionMapping &VMapping = getInstructionMapping( 566 1, 1, getOperandsMapping( 567 {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), nullptr }), 568 2); // Num Operands 569 AltMappings.push_back(&VMapping); 570 return AltMappings; 571 } 572 case AMDGPU::G_INTRINSIC: 573 return getInstrAlternativeMappingsIntrinsic(MI, MRI); 574 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: 575 return getInstrAlternativeMappingsIntrinsicWSideEffects(MI, MRI); 576 default: 577 break; 578 } 579 return RegisterBankInfo::getInstrAlternativeMappings(MI); 580 } 581 582 void AMDGPURegisterBankInfo::split64BitValueForMapping( 583 MachineIRBuilder &B, 584 SmallVector<Register, 2> &Regs, 585 LLT HalfTy, 586 Register Reg) const { 587 assert(HalfTy.getSizeInBits() == 32); 588 MachineRegisterInfo *MRI = B.getMRI(); 589 Register LoLHS = MRI->createGenericVirtualRegister(HalfTy); 590 Register HiLHS = MRI->createGenericVirtualRegister(HalfTy); 591 const RegisterBank *Bank = getRegBank(Reg, *MRI, *TRI); 592 MRI->setRegBank(LoLHS, *Bank); 593 MRI->setRegBank(HiLHS, *Bank); 594 595 Regs.push_back(LoLHS); 596 Regs.push_back(HiLHS); 597 598 B.buildInstr(AMDGPU::G_UNMERGE_VALUES) 599 .addDef(LoLHS) 600 .addDef(HiLHS) 601 .addUse(Reg); 602 } 603 604 /// Replace the current type each register in \p Regs has with \p NewTy 605 static void setRegsToType(MachineRegisterInfo &MRI, ArrayRef<Register> Regs, 606 LLT NewTy) { 607 for (Register Reg : Regs) { 608 assert(MRI.getType(Reg).getSizeInBits() == NewTy.getSizeInBits()); 609 MRI.setType(Reg, NewTy); 610 } 611 } 612 613 static LLT getHalfSizedType(LLT Ty) { 614 if (Ty.isVector()) { 615 assert(Ty.getNumElements() % 2 == 0); 616 return LLT::scalarOrVector(Ty.getNumElements() / 2, Ty.getElementType()); 617 } 618 619 assert(Ty.getSizeInBits() % 2 == 0); 620 return LLT::scalar(Ty.getSizeInBits() / 2); 621 } 622 623 /// Legalize instruction \p MI where operands in \p OpIndices must be SGPRs. If 624 /// any of the required SGPR operands are VGPRs, perform a waterfall loop to 625 /// execute the instruction for each unique combination of values in all lanes 626 /// in the wave. The block will be split such that rest of the instructions are 627 /// moved to a new block. 628 /// 629 /// Essentially performs this loop: 630 // 631 /// Save Execution Mask 632 /// For (Lane : Wavefront) { 633 /// Enable Lane, Disable all other lanes 634 /// SGPR = read SGPR value for current lane from VGPR 635 /// VGPRResult[Lane] = use_op SGPR 636 /// } 637 /// Restore Execution Mask 638 /// 639 /// There is additional complexity to try for compare values to identify the 640 /// unique values used. 641 void AMDGPURegisterBankInfo::executeInWaterfallLoop( 642 MachineInstr &MI, MachineRegisterInfo &MRI, 643 ArrayRef<unsigned> OpIndices) const { 644 MachineFunction *MF = MI.getParent()->getParent(); 645 const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>(); 646 const SIInstrInfo *TII = ST.getInstrInfo(); 647 MachineBasicBlock::iterator I(MI); 648 649 MachineBasicBlock &MBB = *MI.getParent(); 650 const DebugLoc &DL = MI.getDebugLoc(); 651 652 // Use a set to avoid extra readfirstlanes in the case where multiple operands 653 // are the same register. 654 SmallSet<Register, 4> SGPROperandRegs; 655 for (unsigned Op : OpIndices) { 656 assert(MI.getOperand(Op).isUse()); 657 Register Reg = MI.getOperand(Op).getReg(); 658 const RegisterBank *OpBank = getRegBank(Reg, MRI, *TRI); 659 if (OpBank->getID() == AMDGPU::VGPRRegBankID) 660 SGPROperandRegs.insert(Reg); 661 } 662 663 // No operands need to be replaced, so no need to loop. 664 if (SGPROperandRegs.empty()) 665 return; 666 667 MachineIRBuilder B(MI); 668 SmallVector<Register, 4> ResultRegs; 669 SmallVector<Register, 4> InitResultRegs; 670 SmallVector<Register, 4> PhiRegs; 671 for (MachineOperand &Def : MI.defs()) { 672 LLT ResTy = MRI.getType(Def.getReg()); 673 const RegisterBank *DefBank = getRegBank(Def.getReg(), MRI, *TRI); 674 ResultRegs.push_back(Def.getReg()); 675 Register InitReg = B.buildUndef(ResTy).getReg(0); 676 Register PhiReg = MRI.createGenericVirtualRegister(ResTy); 677 InitResultRegs.push_back(InitReg); 678 PhiRegs.push_back(PhiReg); 679 MRI.setRegBank(PhiReg, *DefBank); 680 MRI.setRegBank(InitReg, *DefBank); 681 } 682 683 Register SaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 684 Register InitSaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 685 686 // Don't bother using generic instructions/registers for the exec mask. 687 B.buildInstr(TargetOpcode::IMPLICIT_DEF) 688 .addDef(InitSaveExecReg); 689 690 Register PhiExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 691 Register NewExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 692 693 // To insert the loop we need to split the block. Move everything before this 694 // point to a new block, and insert a new empty block before this instruction. 695 MachineBasicBlock *LoopBB = MF->CreateMachineBasicBlock(); 696 MachineBasicBlock *RemainderBB = MF->CreateMachineBasicBlock(); 697 MachineBasicBlock *RestoreExecBB = MF->CreateMachineBasicBlock(); 698 MachineFunction::iterator MBBI(MBB); 699 ++MBBI; 700 MF->insert(MBBI, LoopBB); 701 MF->insert(MBBI, RestoreExecBB); 702 MF->insert(MBBI, RemainderBB); 703 704 LoopBB->addSuccessor(RestoreExecBB); 705 LoopBB->addSuccessor(LoopBB); 706 707 // Move the rest of the block into a new block. 708 RemainderBB->transferSuccessorsAndUpdatePHIs(&MBB); 709 RemainderBB->splice(RemainderBB->begin(), &MBB, I, MBB.end()); 710 711 MBB.addSuccessor(LoopBB); 712 RestoreExecBB->addSuccessor(RemainderBB); 713 714 B.setInsertPt(*LoopBB, LoopBB->end()); 715 716 B.buildInstr(TargetOpcode::PHI) 717 .addDef(PhiExec) 718 .addReg(InitSaveExecReg) 719 .addMBB(&MBB) 720 .addReg(NewExec) 721 .addMBB(LoopBB); 722 723 for (auto Result : zip(InitResultRegs, ResultRegs, PhiRegs)) { 724 B.buildInstr(TargetOpcode::G_PHI) 725 .addDef(std::get<2>(Result)) 726 .addReg(std::get<0>(Result)) // Initial value / implicit_def 727 .addMBB(&MBB) 728 .addReg(std::get<1>(Result)) // Mid-loop value. 729 .addMBB(LoopBB); 730 } 731 732 // Move the instruction into the loop. 733 LoopBB->splice(LoopBB->end(), &MBB, I); 734 I = std::prev(LoopBB->end()); 735 736 B.setInstr(*I); 737 738 Register CondReg; 739 740 for (MachineOperand &Op : MI.uses()) { 741 if (!Op.isReg()) 742 continue; 743 744 assert(!Op.isDef()); 745 if (SGPROperandRegs.count(Op.getReg())) { 746 LLT OpTy = MRI.getType(Op.getReg()); 747 unsigned OpSize = OpTy.getSizeInBits(); 748 749 // Can only do a readlane of 32-bit pieces. 750 if (OpSize == 32) { 751 // Avoid extra copies in the simple case of one 32-bit register. 752 Register CurrentLaneOpReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 753 MRI.setType(CurrentLaneOpReg, OpTy); 754 755 constrainGenericRegister(Op.getReg(), AMDGPU::VGPR_32RegClass, MRI); 756 // Read the next variant <- also loop target. 757 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), CurrentLaneOpReg) 758 .addReg(Op.getReg()); 759 760 Register NewCondReg = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 761 bool First = CondReg == AMDGPU::NoRegister; 762 if (First) 763 CondReg = NewCondReg; 764 765 // Compare the just read M0 value to all possible Idx values. 766 B.buildInstr(AMDGPU::V_CMP_EQ_U32_e64) 767 .addDef(NewCondReg) 768 .addReg(CurrentLaneOpReg) 769 .addReg(Op.getReg()); 770 Op.setReg(CurrentLaneOpReg); 771 772 if (!First) { 773 Register AndReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 774 775 // If there are multiple operands to consider, and the conditions. 776 B.buildInstr(AMDGPU::S_AND_B64) 777 .addDef(AndReg) 778 .addReg(NewCondReg) 779 .addReg(CondReg); 780 CondReg = AndReg; 781 } 782 } else { 783 LLT S32 = LLT::scalar(32); 784 SmallVector<Register, 8> ReadlanePieces; 785 786 // The compares can be done as 64-bit, but the extract needs to be done 787 // in 32-bit pieces. 788 789 bool Is64 = OpSize % 64 == 0; 790 791 LLT UnmergeTy = OpSize % 64 == 0 ? LLT::scalar(64) : LLT::scalar(32); 792 unsigned CmpOp = OpSize % 64 == 0 ? AMDGPU::V_CMP_EQ_U64_e64 793 : AMDGPU::V_CMP_EQ_U32_e64; 794 795 // The compares can be done as 64-bit, but the extract needs to be done 796 // in 32-bit pieces. 797 798 // Insert the unmerge before the loop. 799 800 B.setMBB(MBB); 801 auto Unmerge = B.buildUnmerge(UnmergeTy, Op.getReg()); 802 B.setInstr(*I); 803 804 unsigned NumPieces = Unmerge->getNumOperands() - 1; 805 for (unsigned PieceIdx = 0; PieceIdx != NumPieces; ++PieceIdx) { 806 Register UnmergePiece = Unmerge.getReg(PieceIdx); 807 808 Register CurrentLaneOpReg; 809 if (Is64) { 810 Register CurrentLaneOpRegLo = MRI.createGenericVirtualRegister(S32); 811 Register CurrentLaneOpRegHi = MRI.createGenericVirtualRegister(S32); 812 813 MRI.setRegClass(UnmergePiece, &AMDGPU::VReg_64RegClass); 814 MRI.setRegClass(CurrentLaneOpRegLo, &AMDGPU::SReg_32_XM0RegClass); 815 MRI.setRegClass(CurrentLaneOpRegHi, &AMDGPU::SReg_32_XM0RegClass); 816 817 // Read the next variant <- also loop target. 818 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 819 CurrentLaneOpRegLo) 820 .addReg(UnmergePiece, 0, AMDGPU::sub0); 821 822 // Read the next variant <- also loop target. 823 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 824 CurrentLaneOpRegHi) 825 .addReg(UnmergePiece, 0, AMDGPU::sub1); 826 827 CurrentLaneOpReg = 828 B.buildMerge(LLT::scalar(64), 829 {CurrentLaneOpRegLo, CurrentLaneOpRegHi}) 830 .getReg(0); 831 832 MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_64_XEXECRegClass); 833 834 if (OpTy.getScalarSizeInBits() == 64) { 835 // If we need to produce a 64-bit element vector, so use the 836 // merged pieces 837 ReadlanePieces.push_back(CurrentLaneOpReg); 838 } else { 839 // 32-bit element type. 840 ReadlanePieces.push_back(CurrentLaneOpRegLo); 841 ReadlanePieces.push_back(CurrentLaneOpRegHi); 842 } 843 } else { 844 CurrentLaneOpReg = MRI.createGenericVirtualRegister(LLT::scalar(32)); 845 MRI.setRegClass(UnmergePiece, &AMDGPU::VGPR_32RegClass); 846 MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_32_XM0RegClass); 847 848 // Read the next variant <- also loop target. 849 BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), 850 CurrentLaneOpReg) 851 .addReg(UnmergePiece); 852 ReadlanePieces.push_back(CurrentLaneOpReg); 853 } 854 855 Register NewCondReg 856 = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 857 bool First = CondReg == AMDGPU::NoRegister; 858 if (First) 859 CondReg = NewCondReg; 860 861 B.buildInstr(CmpOp) 862 .addDef(NewCondReg) 863 .addReg(CurrentLaneOpReg) 864 .addReg(UnmergePiece); 865 866 if (!First) { 867 Register AndReg 868 = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); 869 870 // If there are multiple operands to consider, and the conditions. 871 B.buildInstr(AMDGPU::S_AND_B64) 872 .addDef(AndReg) 873 .addReg(NewCondReg) 874 .addReg(CondReg); 875 CondReg = AndReg; 876 } 877 } 878 879 // FIXME: Build merge seems to switch to CONCAT_VECTORS but not 880 // BUILD_VECTOR 881 if (OpTy.isVector()) { 882 auto Merge = B.buildBuildVector(OpTy, ReadlanePieces); 883 Op.setReg(Merge.getReg(0)); 884 } else { 885 auto Merge = B.buildMerge(OpTy, ReadlanePieces); 886 Op.setReg(Merge.getReg(0)); 887 } 888 889 MRI.setRegBank(Op.getReg(), getRegBank(AMDGPU::SGPRRegBankID)); 890 } 891 } 892 } 893 894 B.setInsertPt(*LoopBB, LoopBB->end()); 895 896 // Update EXEC, save the original EXEC value to VCC. 897 B.buildInstr(AMDGPU::S_AND_SAVEEXEC_B64) 898 .addDef(NewExec) 899 .addReg(CondReg, RegState::Kill); 900 901 MRI.setSimpleHint(NewExec, CondReg); 902 903 // Update EXEC, switch all done bits to 0 and all todo bits to 1. 904 B.buildInstr(AMDGPU::S_XOR_B64_term) 905 .addDef(AMDGPU::EXEC) 906 .addReg(AMDGPU::EXEC) 907 .addReg(NewExec); 908 909 // XXX - s_xor_b64 sets scc to 1 if the result is nonzero, so can we use 910 // s_cbranch_scc0? 911 912 // Loop back to V_READFIRSTLANE_B32 if there are still variants to cover. 913 B.buildInstr(AMDGPU::S_CBRANCH_EXECNZ) 914 .addMBB(LoopBB); 915 916 // Save the EXEC mask before the loop. 917 BuildMI(MBB, MBB.end(), DL, TII->get(AMDGPU::S_MOV_B64_term), SaveExecReg) 918 .addReg(AMDGPU::EXEC); 919 920 // Restore the EXEC mask after the loop. 921 B.setMBB(*RestoreExecBB); 922 B.buildInstr(AMDGPU::S_MOV_B64_term) 923 .addDef(AMDGPU::EXEC) 924 .addReg(SaveExecReg); 925 } 926 927 // Legalize an operand that must be an SGPR by inserting a readfirstlane. 928 void AMDGPURegisterBankInfo::constrainOpWithReadfirstlane( 929 MachineInstr &MI, MachineRegisterInfo &MRI, unsigned OpIdx) const { 930 Register Reg = MI.getOperand(OpIdx).getReg(); 931 const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI); 932 if (Bank != &AMDGPU::VGPRRegBank) 933 return; 934 935 MachineIRBuilder B(MI); 936 Register SGPR = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 937 B.buildInstr(AMDGPU::V_READFIRSTLANE_B32) 938 .addDef(SGPR) 939 .addReg(Reg); 940 941 const TargetRegisterClass *Constrained = 942 constrainGenericRegister(Reg, AMDGPU::VGPR_32RegClass, MRI); 943 (void)Constrained; 944 assert(Constrained && "Failed to constrain readfirstlane src reg"); 945 946 MI.getOperand(OpIdx).setReg(SGPR); 947 } 948 949 // When regbankselect repairs registers, it will insert a repair instruction 950 // which defines the repaired register. Then it calls applyMapping and expects 951 // that the targets will either delete or rewrite the originally wrote to the 952 // repaired registers. Beccause of this, we end up in a situation where 953 // we have 2 instructions defining the same registers. 954 static MachineInstr *getOtherVRegDef(const MachineRegisterInfo &MRI, 955 Register Reg, 956 const MachineInstr &MI) { 957 // Is there some way we can assert that there are exactly 2 def instructions? 958 for (MachineInstr &Other : MRI.def_instructions(Reg)) { 959 if (&Other != &MI) 960 return &Other; 961 } 962 963 return nullptr; 964 } 965 966 bool AMDGPURegisterBankInfo::applyMappingWideLoad(MachineInstr &MI, 967 const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper, 968 MachineRegisterInfo &MRI) const { 969 Register DstReg = MI.getOperand(0).getReg(); 970 const LLT LoadTy = MRI.getType(DstReg); 971 unsigned LoadSize = LoadTy.getSizeInBits(); 972 const unsigned MaxNonSmrdLoadSize = 128; 973 // 128-bit loads are supported for all instruction types. 974 if (LoadSize <= MaxNonSmrdLoadSize) 975 return false; 976 977 SmallVector<unsigned, 16> DefRegs(OpdMapper.getVRegs(0)); 978 SmallVector<unsigned, 1> SrcRegs(OpdMapper.getVRegs(1)); 979 980 // If the pointer is an SGPR, we have nothing to do. 981 if (SrcRegs.empty()) 982 return false; 983 984 assert(LoadSize % MaxNonSmrdLoadSize == 0); 985 986 // We want to get the repair instruction now, because it will help us 987 // determine which instruction the legalizer inserts that will also 988 // write to DstReg. 989 MachineInstr *RepairInst = getOtherVRegDef(MRI, DstReg, MI); 990 991 // RegBankSelect only emits scalar types, so we need to reset the pointer 992 // operand to a pointer type. 993 Register BasePtrReg = SrcRegs[0]; 994 LLT PtrTy = MRI.getType(MI.getOperand(1).getReg()); 995 MRI.setType(BasePtrReg, PtrTy); 996 997 MachineIRBuilder B(MI); 998 999 unsigned SplitElts = 1000 MaxNonSmrdLoadSize / LoadTy.getScalarType().getSizeInBits(); 1001 const LLT LoadSplitTy = LLT::vector(SplitElts, LoadTy.getScalarType()); 1002 ApplyRegBankMapping O(MRI, &AMDGPU::VGPRRegBank); 1003 GISelObserverWrapper Observer(&O); 1004 B.setChangeObserver(Observer); 1005 LegalizerHelper Helper(B.getMF(), Observer, B); 1006 if (Helper.fewerElementsVector(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized) 1007 return false; 1008 1009 // At this point, the legalizer has split the original load into smaller 1010 // loads. At the end of lowering, it inserts an instruction (LegalizedInst) 1011 // that combines the outputs of the lower loads and writes it to DstReg. 1012 // The register bank selector has also added the RepairInst which writes to 1013 // DstReg as well. 1014 1015 MachineInstr *LegalizedInst = getOtherVRegDef(MRI, DstReg, *RepairInst); 1016 1017 // Replace the output of the LegalizedInst with a temporary register, since 1018 // RepairInst already defines DstReg. 1019 Register TmpReg = MRI.createGenericVirtualRegister(MRI.getType(DstReg)); 1020 LegalizedInst->getOperand(0).setReg(TmpReg); 1021 B.setInsertPt(*RepairInst->getParent(), RepairInst); 1022 1023 for (unsigned DefIdx = 0, e = DefRegs.size(); DefIdx != e; ++DefIdx) { 1024 Register IdxReg = MRI.createGenericVirtualRegister(LLT::scalar(32)); 1025 B.buildConstant(IdxReg, DefIdx); 1026 MRI.setRegBank(IdxReg, getRegBank(AMDGPU::VGPRRegBankID)); 1027 B.buildExtractVectorElement(DefRegs[DefIdx], TmpReg, IdxReg); 1028 } 1029 1030 MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID)); 1031 return true; 1032 } 1033 1034 // For cases where only a single copy is inserted for matching register banks. 1035 // Replace the register in the instruction operand 1036 static void substituteSimpleCopyRegs( 1037 const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper, unsigned OpIdx) { 1038 SmallVector<unsigned, 1> SrcReg(OpdMapper.getVRegs(OpIdx)); 1039 if (!SrcReg.empty()) { 1040 assert(SrcReg.size() == 1); 1041 OpdMapper.getMI().getOperand(OpIdx).setReg(SrcReg[0]); 1042 } 1043 } 1044 1045 void AMDGPURegisterBankInfo::applyMappingImpl( 1046 const OperandsMapper &OpdMapper) const { 1047 MachineInstr &MI = OpdMapper.getMI(); 1048 unsigned Opc = MI.getOpcode(); 1049 MachineRegisterInfo &MRI = OpdMapper.getMRI(); 1050 switch (Opc) { 1051 case AMDGPU::G_SELECT: { 1052 Register DstReg = MI.getOperand(0).getReg(); 1053 LLT DstTy = MRI.getType(DstReg); 1054 if (DstTy.getSizeInBits() != 64) 1055 break; 1056 1057 LLT HalfTy = getHalfSizedType(DstTy); 1058 1059 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 1060 SmallVector<Register, 1> Src0Regs(OpdMapper.getVRegs(1)); 1061 SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2)); 1062 SmallVector<Register, 2> Src2Regs(OpdMapper.getVRegs(3)); 1063 1064 // All inputs are SGPRs, nothing special to do. 1065 if (DefRegs.empty()) { 1066 assert(Src1Regs.empty() && Src2Regs.empty()); 1067 break; 1068 } 1069 1070 MachineIRBuilder B(MI); 1071 if (Src0Regs.empty()) 1072 Src0Regs.push_back(MI.getOperand(1).getReg()); 1073 else { 1074 assert(Src0Regs.size() == 1); 1075 } 1076 1077 if (Src1Regs.empty()) 1078 split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg()); 1079 else { 1080 setRegsToType(MRI, Src1Regs, HalfTy); 1081 } 1082 1083 if (Src2Regs.empty()) 1084 split64BitValueForMapping(B, Src2Regs, HalfTy, MI.getOperand(3).getReg()); 1085 else 1086 setRegsToType(MRI, Src2Regs, HalfTy); 1087 1088 setRegsToType(MRI, DefRegs, HalfTy); 1089 1090 B.buildSelect(DefRegs[0], Src0Regs[0], Src1Regs[0], Src2Regs[0]); 1091 B.buildSelect(DefRegs[1], Src0Regs[0], Src1Regs[1], Src2Regs[1]); 1092 1093 MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID)); 1094 MI.eraseFromParent(); 1095 return; 1096 } 1097 case AMDGPU::G_AND: 1098 case AMDGPU::G_OR: 1099 case AMDGPU::G_XOR: { 1100 // 64-bit and is only available on the SALU, so split into 2 32-bit ops if 1101 // there is a VGPR input. 1102 Register DstReg = MI.getOperand(0).getReg(); 1103 LLT DstTy = MRI.getType(DstReg); 1104 if (DstTy.getSizeInBits() != 64) 1105 break; 1106 1107 LLT HalfTy = getHalfSizedType(DstTy); 1108 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 1109 SmallVector<Register, 2> Src0Regs(OpdMapper.getVRegs(1)); 1110 SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2)); 1111 1112 // All inputs are SGPRs, nothing special to do. 1113 if (DefRegs.empty()) { 1114 assert(Src0Regs.empty() && Src1Regs.empty()); 1115 break; 1116 } 1117 1118 assert(DefRegs.size() == 2); 1119 assert(Src0Regs.size() == Src1Regs.size() && 1120 (Src0Regs.empty() || Src0Regs.size() == 2)); 1121 1122 // Depending on where the source registers came from, the generic code may 1123 // have decided to split the inputs already or not. If not, we still need to 1124 // extract the values. 1125 MachineIRBuilder B(MI); 1126 1127 if (Src0Regs.empty()) 1128 split64BitValueForMapping(B, Src0Regs, HalfTy, MI.getOperand(1).getReg()); 1129 else 1130 setRegsToType(MRI, Src0Regs, HalfTy); 1131 1132 if (Src1Regs.empty()) 1133 split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg()); 1134 else 1135 setRegsToType(MRI, Src1Regs, HalfTy); 1136 1137 setRegsToType(MRI, DefRegs, HalfTy); 1138 1139 B.buildInstr(Opc) 1140 .addDef(DefRegs[0]) 1141 .addUse(Src0Regs[0]) 1142 .addUse(Src1Regs[0]); 1143 1144 B.buildInstr(Opc) 1145 .addDef(DefRegs[1]) 1146 .addUse(Src0Regs[1]) 1147 .addUse(Src1Regs[1]); 1148 1149 MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID)); 1150 MI.eraseFromParent(); 1151 return; 1152 } 1153 case AMDGPU::G_ADD: 1154 case AMDGPU::G_SUB: 1155 case AMDGPU::G_MUL: { 1156 Register DstReg = MI.getOperand(0).getReg(); 1157 LLT DstTy = MRI.getType(DstReg); 1158 if (DstTy != LLT::scalar(16)) 1159 break; 1160 1161 const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI); 1162 if (DstBank == &AMDGPU::VGPRRegBank) 1163 break; 1164 1165 // 16-bit operations are VALU only, but can be promoted to 32-bit SALU. 1166 MachineFunction *MF = MI.getParent()->getParent(); 1167 MachineIRBuilder B(MI); 1168 ApplyRegBankMapping ApplySALU(MRI, &AMDGPU::SGPRRegBank); 1169 GISelObserverWrapper Observer(&ApplySALU); 1170 LegalizerHelper Helper(*MF, Observer, B); 1171 1172 if (Helper.widenScalar(MI, 0, LLT::scalar(32)) != 1173 LegalizerHelper::Legalized) 1174 llvm_unreachable("widen scalar should have succeeded"); 1175 return; 1176 } 1177 case AMDGPU::G_SMIN: 1178 case AMDGPU::G_SMAX: 1179 case AMDGPU::G_UMIN: 1180 case AMDGPU::G_UMAX: { 1181 Register DstReg = MI.getOperand(0).getReg(); 1182 const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI); 1183 if (DstBank == &AMDGPU::VGPRRegBank) 1184 break; 1185 1186 MachineFunction *MF = MI.getParent()->getParent(); 1187 MachineIRBuilder B(MI); 1188 ApplyRegBankMapping ApplySALU(MRI, &AMDGPU::SGPRRegBank); 1189 GISelObserverWrapper Observer(&ApplySALU); 1190 LegalizerHelper Helper(*MF, Observer, B); 1191 1192 // Turn scalar min/max into a compare and select. 1193 LLT Ty = MRI.getType(DstReg); 1194 LLT S32 = LLT::scalar(32); 1195 LLT S16 = LLT::scalar(16); 1196 1197 if (Ty == S16) { 1198 // Need to widen to s32, and expand as cmp + select. 1199 if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized) 1200 llvm_unreachable("widenScalar should have succeeded"); 1201 1202 // FIXME: This is relying on widenScalar leaving MI in place. 1203 if (Helper.lower(MI, 0, S32) != LegalizerHelper::Legalized) 1204 llvm_unreachable("lower should have succeeded"); 1205 } else { 1206 if (Helper.lower(MI, 0, Ty) != LegalizerHelper::Legalized) 1207 llvm_unreachable("lower should have succeeded"); 1208 } 1209 1210 return; 1211 } 1212 case AMDGPU::G_SEXT: 1213 case AMDGPU::G_ZEXT: { 1214 Register SrcReg = MI.getOperand(1).getReg(); 1215 LLT SrcTy = MRI.getType(SrcReg); 1216 bool Signed = Opc == AMDGPU::G_SEXT; 1217 1218 MachineIRBuilder B(MI); 1219 const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI); 1220 1221 Register DstReg = MI.getOperand(0).getReg(); 1222 LLT DstTy = MRI.getType(DstReg); 1223 if (DstTy.isScalar() && 1224 SrcBank != &AMDGPU::SGPRRegBank && 1225 SrcBank != &AMDGPU::SCCRegBank && 1226 SrcBank != &AMDGPU::VCCRegBank && 1227 // FIXME: Should handle any type that round to s64 when irregular 1228 // breakdowns supported. 1229 DstTy.getSizeInBits() == 64 && 1230 SrcTy.getSizeInBits() <= 32) { 1231 const LLT S32 = LLT::scalar(32); 1232 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 1233 1234 // Extend to 32-bit, and then extend the low half. 1235 if (Signed) { 1236 // TODO: Should really be buildSExtOrCopy 1237 B.buildSExtOrTrunc(DefRegs[0], SrcReg); 1238 1239 // Replicate sign bit from 32-bit extended part. 1240 auto ShiftAmt = B.buildConstant(S32, 31); 1241 MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank); 1242 B.buildAShr(DefRegs[1], DefRegs[0], ShiftAmt); 1243 } else { 1244 B.buildZExtOrTrunc(DefRegs[0], SrcReg); 1245 B.buildConstant(DefRegs[1], 0); 1246 } 1247 1248 MRI.setRegBank(DstReg, *SrcBank); 1249 MI.eraseFromParent(); 1250 return; 1251 } 1252 1253 if (SrcTy != LLT::scalar(1)) 1254 return; 1255 1256 if (SrcBank == &AMDGPU::SCCRegBank || SrcBank == &AMDGPU::VCCRegBank) { 1257 SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0)); 1258 1259 const RegisterBank *DstBank = SrcBank == &AMDGPU::SCCRegBank ? 1260 &AMDGPU::SGPRRegBank : &AMDGPU::VGPRRegBank; 1261 1262 unsigned DstSize = DstTy.getSizeInBits(); 1263 // 64-bit select is SGPR only 1264 const bool UseSel64 = DstSize > 32 && 1265 SrcBank->getID() == AMDGPU::SCCRegBankID; 1266 1267 // TODO: Should s16 select be legal? 1268 LLT SelType = UseSel64 ? LLT::scalar(64) : LLT::scalar(32); 1269 auto True = B.buildConstant(SelType, Signed ? -1 : 1); 1270 auto False = B.buildConstant(SelType, 0); 1271 1272 MRI.setRegBank(True.getReg(0), *DstBank); 1273 MRI.setRegBank(False.getReg(0), *DstBank); 1274 MRI.setRegBank(DstReg, *DstBank); 1275 1276 if (DstSize > 32 && SrcBank->getID() != AMDGPU::SCCRegBankID) { 1277 B.buildSelect(DefRegs[0], SrcReg, True, False); 1278 B.buildCopy(DefRegs[1], DefRegs[0]); 1279 } else if (DstSize < 32) { 1280 auto Sel = B.buildSelect(SelType, SrcReg, True, False); 1281 MRI.setRegBank(Sel.getReg(0), *DstBank); 1282 B.buildTrunc(DstReg, Sel); 1283 } else { 1284 B.buildSelect(DstReg, SrcReg, True, False); 1285 } 1286 1287 MI.eraseFromParent(); 1288 return; 1289 } 1290 1291 // Fixup the case with an s1 src that isn't a condition register. Use shifts 1292 // instead of introducing a compare to avoid an unnecessary condition 1293 // register (and since there's no scalar 16-bit compares). 1294 auto Ext = B.buildAnyExt(DstTy, SrcReg); 1295 auto ShiftAmt = B.buildConstant(LLT::scalar(32), DstTy.getSizeInBits() - 1); 1296 auto Shl = B.buildShl(DstTy, Ext, ShiftAmt); 1297 1298 if (MI.getOpcode() == AMDGPU::G_SEXT) 1299 B.buildAShr(DstReg, Shl, ShiftAmt); 1300 else 1301 B.buildLShr(DstReg, Shl, ShiftAmt); 1302 1303 MRI.setRegBank(DstReg, *SrcBank); 1304 MRI.setRegBank(Ext.getReg(0), *SrcBank); 1305 MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank); 1306 MRI.setRegBank(Shl.getReg(0), *SrcBank); 1307 MI.eraseFromParent(); 1308 return; 1309 } 1310 case AMDGPU::G_BUILD_VECTOR: 1311 case AMDGPU::G_BUILD_VECTOR_TRUNC: { 1312 Register DstReg = MI.getOperand(0).getReg(); 1313 LLT DstTy = MRI.getType(DstReg); 1314 if (DstTy != LLT::vector(2, 16)) 1315 break; 1316 1317 assert(MI.getNumOperands() == 3 && empty(OpdMapper.getVRegs(0))); 1318 substituteSimpleCopyRegs(OpdMapper, 1); 1319 substituteSimpleCopyRegs(OpdMapper, 2); 1320 1321 const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI); 1322 if (DstBank == &AMDGPU::SGPRRegBank) 1323 break; // Can use S_PACK_* instructions. 1324 1325 MachineIRBuilder B(MI); 1326 1327 Register Lo = MI.getOperand(1).getReg(); 1328 Register Hi = MI.getOperand(2).getReg(); 1329 const LLT S32 = LLT::scalar(32); 1330 1331 const RegisterBank *BankLo = getRegBank(Lo, MRI, *TRI); 1332 const RegisterBank *BankHi = getRegBank(Hi, MRI, *TRI); 1333 1334 Register ZextLo; 1335 Register ShiftHi; 1336 1337 if (Opc == AMDGPU::G_BUILD_VECTOR) { 1338 ZextLo = B.buildZExt(S32, Lo).getReg(0); 1339 MRI.setRegBank(ZextLo, *BankLo); 1340 1341 Register ZextHi = B.buildZExt(S32, Hi).getReg(0); 1342 MRI.setRegBank(ZextHi, *BankHi); 1343 1344 auto ShiftAmt = B.buildConstant(S32, 16); 1345 MRI.setRegBank(ShiftAmt.getReg(0), *BankHi); 1346 1347 ShiftHi = B.buildShl(S32, ZextHi, ShiftAmt).getReg(0); 1348 MRI.setRegBank(ShiftHi, *BankHi); 1349 } else { 1350 Register MaskLo = B.buildConstant(S32, 0xffff).getReg(0); 1351 MRI.setRegBank(MaskLo, *BankLo); 1352 1353 auto ShiftAmt = B.buildConstant(S32, 16); 1354 MRI.setRegBank(ShiftAmt.getReg(0), *BankHi); 1355 1356 ShiftHi = B.buildShl(S32, Hi, ShiftAmt).getReg(0); 1357 MRI.setRegBank(ShiftHi, *BankHi); 1358 1359 ZextLo = B.buildAnd(S32, Lo, MaskLo).getReg(0); 1360 MRI.setRegBank(ZextLo, *BankLo); 1361 } 1362 1363 auto Or = B.buildOr(S32, ZextLo, ShiftHi); 1364 MRI.setRegBank(Or.getReg(0), *DstBank); 1365 1366 B.buildBitcast(DstReg, Or); 1367 MI.eraseFromParent(); 1368 return; 1369 } 1370 case AMDGPU::G_EXTRACT_VECTOR_ELT: 1371 applyDefaultMapping(OpdMapper); 1372 executeInWaterfallLoop(MI, MRI, { 2 }); 1373 return; 1374 case AMDGPU::G_INTRINSIC: { 1375 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 1376 case Intrinsic::amdgcn_s_buffer_load: { 1377 // FIXME: Move to G_INTRINSIC_W_SIDE_EFFECTS 1378 executeInWaterfallLoop(MI, MRI, { 2, 3 }); 1379 return; 1380 } 1381 case Intrinsic::amdgcn_readlane: { 1382 substituteSimpleCopyRegs(OpdMapper, 2); 1383 1384 assert(empty(OpdMapper.getVRegs(0))); 1385 assert(empty(OpdMapper.getVRegs(3))); 1386 1387 // Make sure the index is an SGPR. It doesn't make sense to run this in a 1388 // waterfall loop, so assume it's a uniform value. 1389 constrainOpWithReadfirstlane(MI, MRI, 3); // Index 1390 return; 1391 } 1392 case Intrinsic::amdgcn_writelane: { 1393 assert(empty(OpdMapper.getVRegs(0))); 1394 assert(empty(OpdMapper.getVRegs(2))); 1395 assert(empty(OpdMapper.getVRegs(3))); 1396 1397 substituteSimpleCopyRegs(OpdMapper, 4); // VGPR input val 1398 constrainOpWithReadfirstlane(MI, MRI, 2); // Source value 1399 constrainOpWithReadfirstlane(MI, MRI, 3); // Index 1400 return; 1401 } 1402 default: 1403 break; 1404 } 1405 break; 1406 } 1407 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: { 1408 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 1409 case Intrinsic::amdgcn_buffer_load: { 1410 executeInWaterfallLoop(MI, MRI, { 2 }); 1411 return; 1412 } 1413 case Intrinsic::amdgcn_ds_ordered_add: 1414 case Intrinsic::amdgcn_ds_ordered_swap: { 1415 // This is only allowed to execute with 1 lane, so readfirstlane is safe. 1416 assert(empty(OpdMapper.getVRegs(0))); 1417 substituteSimpleCopyRegs(OpdMapper, 3); 1418 constrainOpWithReadfirstlane(MI, MRI, 2); // M0 1419 return; 1420 } 1421 case Intrinsic::amdgcn_s_sendmsg: 1422 case Intrinsic::amdgcn_s_sendmsghalt: { 1423 // FIXME: Should this use a waterfall loop? 1424 constrainOpWithReadfirstlane(MI, MRI, 2); // M0 1425 return; 1426 } 1427 default: 1428 break; 1429 } 1430 break; 1431 } 1432 case AMDGPU::G_LOAD: 1433 case AMDGPU::G_ZEXTLOAD: 1434 case AMDGPU::G_SEXTLOAD: { 1435 if (applyMappingWideLoad(MI, OpdMapper, MRI)) 1436 return; 1437 break; 1438 } 1439 default: 1440 break; 1441 } 1442 1443 return applyDefaultMapping(OpdMapper); 1444 } 1445 1446 bool AMDGPURegisterBankInfo::isSALUMapping(const MachineInstr &MI) const { 1447 const MachineFunction &MF = *MI.getParent()->getParent(); 1448 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1449 for (unsigned i = 0, e = MI.getNumOperands();i != e; ++i) { 1450 if (!MI.getOperand(i).isReg()) 1451 continue; 1452 Register Reg = MI.getOperand(i).getReg(); 1453 if (const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI)) { 1454 if (Bank->getID() == AMDGPU::VGPRRegBankID) 1455 return false; 1456 1457 assert(Bank->getID() == AMDGPU::SGPRRegBankID || 1458 Bank->getID() == AMDGPU::SCCRegBankID); 1459 } 1460 } 1461 return true; 1462 } 1463 1464 const RegisterBankInfo::InstructionMapping & 1465 AMDGPURegisterBankInfo::getDefaultMappingSOP(const MachineInstr &MI) const { 1466 const MachineFunction &MF = *MI.getParent()->getParent(); 1467 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1468 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1469 1470 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 1471 unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); 1472 unsigned BankID = Size == 1 ? AMDGPU::SCCRegBankID : AMDGPU::SGPRRegBankID; 1473 OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size); 1474 } 1475 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 1476 MI.getNumOperands()); 1477 } 1478 1479 const RegisterBankInfo::InstructionMapping & 1480 AMDGPURegisterBankInfo::getDefaultMappingVOP(const MachineInstr &MI) const { 1481 const MachineFunction &MF = *MI.getParent()->getParent(); 1482 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1483 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1484 unsigned OpdIdx = 0; 1485 1486 unsigned Size0 = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1487 OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0); 1488 1489 if (MI.getOperand(OpdIdx).isIntrinsicID()) 1490 OpdsMapping[OpdIdx++] = nullptr; 1491 1492 Register Reg1 = MI.getOperand(OpdIdx).getReg(); 1493 unsigned Size1 = getSizeInBits(Reg1, MRI, *TRI); 1494 1495 unsigned DefaultBankID = Size1 == 1 ? 1496 AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID; 1497 unsigned Bank1 = getRegBankID(Reg1, MRI, *TRI, DefaultBankID); 1498 1499 OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(Bank1, Size1); 1500 1501 for (unsigned e = MI.getNumOperands(); OpdIdx != e; ++OpdIdx) { 1502 const MachineOperand &MO = MI.getOperand(OpdIdx); 1503 if (!MO.isReg()) 1504 continue; 1505 1506 unsigned Size = getSizeInBits(MO.getReg(), MRI, *TRI); 1507 unsigned BankID = Size == 1 ? AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID; 1508 OpdsMapping[OpdIdx] = AMDGPU::getValueMapping(BankID, Size); 1509 } 1510 1511 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 1512 MI.getNumOperands()); 1513 } 1514 1515 const RegisterBankInfo::InstructionMapping & 1516 AMDGPURegisterBankInfo::getDefaultMappingAllVGPR(const MachineInstr &MI) const { 1517 const MachineFunction &MF = *MI.getParent()->getParent(); 1518 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1519 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1520 1521 for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) { 1522 const MachineOperand &Op = MI.getOperand(I); 1523 if (!Op.isReg()) 1524 continue; 1525 1526 unsigned Size = getSizeInBits(Op.getReg(), MRI, *TRI); 1527 OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1528 } 1529 1530 return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), 1531 MI.getNumOperands()); 1532 } 1533 1534 const RegisterBankInfo::InstructionMapping & 1535 AMDGPURegisterBankInfo::getInstrMappingForLoad(const MachineInstr &MI) const { 1536 1537 const MachineFunction &MF = *MI.getParent()->getParent(); 1538 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1539 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1540 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1541 LLT LoadTy = MRI.getType(MI.getOperand(0).getReg()); 1542 Register PtrReg = MI.getOperand(1).getReg(); 1543 LLT PtrTy = MRI.getType(PtrReg); 1544 unsigned AS = PtrTy.getAddressSpace(); 1545 unsigned PtrSize = PtrTy.getSizeInBits(); 1546 1547 const ValueMapping *ValMapping; 1548 const ValueMapping *PtrMapping; 1549 1550 if (isInstrUniformNonExtLoadAlign4(MI) && 1551 (AS != AMDGPUAS::LOCAL_ADDRESS && AS != AMDGPUAS::REGION_ADDRESS)) { 1552 // We have a uniform instruction so we want to use an SMRD load 1553 ValMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1554 PtrMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize); 1555 } else { 1556 ValMapping = AMDGPU::getValueMappingLoadSGPROnly(AMDGPU::VGPRRegBankID, LoadTy); 1557 PtrMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize); 1558 } 1559 1560 OpdsMapping[0] = ValMapping; 1561 OpdsMapping[1] = PtrMapping; 1562 const RegisterBankInfo::InstructionMapping &Mapping = getInstructionMapping( 1563 1, 1, getOperandsMapping(OpdsMapping), MI.getNumOperands()); 1564 return Mapping; 1565 1566 // FIXME: Do we want to add a mapping for FLAT load, or should we just 1567 // handle that during instruction selection? 1568 } 1569 1570 unsigned 1571 AMDGPURegisterBankInfo::getRegBankID(Register Reg, 1572 const MachineRegisterInfo &MRI, 1573 const TargetRegisterInfo &TRI, 1574 unsigned Default) const { 1575 1576 const RegisterBank *Bank = getRegBank(Reg, MRI, TRI); 1577 return Bank ? Bank->getID() : Default; 1578 } 1579 1580 static unsigned regBankUnion(unsigned RB0, unsigned RB1) { 1581 return (RB0 == AMDGPU::SGPRRegBankID && RB1 == AMDGPU::SGPRRegBankID) ? 1582 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1583 } 1584 1585 /// 1586 /// This function must return a legal mapping, because 1587 /// AMDGPURegisterBankInfo::getInstrAlternativeMappings() is not called 1588 /// in RegBankSelect::Mode::Fast. Any mapping that would cause a 1589 /// VGPR to SGPR generated is illegal. 1590 /// 1591 const RegisterBankInfo::InstructionMapping & 1592 AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { 1593 const MachineFunction &MF = *MI.getParent()->getParent(); 1594 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1595 1596 if (MI.isRegSequence()) { 1597 // If any input is a VGPR, the result must be a VGPR. The default handling 1598 // assumes any copy between banks is legal. 1599 unsigned BankID = AMDGPU::SGPRRegBankID; 1600 1601 for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) { 1602 auto OpBank = getRegBankID(MI.getOperand(I).getReg(), MRI, *TRI); 1603 // It doesn't make sense to use vcc or scc banks here, so just ignore 1604 // them. 1605 if (OpBank != AMDGPU::SGPRRegBankID) { 1606 BankID = AMDGPU::VGPRRegBankID; 1607 break; 1608 } 1609 } 1610 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1611 1612 const ValueMapping &ValMap = getValueMapping(0, Size, getRegBank(BankID)); 1613 return getInstructionMapping( 1614 1, /*Cost*/ 1, 1615 /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1); 1616 } 1617 1618 // The default handling is broken and doesn't handle illegal SGPR->VGPR copies 1619 // properly. 1620 // 1621 // TODO: There are additional exec masking dependencies to analyze. 1622 if (MI.getOpcode() == TargetOpcode::G_PHI) { 1623 // TODO: Generate proper invalid bank enum. 1624 int ResultBank = -1; 1625 1626 for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) { 1627 Register Reg = MI.getOperand(I).getReg(); 1628 const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI); 1629 1630 // FIXME: Assuming VGPR for any undetermined inputs. 1631 if (!Bank || Bank->getID() == AMDGPU::VGPRRegBankID) { 1632 ResultBank = AMDGPU::VGPRRegBankID; 1633 break; 1634 } 1635 1636 unsigned OpBank = Bank->getID(); 1637 // scc, scc -> sgpr 1638 if (OpBank == AMDGPU::SCCRegBankID) { 1639 // There's only one SCC register, so a phi requires copying to SGPR. 1640 OpBank = AMDGPU::SGPRRegBankID; 1641 } else if (OpBank == AMDGPU::VCCRegBankID) { 1642 // vcc, vcc -> vcc 1643 // vcc, sgpr -> vgpr 1644 if (ResultBank != -1 && ResultBank != AMDGPU::VCCRegBankID) { 1645 ResultBank = AMDGPU::VGPRRegBankID; 1646 break; 1647 } 1648 } 1649 1650 ResultBank = OpBank; 1651 } 1652 1653 assert(ResultBank != -1); 1654 1655 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1656 1657 const ValueMapping &ValMap = 1658 getValueMapping(0, Size, getRegBank(ResultBank)); 1659 return getInstructionMapping( 1660 1, /*Cost*/ 1, 1661 /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1); 1662 } 1663 1664 const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI); 1665 if (Mapping.isValid()) 1666 return Mapping; 1667 1668 SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands()); 1669 1670 switch (MI.getOpcode()) { 1671 default: 1672 return getInvalidInstructionMapping(); 1673 1674 case AMDGPU::G_AND: 1675 case AMDGPU::G_OR: 1676 case AMDGPU::G_XOR: { 1677 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1678 if (Size == 1) { 1679 const RegisterBank *DstBank 1680 = getRegBank(MI.getOperand(0).getReg(), MRI, *TRI); 1681 1682 unsigned TargetBankID = -1; 1683 unsigned BankLHS = -1; 1684 unsigned BankRHS = -1; 1685 if (DstBank) { 1686 TargetBankID = DstBank->getID(); 1687 if (DstBank == &AMDGPU::VCCRegBank) { 1688 TargetBankID = AMDGPU::VCCRegBankID; 1689 BankLHS = AMDGPU::VCCRegBankID; 1690 BankRHS = AMDGPU::VCCRegBankID; 1691 } else if (DstBank == &AMDGPU::SCCRegBank) { 1692 TargetBankID = AMDGPU::SCCRegBankID; 1693 BankLHS = AMDGPU::SGPRRegBankID; 1694 BankRHS = AMDGPU::SGPRRegBankID; 1695 } else { 1696 BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI, 1697 AMDGPU::SGPRRegBankID); 1698 BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI, 1699 AMDGPU::SGPRRegBankID); 1700 } 1701 } else { 1702 BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI, 1703 AMDGPU::VCCRegBankID); 1704 BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI, 1705 AMDGPU::VCCRegBankID); 1706 1707 // Both inputs should be true booleans to produce a boolean result. 1708 if (BankLHS == AMDGPU::VGPRRegBankID || BankRHS == AMDGPU::VGPRRegBankID) { 1709 TargetBankID = AMDGPU::VGPRRegBankID; 1710 } else if (BankLHS == AMDGPU::VCCRegBankID || BankRHS == AMDGPU::VCCRegBankID) { 1711 TargetBankID = AMDGPU::VCCRegBankID; 1712 BankLHS = AMDGPU::VCCRegBankID; 1713 BankRHS = AMDGPU::VCCRegBankID; 1714 } else if (BankLHS == AMDGPU::SGPRRegBankID && BankRHS == AMDGPU::SGPRRegBankID) { 1715 TargetBankID = AMDGPU::SGPRRegBankID; 1716 } else if (BankLHS == AMDGPU::SCCRegBankID || BankRHS == AMDGPU::SCCRegBankID) { 1717 // The operation must be done on a 32-bit register, but it will set 1718 // scc. The result type could interchangably be SCC or SGPR, since 1719 // both values will be produced. 1720 TargetBankID = AMDGPU::SCCRegBankID; 1721 BankLHS = AMDGPU::SGPRRegBankID; 1722 BankRHS = AMDGPU::SGPRRegBankID; 1723 } 1724 } 1725 1726 OpdsMapping[0] = AMDGPU::getValueMapping(TargetBankID, Size); 1727 OpdsMapping[1] = AMDGPU::getValueMapping(BankLHS, Size); 1728 OpdsMapping[2] = AMDGPU::getValueMapping(BankRHS, Size); 1729 break; 1730 } 1731 1732 if (Size == 64) { 1733 1734 if (isSALUMapping(MI)) { 1735 OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size); 1736 OpdsMapping[1] = OpdsMapping[2] = OpdsMapping[0]; 1737 } else { 1738 OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size); 1739 unsigned Bank1 = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI/*, DefaultBankID*/); 1740 OpdsMapping[1] = AMDGPU::getValueMapping(Bank1, Size); 1741 1742 unsigned Bank2 = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI/*, DefaultBankID*/); 1743 OpdsMapping[2] = AMDGPU::getValueMapping(Bank2, Size); 1744 } 1745 1746 break; 1747 } 1748 1749 LLVM_FALLTHROUGH; 1750 } 1751 1752 case AMDGPU::G_GEP: 1753 case AMDGPU::G_ADD: 1754 case AMDGPU::G_SUB: 1755 case AMDGPU::G_MUL: 1756 case AMDGPU::G_SHL: 1757 case AMDGPU::G_LSHR: 1758 case AMDGPU::G_ASHR: 1759 case AMDGPU::G_UADDO: 1760 case AMDGPU::G_SADDO: 1761 case AMDGPU::G_USUBO: 1762 case AMDGPU::G_SSUBO: 1763 case AMDGPU::G_UADDE: 1764 case AMDGPU::G_SADDE: 1765 case AMDGPU::G_USUBE: 1766 case AMDGPU::G_SSUBE: 1767 case AMDGPU::G_UMULH: 1768 case AMDGPU::G_SMULH: 1769 case AMDGPU::G_SMIN: 1770 case AMDGPU::G_SMAX: 1771 case AMDGPU::G_UMIN: 1772 case AMDGPU::G_UMAX: 1773 if (isSALUMapping(MI)) 1774 return getDefaultMappingSOP(MI); 1775 LLVM_FALLTHROUGH; 1776 1777 case AMDGPU::G_FADD: 1778 case AMDGPU::G_FSUB: 1779 case AMDGPU::G_FPTOSI: 1780 case AMDGPU::G_FPTOUI: 1781 case AMDGPU::G_FMUL: 1782 case AMDGPU::G_FMA: 1783 case AMDGPU::G_FMAD: 1784 case AMDGPU::G_FSQRT: 1785 case AMDGPU::G_FFLOOR: 1786 case AMDGPU::G_SITOFP: 1787 case AMDGPU::G_UITOFP: 1788 case AMDGPU::G_FPTRUNC: 1789 case AMDGPU::G_FPEXT: 1790 case AMDGPU::G_FEXP2: 1791 case AMDGPU::G_FLOG2: 1792 case AMDGPU::G_FMINNUM: 1793 case AMDGPU::G_FMAXNUM: 1794 case AMDGPU::G_FMINNUM_IEEE: 1795 case AMDGPU::G_FMAXNUM_IEEE: 1796 case AMDGPU::G_FCANONICALIZE: 1797 case AMDGPU::G_INTRINSIC_TRUNC: 1798 case AMDGPU::G_INTRINSIC_ROUND: 1799 return getDefaultMappingVOP(MI); 1800 case AMDGPU::G_IMPLICIT_DEF: { 1801 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1802 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1803 break; 1804 } 1805 case AMDGPU::G_FCONSTANT: 1806 case AMDGPU::G_CONSTANT: 1807 case AMDGPU::G_FRAME_INDEX: 1808 case AMDGPU::G_GLOBAL_VALUE: 1809 case AMDGPU::G_BLOCK_ADDR: { 1810 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1811 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 1812 break; 1813 } 1814 case AMDGPU::G_INSERT: { 1815 unsigned BankID = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID : 1816 AMDGPU::VGPRRegBankID; 1817 unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1818 unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 1819 unsigned EltSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI); 1820 OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize); 1821 OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize); 1822 OpdsMapping[2] = AMDGPU::getValueMapping(BankID, EltSize); 1823 OpdsMapping[3] = nullptr; 1824 break; 1825 } 1826 case AMDGPU::G_EXTRACT: { 1827 unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI); 1828 unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 1829 unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 1830 OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize); 1831 OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize); 1832 OpdsMapping[2] = nullptr; 1833 break; 1834 } 1835 case AMDGPU::G_BUILD_VECTOR: 1836 case AMDGPU::G_BUILD_VECTOR_TRUNC: { 1837 LLT DstTy = MRI.getType(MI.getOperand(0).getReg()); 1838 if (DstTy == LLT::vector(2, 16)) { 1839 unsigned DstSize = DstTy.getSizeInBits(); 1840 unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1841 unsigned Src0BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI); 1842 unsigned Src1BankID = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1843 unsigned DstBankID = regBankUnion(Src0BankID, Src1BankID); 1844 1845 OpdsMapping[0] = AMDGPU::getValueMapping(DstBankID, DstSize); 1846 OpdsMapping[1] = AMDGPU::getValueMapping(Src0BankID, SrcSize); 1847 OpdsMapping[2] = AMDGPU::getValueMapping(Src1BankID, SrcSize); 1848 break; 1849 } 1850 1851 LLVM_FALLTHROUGH; 1852 } 1853 case AMDGPU::G_MERGE_VALUES: 1854 case AMDGPU::G_CONCAT_VECTORS: { 1855 unsigned Bank = isSALUMapping(MI) ? 1856 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1857 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1858 unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1859 1860 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize); 1861 // Op1 and Dst should use the same register bank. 1862 for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i) 1863 OpdsMapping[i] = AMDGPU::getValueMapping(Bank, SrcSize); 1864 break; 1865 } 1866 case AMDGPU::G_BITCAST: 1867 case AMDGPU::G_INTTOPTR: 1868 case AMDGPU::G_PTRTOINT: 1869 case AMDGPU::G_CTLZ: 1870 case AMDGPU::G_CTLZ_ZERO_UNDEF: 1871 case AMDGPU::G_CTTZ: 1872 case AMDGPU::G_CTTZ_ZERO_UNDEF: 1873 case AMDGPU::G_CTPOP: 1874 case AMDGPU::G_BSWAP: 1875 case AMDGPU::G_BITREVERSE: 1876 case AMDGPU::G_FABS: 1877 case AMDGPU::G_FNEG: { 1878 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1879 unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI); 1880 OpdsMapping[0] = OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size); 1881 break; 1882 } 1883 case AMDGPU::G_TRUNC: { 1884 Register Dst = MI.getOperand(0).getReg(); 1885 Register Src = MI.getOperand(1).getReg(); 1886 unsigned Bank = getRegBankID(Src, MRI, *TRI); 1887 unsigned DstSize = getSizeInBits(Dst, MRI, *TRI); 1888 unsigned SrcSize = getSizeInBits(Src, MRI, *TRI); 1889 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize); 1890 OpdsMapping[1] = AMDGPU::getValueMapping(Bank, SrcSize); 1891 break; 1892 } 1893 case AMDGPU::G_ZEXT: 1894 case AMDGPU::G_SEXT: 1895 case AMDGPU::G_ANYEXT: { 1896 Register Dst = MI.getOperand(0).getReg(); 1897 Register Src = MI.getOperand(1).getReg(); 1898 unsigned DstSize = getSizeInBits(Dst, MRI, *TRI); 1899 unsigned SrcSize = getSizeInBits(Src, MRI, *TRI); 1900 1901 unsigned DstBank; 1902 const RegisterBank *SrcBank = getRegBank(Src, MRI, *TRI); 1903 assert(SrcBank); 1904 switch (SrcBank->getID()) { 1905 case AMDGPU::SCCRegBankID: 1906 case AMDGPU::SGPRRegBankID: 1907 DstBank = AMDGPU::SGPRRegBankID; 1908 break; 1909 default: 1910 DstBank = AMDGPU::VGPRRegBankID; 1911 break; 1912 } 1913 1914 // TODO: Should anyext be split into 32-bit part as well? 1915 if (MI.getOpcode() == AMDGPU::G_ANYEXT) { 1916 OpdsMapping[0] = AMDGPU::getValueMapping(DstBank, DstSize); 1917 OpdsMapping[1] = AMDGPU::getValueMapping(SrcBank->getID(), SrcSize); 1918 } else { 1919 // Scalar extend can use 64-bit BFE, but VGPRs require extending to 1920 // 32-bits, and then to 64. 1921 OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(DstBank, DstSize); 1922 OpdsMapping[1] = AMDGPU::getValueMappingSGPR64Only(SrcBank->getID(), 1923 SrcSize); 1924 } 1925 break; 1926 } 1927 case AMDGPU::G_FCMP: { 1928 unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1929 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1930 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1); 1931 OpdsMapping[1] = nullptr; // Predicate Operand. 1932 OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size); 1933 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1934 break; 1935 } 1936 case AMDGPU::G_STORE: { 1937 assert(MI.getOperand(0).isReg()); 1938 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1939 // FIXME: We need to specify a different reg bank once scalar stores 1940 // are supported. 1941 const ValueMapping *ValMapping = 1942 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size); 1943 // FIXME: Depending on the type of store, the pointer could be in 1944 // the SGPR Reg bank. 1945 // FIXME: Pointer size should be based on the address space. 1946 const ValueMapping *PtrMapping = 1947 AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64); 1948 1949 OpdsMapping[0] = ValMapping; 1950 OpdsMapping[1] = PtrMapping; 1951 break; 1952 } 1953 1954 case AMDGPU::G_ICMP: { 1955 auto Pred = static_cast<CmpInst::Predicate>(MI.getOperand(1).getPredicate()); 1956 unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1957 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1958 unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 1959 1960 bool CanUseSCC = Op2Bank == AMDGPU::SGPRRegBankID && 1961 Op3Bank == AMDGPU::SGPRRegBankID && 1962 (Size == 32 || (Size == 64 && 1963 (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) && 1964 MF.getSubtarget<GCNSubtarget>().hasScalarCompareEq64())); 1965 1966 unsigned Op0Bank = CanUseSCC ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID; 1967 1968 OpdsMapping[0] = AMDGPU::getValueMapping(Op0Bank, 1); 1969 OpdsMapping[1] = nullptr; // Predicate Operand. 1970 OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size); 1971 OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size); 1972 break; 1973 } 1974 case AMDGPU::G_EXTRACT_VECTOR_ELT: { 1975 unsigned OutputBankID = isSALUMapping(MI) ? 1976 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1977 unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 1978 unsigned IdxSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1979 unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1980 1981 OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, SrcSize); 1982 OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, SrcSize); 1983 1984 // The index can be either if the source vector is VGPR. 1985 OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, IdxSize); 1986 break; 1987 } 1988 case AMDGPU::G_INSERT_VECTOR_ELT: { 1989 unsigned OutputBankID = isSALUMapping(MI) ? 1990 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 1991 1992 unsigned VecSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 1993 unsigned InsertSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 1994 unsigned IdxSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits(); 1995 unsigned InsertEltBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 1996 unsigned IdxBank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 1997 1998 OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, VecSize); 1999 OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, VecSize); 2000 OpdsMapping[2] = AMDGPU::getValueMapping(InsertEltBank, InsertSize); 2001 2002 // The index can be either if the source vector is VGPR. 2003 OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize); 2004 break; 2005 } 2006 case AMDGPU::G_UNMERGE_VALUES: { 2007 unsigned Bank = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID : 2008 AMDGPU::VGPRRegBankID; 2009 2010 // Op1 and Dst should use the same register bank. 2011 // FIXME: Shouldn't this be the default? Why do we need to handle this? 2012 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 2013 unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); 2014 OpdsMapping[i] = AMDGPU::getValueMapping(Bank, Size); 2015 } 2016 break; 2017 } 2018 case AMDGPU::G_INTRINSIC: { 2019 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 2020 default: 2021 return getInvalidInstructionMapping(); 2022 case Intrinsic::amdgcn_div_fmas: 2023 case Intrinsic::amdgcn_trig_preop: 2024 case Intrinsic::amdgcn_sin: 2025 case Intrinsic::amdgcn_cos: 2026 case Intrinsic::amdgcn_log_clamp: 2027 case Intrinsic::amdgcn_rcp: 2028 case Intrinsic::amdgcn_rcp_legacy: 2029 case Intrinsic::amdgcn_rsq: 2030 case Intrinsic::amdgcn_rsq_legacy: 2031 case Intrinsic::amdgcn_rsq_clamp: 2032 case Intrinsic::amdgcn_ldexp: 2033 case Intrinsic::amdgcn_frexp_mant: 2034 case Intrinsic::amdgcn_frexp_exp: 2035 case Intrinsic::amdgcn_fract: 2036 case Intrinsic::amdgcn_cvt_pkrtz: 2037 case Intrinsic::amdgcn_cvt_pknorm_i16: 2038 case Intrinsic::amdgcn_cvt_pknorm_u16: 2039 case Intrinsic::amdgcn_cvt_pk_i16: 2040 case Intrinsic::amdgcn_cvt_pk_u16: 2041 case Intrinsic::amdgcn_fmed3: 2042 case Intrinsic::amdgcn_cubeid: 2043 case Intrinsic::amdgcn_cubema: 2044 case Intrinsic::amdgcn_cubesc: 2045 case Intrinsic::amdgcn_cubetc: 2046 case Intrinsic::amdgcn_sffbh: 2047 case Intrinsic::amdgcn_fmad_ftz: 2048 case Intrinsic::amdgcn_mbcnt_lo: 2049 case Intrinsic::amdgcn_mbcnt_hi: 2050 case Intrinsic::amdgcn_ubfe: 2051 case Intrinsic::amdgcn_sbfe: 2052 case Intrinsic::amdgcn_lerp: 2053 case Intrinsic::amdgcn_sad_u8: 2054 case Intrinsic::amdgcn_msad_u8: 2055 case Intrinsic::amdgcn_sad_hi_u8: 2056 case Intrinsic::amdgcn_sad_u16: 2057 case Intrinsic::amdgcn_qsad_pk_u16_u8: 2058 case Intrinsic::amdgcn_mqsad_pk_u16_u8: 2059 case Intrinsic::amdgcn_mqsad_u32_u8: 2060 case Intrinsic::amdgcn_cvt_pk_u8_f32: 2061 case Intrinsic::amdgcn_alignbit: 2062 case Intrinsic::amdgcn_alignbyte: 2063 case Intrinsic::amdgcn_fdot2: 2064 case Intrinsic::amdgcn_sdot2: 2065 case Intrinsic::amdgcn_udot2: 2066 case Intrinsic::amdgcn_sdot4: 2067 case Intrinsic::amdgcn_udot4: 2068 case Intrinsic::amdgcn_sdot8: 2069 case Intrinsic::amdgcn_udot8: 2070 case Intrinsic::amdgcn_wwm: 2071 case Intrinsic::amdgcn_wqm: 2072 return getDefaultMappingVOP(MI); 2073 case Intrinsic::amdgcn_ds_permute: 2074 case Intrinsic::amdgcn_ds_bpermute: 2075 case Intrinsic::amdgcn_update_dpp: 2076 return getDefaultMappingAllVGPR(MI); 2077 case Intrinsic::amdgcn_kernarg_segment_ptr: 2078 case Intrinsic::amdgcn_s_getpc: 2079 case Intrinsic::amdgcn_groupstaticsize: { 2080 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2081 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 2082 break; 2083 } 2084 case Intrinsic::amdgcn_wqm_vote: { 2085 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2086 OpdsMapping[0] = OpdsMapping[2] 2087 = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size); 2088 break; 2089 } 2090 case Intrinsic::amdgcn_s_buffer_load: { 2091 // FIXME: This should be moved to G_INTRINSIC_W_SIDE_EFFECTS 2092 Register RSrc = MI.getOperand(2).getReg(); // SGPR 2093 Register Offset = MI.getOperand(3).getReg(); // SGPR/imm 2094 2095 unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2096 unsigned Size2 = MRI.getType(RSrc).getSizeInBits(); 2097 unsigned Size3 = MRI.getType(Offset).getSizeInBits(); 2098 2099 unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI); 2100 unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI); 2101 2102 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size0); 2103 OpdsMapping[1] = nullptr; // intrinsic id 2104 2105 // Lie and claim everything is legal, even though some need to be 2106 // SGPRs. applyMapping will have to deal with it as a waterfall loop. 2107 OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc 2108 OpdsMapping[3] = AMDGPU::getValueMapping(OffsetBank, Size3); 2109 OpdsMapping[4] = nullptr; 2110 break; 2111 } 2112 case Intrinsic::amdgcn_div_scale: { 2113 unsigned Dst0Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2114 unsigned Dst1Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 2115 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Dst0Size); 2116 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Dst1Size); 2117 2118 unsigned SrcSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits(); 2119 OpdsMapping[3] = AMDGPU::getValueMapping( 2120 getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI), SrcSize); 2121 OpdsMapping[4] = AMDGPU::getValueMapping( 2122 getRegBankID(MI.getOperand(4).getReg(), MRI, *TRI), SrcSize); 2123 2124 break; 2125 } 2126 case Intrinsic::amdgcn_class: { 2127 Register Src0Reg = MI.getOperand(2).getReg(); 2128 Register Src1Reg = MI.getOperand(3).getReg(); 2129 unsigned Src0Size = MRI.getType(Src0Reg).getSizeInBits(); 2130 unsigned Src1Size = MRI.getType(Src1Reg).getSizeInBits(); 2131 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2132 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, DstSize); 2133 OpdsMapping[2] = AMDGPU::getValueMapping(getRegBankID(Src0Reg, MRI, *TRI), 2134 Src0Size); 2135 OpdsMapping[3] = AMDGPU::getValueMapping(getRegBankID(Src1Reg, MRI, *TRI), 2136 Src1Size); 2137 break; 2138 } 2139 case Intrinsic::amdgcn_icmp: 2140 case Intrinsic::amdgcn_fcmp: { 2141 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2142 // This is not VCCRegBank because this is not used in boolean contexts. 2143 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize); 2144 unsigned OpSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 2145 unsigned Op1Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); 2146 unsigned Op2Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI); 2147 OpdsMapping[2] = AMDGPU::getValueMapping(Op1Bank, OpSize); 2148 OpdsMapping[3] = AMDGPU::getValueMapping(Op2Bank, OpSize); 2149 break; 2150 } 2151 case Intrinsic::amdgcn_readlane: { 2152 // This must be an SGPR, but accept a VGPR. 2153 Register IdxReg = MI.getOperand(3).getReg(); 2154 unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits(); 2155 unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID); 2156 OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize); 2157 LLVM_FALLTHROUGH; 2158 } 2159 case Intrinsic::amdgcn_readfirstlane: { 2160 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2161 unsigned SrcSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits(); 2162 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize); 2163 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize); 2164 break; 2165 } 2166 case Intrinsic::amdgcn_writelane: { 2167 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2168 Register SrcReg = MI.getOperand(2).getReg(); 2169 unsigned SrcSize = MRI.getType(SrcReg).getSizeInBits(); 2170 unsigned SrcBank = getRegBankID(SrcReg, MRI, *TRI, AMDGPU::SGPRRegBankID); 2171 Register IdxReg = MI.getOperand(3).getReg(); 2172 unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits(); 2173 unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID); 2174 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize); 2175 2176 // These 2 must be SGPRs, but accept VGPRs. Readfirstlane will be inserted 2177 // to legalize. 2178 OpdsMapping[2] = AMDGPU::getValueMapping(SrcBank, SrcSize); 2179 OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize); 2180 OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize); 2181 break; 2182 } 2183 case Intrinsic::amdgcn_if_break: { 2184 unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI); 2185 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 2186 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1); 2187 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 2188 break; 2189 } 2190 } 2191 break; 2192 } 2193 case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: { 2194 switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) { 2195 default: 2196 return getInvalidInstructionMapping(); 2197 case Intrinsic::amdgcn_s_getreg: 2198 case Intrinsic::amdgcn_s_memtime: 2199 case Intrinsic::amdgcn_s_memrealtime: 2200 case Intrinsic::amdgcn_s_get_waveid_in_workgroup: { 2201 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2202 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 2203 break; 2204 } 2205 case Intrinsic::amdgcn_ds_append: 2206 case Intrinsic::amdgcn_ds_consume: 2207 case Intrinsic::amdgcn_ds_fadd: 2208 case Intrinsic::amdgcn_ds_fmin: 2209 case Intrinsic::amdgcn_ds_fmax: 2210 case Intrinsic::amdgcn_atomic_inc: 2211 case Intrinsic::amdgcn_atomic_dec: 2212 return getDefaultMappingAllVGPR(MI); 2213 case Intrinsic::amdgcn_ds_ordered_add: 2214 case Intrinsic::amdgcn_ds_ordered_swap: { 2215 unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2216 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize); 2217 unsigned M0Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI, 2218 AMDGPU::SGPRRegBankID); 2219 OpdsMapping[2] = AMDGPU::getValueMapping(M0Bank, 32); 2220 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2221 break; 2222 } 2223 case Intrinsic::amdgcn_exp_compr: 2224 OpdsMapping[0] = nullptr; // IntrinsicID 2225 // FIXME: These are immediate values which can't be read from registers. 2226 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2227 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2228 // FIXME: Could we support packed types here? 2229 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2230 OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2231 // FIXME: These are immediate values which can't be read from registers. 2232 OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2233 OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2234 break; 2235 case Intrinsic::amdgcn_exp: 2236 OpdsMapping[0] = nullptr; // IntrinsicID 2237 // FIXME: These are immediate values which can't be read from registers. 2238 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2239 OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2240 // FIXME: Could we support packed types here? 2241 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2242 OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2243 OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2244 OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32); 2245 // FIXME: These are immediate values which can't be read from registers. 2246 OpdsMapping[7] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2247 OpdsMapping[8] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32); 2248 break; 2249 case Intrinsic::amdgcn_buffer_load: { 2250 Register RSrc = MI.getOperand(2).getReg(); // SGPR 2251 Register VIndex = MI.getOperand(3).getReg(); // VGPR 2252 Register Offset = MI.getOperand(4).getReg(); // SGPR/VGPR/imm 2253 2254 unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2255 unsigned Size2 = MRI.getType(RSrc).getSizeInBits(); 2256 unsigned Size3 = MRI.getType(VIndex).getSizeInBits(); 2257 unsigned Size4 = MRI.getType(Offset).getSizeInBits(); 2258 2259 unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI); 2260 unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI); 2261 2262 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0); 2263 OpdsMapping[1] = nullptr; // intrinsic id 2264 2265 // Lie and claim everything is legal, even though some need to be 2266 // SGPRs. applyMapping will have to deal with it as a waterfall loop. 2267 OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc 2268 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size3); 2269 OpdsMapping[4] = AMDGPU::getValueMapping(OffsetBank, Size4); 2270 OpdsMapping[5] = nullptr; 2271 OpdsMapping[6] = nullptr; 2272 break; 2273 } 2274 case Intrinsic::amdgcn_s_sendmsg: 2275 case Intrinsic::amdgcn_s_sendmsghalt: { 2276 // This must be an SGPR, but accept a VGPR. 2277 unsigned Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI, 2278 AMDGPU::SGPRRegBankID); 2279 OpdsMapping[1] = AMDGPU::getValueMapping(Bank, 32); 2280 OpdsMapping[2] = AMDGPU::getValueMapping(Bank, 32); 2281 break; 2282 } 2283 case Intrinsic::amdgcn_end_cf: { 2284 unsigned Size = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 2285 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); 2286 break; 2287 } 2288 case Intrinsic::amdgcn_else: { 2289 unsigned WaveSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI); 2290 OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1); 2291 OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize); 2292 OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize); 2293 break; 2294 } 2295 } 2296 break; 2297 } 2298 case AMDGPU::G_SELECT: { 2299 unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); 2300 unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI, 2301 AMDGPU::SGPRRegBankID); 2302 unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI, 2303 AMDGPU::SGPRRegBankID); 2304 bool SGPRSrcs = Op2Bank == AMDGPU::SGPRRegBankID && 2305 Op3Bank == AMDGPU::SGPRRegBankID; 2306 2307 unsigned CondBankDefault = SGPRSrcs ? 2308 AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID; 2309 unsigned CondBank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI, 2310 CondBankDefault); 2311 if (CondBank == AMDGPU::SGPRRegBankID) 2312 CondBank = SGPRSrcs ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID; 2313 else if (CondBank == AMDGPU::VGPRRegBankID) 2314 CondBank = AMDGPU::VCCRegBankID; 2315 2316 unsigned Bank = SGPRSrcs && CondBank == AMDGPU::SCCRegBankID ? 2317 AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; 2318 2319 assert(CondBank == AMDGPU::VCCRegBankID || CondBank == AMDGPU::SCCRegBankID); 2320 2321 if (Size == 64) { 2322 OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 2323 OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1); 2324 OpdsMapping[2] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 2325 OpdsMapping[3] = AMDGPU::getValueMappingSGPR64Only(Bank, Size); 2326 } else { 2327 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, Size); 2328 OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1); 2329 OpdsMapping[2] = AMDGPU::getValueMapping(Bank, Size); 2330 OpdsMapping[3] = AMDGPU::getValueMapping(Bank, Size); 2331 } 2332 2333 break; 2334 } 2335 2336 case AMDGPU::G_LOAD: 2337 case AMDGPU::G_ZEXTLOAD: 2338 case AMDGPU::G_SEXTLOAD: 2339 return getInstrMappingForLoad(MI); 2340 2341 case AMDGPU::G_ATOMICRMW_XCHG: 2342 case AMDGPU::G_ATOMICRMW_ADD: 2343 case AMDGPU::G_ATOMICRMW_SUB: 2344 case AMDGPU::G_ATOMICRMW_AND: 2345 case AMDGPU::G_ATOMICRMW_OR: 2346 case AMDGPU::G_ATOMICRMW_XOR: 2347 case AMDGPU::G_ATOMICRMW_MAX: 2348 case AMDGPU::G_ATOMICRMW_MIN: 2349 case AMDGPU::G_ATOMICRMW_UMAX: 2350 case AMDGPU::G_ATOMICRMW_UMIN: 2351 case AMDGPU::G_ATOMICRMW_FADD: 2352 case AMDGPU::G_ATOMIC_CMPXCHG: { 2353 return getDefaultMappingAllVGPR(MI); 2354 } 2355 case AMDGPU::G_BRCOND: { 2356 unsigned Bank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI, 2357 AMDGPU::SGPRRegBankID); 2358 assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1); 2359 if (Bank != AMDGPU::SCCRegBankID) 2360 Bank = AMDGPU::VCCRegBankID; 2361 2362 OpdsMapping[0] = AMDGPU::getValueMapping(Bank, 1); 2363 break; 2364 } 2365 } 2366 2367 return getInstructionMapping(/*ID*/1, /*Cost*/1, 2368 getOperandsMapping(OpdsMapping), 2369 MI.getNumOperands()); 2370 } 2371 2372