1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file 10 /// SI implementation of the TargetRegisterInfo class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "SIRegisterInfo.h" 15 #include "AMDGPURegisterBankInfo.h" 16 #include "AMDGPUSubtarget.h" 17 #include "SIInstrInfo.h" 18 #include "SIMachineFunctionInfo.h" 19 #include "MCTargetDesc/AMDGPUInstPrinter.h" 20 #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 21 #include "llvm/CodeGen/LiveIntervals.h" 22 #include "llvm/CodeGen/MachineDominators.h" 23 #include "llvm/CodeGen/MachineFrameInfo.h" 24 #include "llvm/CodeGen/MachineInstrBuilder.h" 25 #include "llvm/CodeGen/RegisterScavenging.h" 26 #include "llvm/CodeGen/SlotIndexes.h" 27 #include "llvm/IR/Function.h" 28 #include "llvm/IR/LLVMContext.h" 29 30 using namespace llvm; 31 32 static bool hasPressureSet(const int *PSets, unsigned PSetID) { 33 for (unsigned i = 0; PSets[i] != -1; ++i) { 34 if (PSets[i] == (int)PSetID) 35 return true; 36 } 37 return false; 38 } 39 40 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg, 41 BitVector &PressureSets) const { 42 for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) { 43 const int *PSets = getRegUnitPressureSets(*U); 44 if (hasPressureSet(PSets, PSetID)) { 45 PressureSets.set(PSetID); 46 break; 47 } 48 } 49 } 50 51 static cl::opt<bool> EnableSpillSGPRToVGPR( 52 "amdgpu-spill-sgpr-to-vgpr", 53 cl::desc("Enable spilling VGPRs to SGPRs"), 54 cl::ReallyHidden, 55 cl::init(true)); 56 57 SIRegisterInfo::SIRegisterInfo(const GCNSubtarget &ST) : 58 AMDGPURegisterInfo(), 59 ST(ST), 60 SGPRPressureSets(getNumRegPressureSets()), 61 VGPRPressureSets(getNumRegPressureSets()), 62 AGPRPressureSets(getNumRegPressureSets()), 63 SpillSGPRToVGPR(EnableSpillSGPRToVGPR), 64 isWave32(ST.isWave32()) { 65 unsigned NumRegPressureSets = getNumRegPressureSets(); 66 67 SGPRSetID = NumRegPressureSets; 68 VGPRSetID = NumRegPressureSets; 69 AGPRSetID = NumRegPressureSets; 70 71 for (unsigned i = 0; i < NumRegPressureSets; ++i) { 72 classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets); 73 classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets); 74 classifyPressureSet(i, AMDGPU::AGPR0, AGPRPressureSets); 75 } 76 77 // Determine the number of reg units for each pressure set. 78 std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0); 79 for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) { 80 const int *PSets = getRegUnitPressureSets(i); 81 for (unsigned j = 0; PSets[j] != -1; ++j) { 82 ++PressureSetRegUnits[PSets[j]]; 83 } 84 } 85 86 unsigned VGPRMax = 0, SGPRMax = 0, AGPRMax = 0; 87 for (unsigned i = 0; i < NumRegPressureSets; ++i) { 88 if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) { 89 VGPRSetID = i; 90 VGPRMax = PressureSetRegUnits[i]; 91 continue; 92 } 93 if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) { 94 SGPRSetID = i; 95 SGPRMax = PressureSetRegUnits[i]; 96 } 97 if (isAGPRPressureSet(i) && PressureSetRegUnits[i] > AGPRMax) { 98 AGPRSetID = i; 99 AGPRMax = PressureSetRegUnits[i]; 100 continue; 101 } 102 } 103 104 assert(SGPRSetID < NumRegPressureSets && 105 VGPRSetID < NumRegPressureSets && 106 AGPRSetID < NumRegPressureSets); 107 } 108 109 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg( 110 const MachineFunction &MF) const { 111 unsigned BaseIdx = alignDown(ST.getMaxNumSGPRs(MF), 4) - 4; 112 unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx)); 113 return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SGPR_128RegClass); 114 } 115 116 static unsigned findPrivateSegmentWaveByteOffsetRegIndex(unsigned RegCount) { 117 unsigned Reg; 118 119 // Try to place it in a hole after PrivateSegmentBufferReg. 120 if (RegCount & 3) { 121 // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to 122 // alignment constraints, so we have a hole where can put the wave offset. 123 Reg = RegCount - 1; 124 } else { 125 // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the 126 // wave offset before it. 127 Reg = RegCount - 5; 128 } 129 130 return Reg; 131 } 132 133 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg( 134 const MachineFunction &MF) const { 135 unsigned Reg = findPrivateSegmentWaveByteOffsetRegIndex(ST.getMaxNumSGPRs(MF)); 136 return AMDGPU::SGPR_32RegClass.getRegister(Reg); 137 } 138 139 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 140 BitVector Reserved(getNumRegs()); 141 142 // EXEC_LO and EXEC_HI could be allocated and used as regular register, but 143 // this seems likely to result in bugs, so I'm marking them as reserved. 144 reserveRegisterTuples(Reserved, AMDGPU::EXEC); 145 reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR); 146 147 // M0 has to be reserved so that llvm accepts it as a live-in into a block. 148 reserveRegisterTuples(Reserved, AMDGPU::M0); 149 150 // Reserve src_vccz, src_execz, src_scc. 151 reserveRegisterTuples(Reserved, AMDGPU::SRC_VCCZ); 152 reserveRegisterTuples(Reserved, AMDGPU::SRC_EXECZ); 153 reserveRegisterTuples(Reserved, AMDGPU::SRC_SCC); 154 155 // Reserve the memory aperture registers. 156 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_BASE); 157 reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_LIMIT); 158 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_BASE); 159 reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_LIMIT); 160 161 // Reserve src_pops_exiting_wave_id - support is not implemented in Codegen. 162 reserveRegisterTuples(Reserved, AMDGPU::SRC_POPS_EXITING_WAVE_ID); 163 164 // Reserve xnack_mask registers - support is not implemented in Codegen. 165 reserveRegisterTuples(Reserved, AMDGPU::XNACK_MASK); 166 167 // Reserve lds_direct register - support is not implemented in Codegen. 168 reserveRegisterTuples(Reserved, AMDGPU::LDS_DIRECT); 169 170 // Reserve Trap Handler registers - support is not implemented in Codegen. 171 reserveRegisterTuples(Reserved, AMDGPU::TBA); 172 reserveRegisterTuples(Reserved, AMDGPU::TMA); 173 reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1); 174 reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3); 175 reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5); 176 reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7); 177 reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9); 178 reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11); 179 reserveRegisterTuples(Reserved, AMDGPU::TTMP12_TTMP13); 180 reserveRegisterTuples(Reserved, AMDGPU::TTMP14_TTMP15); 181 182 // Reserve null register - it shall never be allocated 183 reserveRegisterTuples(Reserved, AMDGPU::SGPR_NULL); 184 185 // Disallow vcc_hi allocation in wave32. It may be allocated but most likely 186 // will result in bugs. 187 if (isWave32) { 188 Reserved.set(AMDGPU::VCC); 189 Reserved.set(AMDGPU::VCC_HI); 190 } 191 192 unsigned MaxNumSGPRs = ST.getMaxNumSGPRs(MF); 193 unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs(); 194 for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) { 195 unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i); 196 reserveRegisterTuples(Reserved, Reg); 197 } 198 199 unsigned MaxNumVGPRs = ST.getMaxNumVGPRs(MF); 200 unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs(); 201 for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) { 202 unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); 203 reserveRegisterTuples(Reserved, Reg); 204 Reg = AMDGPU::AGPR_32RegClass.getRegister(i); 205 reserveRegisterTuples(Reserved, Reg); 206 } 207 208 // Reserve all the rest AGPRs if there are no instructions to use it. 209 if (!ST.hasMAIInsts()) { 210 for (unsigned i = 0; i < MaxNumVGPRs; ++i) { 211 unsigned Reg = AMDGPU::AGPR_32RegClass.getRegister(i); 212 reserveRegisterTuples(Reserved, Reg); 213 } 214 } 215 216 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 217 218 unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg(); 219 if (ScratchWaveOffsetReg != AMDGPU::NoRegister) { 220 // Reserve 1 SGPR for scratch wave offset in case we need to spill. 221 reserveRegisterTuples(Reserved, ScratchWaveOffsetReg); 222 } 223 224 unsigned ScratchRSrcReg = MFI->getScratchRSrcReg(); 225 if (ScratchRSrcReg != AMDGPU::NoRegister) { 226 // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need 227 // to spill. 228 // TODO: May need to reserve a VGPR if doing LDS spilling. 229 reserveRegisterTuples(Reserved, ScratchRSrcReg); 230 assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg)); 231 } 232 233 // We have to assume the SP is needed in case there are calls in the function, 234 // which is detected after the function is lowered. If we aren't really going 235 // to need SP, don't bother reserving it. 236 unsigned StackPtrReg = MFI->getStackPtrOffsetReg(); 237 238 if (StackPtrReg != AMDGPU::NoRegister) { 239 reserveRegisterTuples(Reserved, StackPtrReg); 240 assert(!isSubRegister(ScratchRSrcReg, StackPtrReg)); 241 } 242 243 unsigned FrameReg = MFI->getFrameOffsetReg(); 244 if (FrameReg != AMDGPU::NoRegister) { 245 reserveRegisterTuples(Reserved, FrameReg); 246 assert(!isSubRegister(ScratchRSrcReg, FrameReg)); 247 } 248 249 for (unsigned Reg : MFI->WWMReservedRegs) { 250 reserveRegisterTuples(Reserved, Reg); 251 } 252 253 // FIXME: Stop using reserved registers for this. 254 for (MCPhysReg Reg : MFI->getAGPRSpillVGPRs()) 255 reserveRegisterTuples(Reserved, Reg); 256 257 for (MCPhysReg Reg : MFI->getVGPRSpillAGPRs()) 258 reserveRegisterTuples(Reserved, Reg); 259 260 return Reserved; 261 } 262 263 bool SIRegisterInfo::canRealignStack(const MachineFunction &MF) const { 264 const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>(); 265 // On entry, the base address is 0, so it can't possibly need any more 266 // alignment. 267 268 // FIXME: Should be able to specify the entry frame alignment per calling 269 // convention instead. 270 if (Info->isEntryFunction()) 271 return false; 272 273 return TargetRegisterInfo::canRealignStack(MF); 274 } 275 276 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const { 277 const SIMachineFunctionInfo *Info = Fn.getInfo<SIMachineFunctionInfo>(); 278 if (Info->isEntryFunction()) { 279 const MachineFrameInfo &MFI = Fn.getFrameInfo(); 280 return MFI.hasStackObjects() || MFI.hasCalls(); 281 } 282 283 // May need scavenger for dealing with callee saved registers. 284 return true; 285 } 286 287 bool SIRegisterInfo::requiresFrameIndexScavenging( 288 const MachineFunction &MF) const { 289 // Do not use frame virtual registers. They used to be used for SGPRs, but 290 // once we reach PrologEpilogInserter, we can no longer spill SGPRs. If the 291 // scavenger fails, we can increment/decrement the necessary SGPRs to avoid a 292 // spill. 293 return false; 294 } 295 296 bool SIRegisterInfo::requiresFrameIndexReplacementScavenging( 297 const MachineFunction &MF) const { 298 const MachineFrameInfo &MFI = MF.getFrameInfo(); 299 return MFI.hasStackObjects(); 300 } 301 302 bool SIRegisterInfo::requiresVirtualBaseRegisters( 303 const MachineFunction &) const { 304 // There are no special dedicated stack or frame pointers. 305 return true; 306 } 307 308 bool SIRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const { 309 // This helps catch bugs as verifier errors. 310 return true; 311 } 312 313 int64_t SIRegisterInfo::getMUBUFInstrOffset(const MachineInstr *MI) const { 314 assert(SIInstrInfo::isMUBUF(*MI)); 315 316 int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), 317 AMDGPU::OpName::offset); 318 return MI->getOperand(OffIdx).getImm(); 319 } 320 321 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI, 322 int Idx) const { 323 if (!SIInstrInfo::isMUBUF(*MI)) 324 return 0; 325 326 assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(), 327 AMDGPU::OpName::vaddr) && 328 "Should never see frame index on non-address operand"); 329 330 return getMUBUFInstrOffset(MI); 331 } 332 333 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { 334 if (!MI->mayLoadOrStore()) 335 return false; 336 337 int64_t FullOffset = Offset + getMUBUFInstrOffset(MI); 338 339 return !isUInt<12>(FullOffset); 340 } 341 342 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, 343 unsigned BaseReg, 344 int FrameIdx, 345 int64_t Offset) const { 346 MachineBasicBlock::iterator Ins = MBB->begin(); 347 DebugLoc DL; // Defaults to "unknown" 348 349 if (Ins != MBB->end()) 350 DL = Ins->getDebugLoc(); 351 352 MachineFunction *MF = MBB->getParent(); 353 const SIInstrInfo *TII = ST.getInstrInfo(); 354 355 if (Offset == 0) { 356 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg) 357 .addFrameIndex(FrameIdx); 358 return; 359 } 360 361 MachineRegisterInfo &MRI = MF->getRegInfo(); 362 Register OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass); 363 364 Register FIReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 365 366 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg) 367 .addImm(Offset); 368 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), FIReg) 369 .addFrameIndex(FrameIdx); 370 371 TII->getAddNoCarry(*MBB, Ins, DL, BaseReg) 372 .addReg(OffsetReg, RegState::Kill) 373 .addReg(FIReg) 374 .addImm(0); // clamp bit 375 } 376 377 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, 378 int64_t Offset) const { 379 const SIInstrInfo *TII = ST.getInstrInfo(); 380 381 #ifndef NDEBUG 382 // FIXME: Is it possible to be storing a frame index to itself? 383 bool SeenFI = false; 384 for (const MachineOperand &MO: MI.operands()) { 385 if (MO.isFI()) { 386 if (SeenFI) 387 llvm_unreachable("should not see multiple frame indices"); 388 389 SeenFI = true; 390 } 391 } 392 #endif 393 394 MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr); 395 #ifndef NDEBUG 396 MachineBasicBlock *MBB = MI.getParent(); 397 MachineFunction *MF = MBB->getParent(); 398 #endif 399 assert(FIOp && FIOp->isFI() && "frame index must be address operand"); 400 assert(TII->isMUBUF(MI)); 401 assert(TII->getNamedOperand(MI, AMDGPU::OpName::soffset)->getReg() == 402 MF->getInfo<SIMachineFunctionInfo>()->getStackPtrOffsetReg() && 403 "should only be seeing stack pointer offset relative FrameIndex"); 404 405 MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset); 406 int64_t NewOffset = OffsetOp->getImm() + Offset; 407 assert(isUInt<12>(NewOffset) && "offset should be legal"); 408 409 FIOp->ChangeToRegister(BaseReg, false); 410 OffsetOp->setImm(NewOffset); 411 } 412 413 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, 414 unsigned BaseReg, 415 int64_t Offset) const { 416 if (!SIInstrInfo::isMUBUF(*MI)) 417 return false; 418 419 int64_t NewOffset = Offset + getMUBUFInstrOffset(MI); 420 421 return isUInt<12>(NewOffset); 422 } 423 424 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass( 425 const MachineFunction &MF, unsigned Kind) const { 426 // This is inaccurate. It depends on the instruction and address space. The 427 // only place where we should hit this is for dealing with frame indexes / 428 // private accesses, so this is correct in that case. 429 return &AMDGPU::VGPR_32RegClass; 430 } 431 432 static unsigned getNumSubRegsForSpillOp(unsigned Op) { 433 434 switch (Op) { 435 case AMDGPU::SI_SPILL_S1024_SAVE: 436 case AMDGPU::SI_SPILL_S1024_RESTORE: 437 case AMDGPU::SI_SPILL_V1024_SAVE: 438 case AMDGPU::SI_SPILL_V1024_RESTORE: 439 case AMDGPU::SI_SPILL_A1024_SAVE: 440 case AMDGPU::SI_SPILL_A1024_RESTORE: 441 return 32; 442 case AMDGPU::SI_SPILL_S512_SAVE: 443 case AMDGPU::SI_SPILL_S512_RESTORE: 444 case AMDGPU::SI_SPILL_V512_SAVE: 445 case AMDGPU::SI_SPILL_V512_RESTORE: 446 case AMDGPU::SI_SPILL_A512_SAVE: 447 case AMDGPU::SI_SPILL_A512_RESTORE: 448 return 16; 449 case AMDGPU::SI_SPILL_S256_SAVE: 450 case AMDGPU::SI_SPILL_S256_RESTORE: 451 case AMDGPU::SI_SPILL_V256_SAVE: 452 case AMDGPU::SI_SPILL_V256_RESTORE: 453 return 8; 454 case AMDGPU::SI_SPILL_S160_SAVE: 455 case AMDGPU::SI_SPILL_S160_RESTORE: 456 case AMDGPU::SI_SPILL_V160_SAVE: 457 case AMDGPU::SI_SPILL_V160_RESTORE: 458 return 5; 459 case AMDGPU::SI_SPILL_S128_SAVE: 460 case AMDGPU::SI_SPILL_S128_RESTORE: 461 case AMDGPU::SI_SPILL_V128_SAVE: 462 case AMDGPU::SI_SPILL_V128_RESTORE: 463 case AMDGPU::SI_SPILL_A128_SAVE: 464 case AMDGPU::SI_SPILL_A128_RESTORE: 465 return 4; 466 case AMDGPU::SI_SPILL_S96_SAVE: 467 case AMDGPU::SI_SPILL_S96_RESTORE: 468 case AMDGPU::SI_SPILL_V96_SAVE: 469 case AMDGPU::SI_SPILL_V96_RESTORE: 470 return 3; 471 case AMDGPU::SI_SPILL_S64_SAVE: 472 case AMDGPU::SI_SPILL_S64_RESTORE: 473 case AMDGPU::SI_SPILL_V64_SAVE: 474 case AMDGPU::SI_SPILL_V64_RESTORE: 475 case AMDGPU::SI_SPILL_A64_SAVE: 476 case AMDGPU::SI_SPILL_A64_RESTORE: 477 return 2; 478 case AMDGPU::SI_SPILL_S32_SAVE: 479 case AMDGPU::SI_SPILL_S32_RESTORE: 480 case AMDGPU::SI_SPILL_V32_SAVE: 481 case AMDGPU::SI_SPILL_V32_RESTORE: 482 case AMDGPU::SI_SPILL_A32_SAVE: 483 case AMDGPU::SI_SPILL_A32_RESTORE: 484 return 1; 485 default: llvm_unreachable("Invalid spill opcode"); 486 } 487 } 488 489 static int getOffsetMUBUFStore(unsigned Opc) { 490 switch (Opc) { 491 case AMDGPU::BUFFER_STORE_DWORD_OFFEN: 492 return AMDGPU::BUFFER_STORE_DWORD_OFFSET; 493 case AMDGPU::BUFFER_STORE_BYTE_OFFEN: 494 return AMDGPU::BUFFER_STORE_BYTE_OFFSET; 495 case AMDGPU::BUFFER_STORE_SHORT_OFFEN: 496 return AMDGPU::BUFFER_STORE_SHORT_OFFSET; 497 case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN: 498 return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET; 499 case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN: 500 return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET; 501 case AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFEN: 502 return AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFSET; 503 case AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFEN: 504 return AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFSET; 505 default: 506 return -1; 507 } 508 } 509 510 static int getOffsetMUBUFLoad(unsigned Opc) { 511 switch (Opc) { 512 case AMDGPU::BUFFER_LOAD_DWORD_OFFEN: 513 return AMDGPU::BUFFER_LOAD_DWORD_OFFSET; 514 case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN: 515 return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET; 516 case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN: 517 return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET; 518 case AMDGPU::BUFFER_LOAD_USHORT_OFFEN: 519 return AMDGPU::BUFFER_LOAD_USHORT_OFFSET; 520 case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN: 521 return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET; 522 case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN: 523 return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET; 524 case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN: 525 return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET; 526 case AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFEN: 527 return AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFSET; 528 case AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFEN: 529 return AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFSET; 530 case AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFEN: 531 return AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFSET; 532 case AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFEN: 533 return AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFSET; 534 case AMDGPU::BUFFER_LOAD_SHORT_D16_OFFEN: 535 return AMDGPU::BUFFER_LOAD_SHORT_D16_OFFSET; 536 case AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFEN: 537 return AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFSET; 538 default: 539 return -1; 540 } 541 } 542 543 static MachineInstrBuilder spillVGPRtoAGPR(const GCNSubtarget &ST, 544 MachineBasicBlock::iterator MI, 545 int Index, 546 unsigned Lane, 547 unsigned ValueReg, 548 bool IsKill) { 549 MachineBasicBlock *MBB = MI->getParent(); 550 MachineFunction *MF = MI->getParent()->getParent(); 551 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 552 const SIInstrInfo *TII = ST.getInstrInfo(); 553 554 MCPhysReg Reg = MFI->getVGPRToAGPRSpill(Index, Lane); 555 556 if (Reg == AMDGPU::NoRegister) 557 return MachineInstrBuilder(); 558 559 bool IsStore = MI->mayStore(); 560 MachineRegisterInfo &MRI = MF->getRegInfo(); 561 auto *TRI = static_cast<const SIRegisterInfo*>(MRI.getTargetRegisterInfo()); 562 563 unsigned Dst = IsStore ? Reg : ValueReg; 564 unsigned Src = IsStore ? ValueReg : Reg; 565 unsigned Opc = (IsStore ^ TRI->isVGPR(MRI, Reg)) ? AMDGPU::V_ACCVGPR_WRITE_B32 566 : AMDGPU::V_ACCVGPR_READ_B32; 567 568 return BuildMI(*MBB, MI, MI->getDebugLoc(), TII->get(Opc), Dst) 569 .addReg(Src, getKillRegState(IsKill)); 570 } 571 572 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not 573 // need to handle the case where an SGPR may need to be spilled while spilling. 574 static bool buildMUBUFOffsetLoadStore(const GCNSubtarget &ST, 575 MachineFrameInfo &MFI, 576 MachineBasicBlock::iterator MI, 577 int Index, 578 int64_t Offset) { 579 const SIInstrInfo *TII = ST.getInstrInfo(); 580 MachineBasicBlock *MBB = MI->getParent(); 581 const DebugLoc &DL = MI->getDebugLoc(); 582 bool IsStore = MI->mayStore(); 583 584 unsigned Opc = MI->getOpcode(); 585 int LoadStoreOp = IsStore ? 586 getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc); 587 if (LoadStoreOp == -1) 588 return false; 589 590 const MachineOperand *Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata); 591 if (spillVGPRtoAGPR(ST, MI, Index, 0, Reg->getReg(), false).getInstr()) 592 return true; 593 594 MachineInstrBuilder NewMI = 595 BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp)) 596 .add(*Reg) 597 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)) 598 .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)) 599 .addImm(Offset) 600 .addImm(0) // glc 601 .addImm(0) // slc 602 .addImm(0) // tfe 603 .addImm(0) // dlc 604 .addImm(0) // swz 605 .cloneMemRefs(*MI); 606 607 const MachineOperand *VDataIn = TII->getNamedOperand(*MI, 608 AMDGPU::OpName::vdata_in); 609 if (VDataIn) 610 NewMI.add(*VDataIn); 611 return true; 612 } 613 614 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI, 615 unsigned LoadStoreOp, 616 int Index, 617 unsigned ValueReg, 618 bool IsKill, 619 unsigned ScratchRsrcReg, 620 unsigned ScratchOffsetReg, 621 int64_t InstOffset, 622 MachineMemOperand *MMO, 623 RegScavenger *RS) const { 624 MachineBasicBlock *MBB = MI->getParent(); 625 MachineFunction *MF = MI->getParent()->getParent(); 626 const SIInstrInfo *TII = ST.getInstrInfo(); 627 const MachineFrameInfo &MFI = MF->getFrameInfo(); 628 629 const MCInstrDesc &Desc = TII->get(LoadStoreOp); 630 const DebugLoc &DL = MI->getDebugLoc(); 631 bool IsStore = Desc.mayStore(); 632 633 bool Scavenged = false; 634 unsigned SOffset = ScratchOffsetReg; 635 636 const unsigned EltSize = 4; 637 const TargetRegisterClass *RC = getRegClassForReg(MF->getRegInfo(), ValueReg); 638 unsigned NumSubRegs = AMDGPU::getRegBitWidth(RC->getID()) / (EltSize * CHAR_BIT); 639 unsigned Size = NumSubRegs * EltSize; 640 int64_t Offset = InstOffset + MFI.getObjectOffset(Index); 641 int64_t ScratchOffsetRegDelta = 0; 642 643 unsigned Align = MFI.getObjectAlignment(Index); 644 const MachinePointerInfo &BasePtrInfo = MMO->getPointerInfo(); 645 646 Register TmpReg = 647 hasAGPRs(RC) ? TII->getNamedOperand(*MI, AMDGPU::OpName::tmp)->getReg() 648 : Register(); 649 650 assert((Offset % EltSize) == 0 && "unexpected VGPR spill offset"); 651 652 if (!isUInt<12>(Offset + Size - EltSize)) { 653 SOffset = AMDGPU::NoRegister; 654 655 // We currently only support spilling VGPRs to EltSize boundaries, meaning 656 // we can simplify the adjustment of Offset here to just scale with 657 // WavefrontSize. 658 Offset *= ST.getWavefrontSize(); 659 660 // We don't have access to the register scavenger if this function is called 661 // during PEI::scavengeFrameVirtualRegs(). 662 if (RS) 663 SOffset = RS->scavengeRegister(&AMDGPU::SGPR_32RegClass, MI, 0, false); 664 665 if (SOffset == AMDGPU::NoRegister) { 666 // There are no free SGPRs, and since we are in the process of spilling 667 // VGPRs too. Since we need a VGPR in order to spill SGPRs (this is true 668 // on SI/CI and on VI it is true until we implement spilling using scalar 669 // stores), we have no way to free up an SGPR. Our solution here is to 670 // add the offset directly to the ScratchOffset register, and then 671 // subtract the offset after the spill to return ScratchOffset to it's 672 // original value. 673 SOffset = ScratchOffsetReg; 674 ScratchOffsetRegDelta = Offset; 675 } else { 676 Scavenged = true; 677 } 678 679 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset) 680 .addReg(ScratchOffsetReg) 681 .addImm(Offset); 682 683 Offset = 0; 684 } 685 686 for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += EltSize) { 687 Register SubReg = NumSubRegs == 1 688 ? Register(ValueReg) 689 : getSubReg(ValueReg, getSubRegFromChannel(i)); 690 691 unsigned SOffsetRegState = 0; 692 unsigned SrcDstRegState = getDefRegState(!IsStore); 693 if (i + 1 == e) { 694 SOffsetRegState |= getKillRegState(Scavenged); 695 // The last implicit use carries the "Kill" flag. 696 SrcDstRegState |= getKillRegState(IsKill); 697 } 698 699 auto MIB = spillVGPRtoAGPR(ST, MI, Index, i, SubReg, IsKill); 700 701 if (!MIB.getInstr()) { 702 unsigned FinalReg = SubReg; 703 if (TmpReg != AMDGPU::NoRegister) { 704 if (IsStore) 705 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ACCVGPR_READ_B32), TmpReg) 706 .addReg(SubReg, getKillRegState(IsKill)); 707 SubReg = TmpReg; 708 } 709 710 MachinePointerInfo PInfo = BasePtrInfo.getWithOffset(EltSize * i); 711 MachineMemOperand *NewMMO 712 = MF->getMachineMemOperand(PInfo, MMO->getFlags(), 713 EltSize, MinAlign(Align, EltSize * i)); 714 715 MIB = BuildMI(*MBB, MI, DL, Desc) 716 .addReg(SubReg, getDefRegState(!IsStore) | getKillRegState(IsKill)) 717 .addReg(ScratchRsrcReg) 718 .addReg(SOffset, SOffsetRegState) 719 .addImm(Offset) 720 .addImm(0) // glc 721 .addImm(0) // slc 722 .addImm(0) // tfe 723 .addImm(0) // dlc 724 .addImm(0) // swz 725 .addMemOperand(NewMMO); 726 727 if (!IsStore && TmpReg != AMDGPU::NoRegister) 728 MIB = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ACCVGPR_WRITE_B32), 729 FinalReg) 730 .addReg(TmpReg, RegState::Kill); 731 } 732 733 if (NumSubRegs > 1) 734 MIB.addReg(ValueReg, RegState::Implicit | SrcDstRegState); 735 } 736 737 if (ScratchOffsetRegDelta != 0) { 738 // Subtract the offset we added to the ScratchOffset register. 739 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffsetReg) 740 .addReg(ScratchOffsetReg) 741 .addImm(ScratchOffsetRegDelta); 742 } 743 } 744 745 bool SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI, 746 int Index, 747 RegScavenger *RS, 748 bool OnlyToVGPR) const { 749 MachineBasicBlock *MBB = MI->getParent(); 750 MachineFunction *MF = MBB->getParent(); 751 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 752 DenseSet<unsigned> SGPRSpillVGPRDefinedSet; 753 754 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 755 = MFI->getSGPRToVGPRSpills(Index); 756 bool SpillToVGPR = !VGPRSpills.empty(); 757 if (OnlyToVGPR && !SpillToVGPR) 758 return false; 759 760 const SIInstrInfo *TII = ST.getInstrInfo(); 761 762 Register SuperReg = MI->getOperand(0).getReg(); 763 bool IsKill = MI->getOperand(0).isKill(); 764 const DebugLoc &DL = MI->getDebugLoc(); 765 766 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 767 768 assert(SpillToVGPR || (SuperReg != MFI->getStackPtrOffsetReg() && 769 SuperReg != MFI->getFrameOffsetReg() && 770 SuperReg != MFI->getScratchWaveOffsetReg())); 771 772 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 773 774 unsigned EltSize = 4; 775 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 776 777 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 778 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 779 780 // Scavenged temporary VGPR to use. It must be scavenged once for any number 781 // of spilled subregs. 782 Register TmpVGPR; 783 784 // SubReg carries the "Kill" flag when SubReg == SuperReg. 785 unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill); 786 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 787 Register SubReg = 788 NumSubRegs == 1 ? SuperReg : getSubReg(SuperReg, SplitParts[i]); 789 790 if (SpillToVGPR) { 791 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 792 793 // During SGPR spilling to VGPR, determine if the VGPR is defined. The 794 // only circumstance in which we say it is undefined is when it is the 795 // first spill to this VGPR in the first basic block. 796 bool VGPRDefined = true; 797 if (MBB == &MF->front()) 798 VGPRDefined = !SGPRSpillVGPRDefinedSet.insert(Spill.VGPR).second; 799 800 // Mark the "old value of vgpr" input undef only if this is the first sgpr 801 // spill to this specific vgpr in the first basic block. 802 BuildMI(*MBB, MI, DL, 803 TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32), 804 Spill.VGPR) 805 .addReg(SubReg, getKillRegState(IsKill)) 806 .addImm(Spill.Lane) 807 .addReg(Spill.VGPR, VGPRDefined ? 0 : RegState::Undef); 808 809 // FIXME: Since this spills to another register instead of an actual 810 // frame index, we should delete the frame index when all references to 811 // it are fixed. 812 } else { 813 // XXX - Can to VGPR spill fail for some subregisters but not others? 814 if (OnlyToVGPR) 815 return false; 816 817 // Spill SGPR to a frame index. 818 if (!TmpVGPR.isValid()) 819 TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 820 821 MachineInstrBuilder Mov 822 = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpVGPR) 823 .addReg(SubReg, SubKillState); 824 825 // There could be undef components of a spilled super register. 826 // TODO: Can we detect this and skip the spill? 827 if (NumSubRegs > 1) { 828 // The last implicit use of the SuperReg carries the "Kill" flag. 829 unsigned SuperKillState = 0; 830 if (i + 1 == e) 831 SuperKillState |= getKillRegState(IsKill); 832 Mov.addReg(SuperReg, RegState::Implicit | SuperKillState); 833 } 834 835 unsigned Align = FrameInfo.getObjectAlignment(Index); 836 MachinePointerInfo PtrInfo 837 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 838 MachineMemOperand *MMO 839 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 840 EltSize, MinAlign(Align, EltSize * i)); 841 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE)) 842 .addReg(TmpVGPR, RegState::Kill) // src 843 .addFrameIndex(Index) // vaddr 844 .addReg(MFI->getScratchRSrcReg()) // srrsrc 845 .addReg(MFI->getStackPtrOffsetReg()) // soffset 846 .addImm(i * 4) // offset 847 .addMemOperand(MMO); 848 } 849 } 850 851 MI->eraseFromParent(); 852 MFI->addToSpilledSGPRs(NumSubRegs); 853 return true; 854 } 855 856 bool SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI, 857 int Index, 858 RegScavenger *RS, 859 bool OnlyToVGPR) const { 860 MachineFunction *MF = MI->getParent()->getParent(); 861 MachineBasicBlock *MBB = MI->getParent(); 862 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 863 864 ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills 865 = MFI->getSGPRToVGPRSpills(Index); 866 bool SpillToVGPR = !VGPRSpills.empty(); 867 if (OnlyToVGPR && !SpillToVGPR) 868 return false; 869 870 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 871 const SIInstrInfo *TII = ST.getInstrInfo(); 872 const DebugLoc &DL = MI->getDebugLoc(); 873 874 Register SuperReg = MI->getOperand(0).getReg(); 875 876 assert(SuperReg != AMDGPU::M0 && "m0 should never spill"); 877 878 unsigned EltSize = 4; 879 880 const TargetRegisterClass *RC = getPhysRegClass(SuperReg); 881 882 ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize); 883 unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size(); 884 885 Register TmpVGPR; 886 887 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 888 Register SubReg = 889 NumSubRegs == 1 ? SuperReg : getSubReg(SuperReg, SplitParts[i]); 890 891 if (SpillToVGPR) { 892 SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i]; 893 auto MIB = 894 BuildMI(*MBB, MI, DL, TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), 895 SubReg) 896 .addReg(Spill.VGPR) 897 .addImm(Spill.Lane); 898 899 if (NumSubRegs > 1 && i == 0) 900 MIB.addReg(SuperReg, RegState::ImplicitDefine); 901 } else { 902 if (OnlyToVGPR) 903 return false; 904 905 // Restore SGPR from a stack slot. 906 // FIXME: We should use S_LOAD_DWORD here for VI. 907 if (!TmpVGPR.isValid()) 908 TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 909 unsigned Align = FrameInfo.getObjectAlignment(Index); 910 911 MachinePointerInfo PtrInfo 912 = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i); 913 914 MachineMemOperand *MMO = MF->getMachineMemOperand(PtrInfo, 915 MachineMemOperand::MOLoad, EltSize, 916 MinAlign(Align, EltSize * i)); 917 918 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpVGPR) 919 .addFrameIndex(Index) // vaddr 920 .addReg(MFI->getScratchRSrcReg()) // srsrc 921 .addReg(MFI->getStackPtrOffsetReg()) // soffset 922 .addImm(i * 4) // offset 923 .addMemOperand(MMO); 924 925 auto MIB = 926 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg) 927 .addReg(TmpVGPR, RegState::Kill); 928 929 if (NumSubRegs > 1) 930 MIB.addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 931 } 932 } 933 934 MI->eraseFromParent(); 935 return true; 936 } 937 938 /// Special case of eliminateFrameIndex. Returns true if the SGPR was spilled to 939 /// a VGPR and the stack slot can be safely eliminated when all other users are 940 /// handled. 941 bool SIRegisterInfo::eliminateSGPRToVGPRSpillFrameIndex( 942 MachineBasicBlock::iterator MI, 943 int FI, 944 RegScavenger *RS) const { 945 switch (MI->getOpcode()) { 946 case AMDGPU::SI_SPILL_S1024_SAVE: 947 case AMDGPU::SI_SPILL_S512_SAVE: 948 case AMDGPU::SI_SPILL_S256_SAVE: 949 case AMDGPU::SI_SPILL_S160_SAVE: 950 case AMDGPU::SI_SPILL_S128_SAVE: 951 case AMDGPU::SI_SPILL_S96_SAVE: 952 case AMDGPU::SI_SPILL_S64_SAVE: 953 case AMDGPU::SI_SPILL_S32_SAVE: 954 return spillSGPR(MI, FI, RS, true); 955 case AMDGPU::SI_SPILL_S1024_RESTORE: 956 case AMDGPU::SI_SPILL_S512_RESTORE: 957 case AMDGPU::SI_SPILL_S256_RESTORE: 958 case AMDGPU::SI_SPILL_S160_RESTORE: 959 case AMDGPU::SI_SPILL_S128_RESTORE: 960 case AMDGPU::SI_SPILL_S96_RESTORE: 961 case AMDGPU::SI_SPILL_S64_RESTORE: 962 case AMDGPU::SI_SPILL_S32_RESTORE: 963 return restoreSGPR(MI, FI, RS, true); 964 default: 965 llvm_unreachable("not an SGPR spill instruction"); 966 } 967 } 968 969 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, 970 int SPAdj, unsigned FIOperandNum, 971 RegScavenger *RS) const { 972 MachineFunction *MF = MI->getParent()->getParent(); 973 MachineBasicBlock *MBB = MI->getParent(); 974 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 975 MachineFrameInfo &FrameInfo = MF->getFrameInfo(); 976 const SIInstrInfo *TII = ST.getInstrInfo(); 977 DebugLoc DL = MI->getDebugLoc(); 978 979 assert(SPAdj == 0 && "unhandled SP adjustment in call sequence?"); 980 981 MachineOperand &FIOp = MI->getOperand(FIOperandNum); 982 int Index = MI->getOperand(FIOperandNum).getIndex(); 983 984 Register FrameReg = getFrameRegister(*MF); 985 986 switch (MI->getOpcode()) { 987 // SGPR register spill 988 case AMDGPU::SI_SPILL_S1024_SAVE: 989 case AMDGPU::SI_SPILL_S512_SAVE: 990 case AMDGPU::SI_SPILL_S256_SAVE: 991 case AMDGPU::SI_SPILL_S160_SAVE: 992 case AMDGPU::SI_SPILL_S128_SAVE: 993 case AMDGPU::SI_SPILL_S96_SAVE: 994 case AMDGPU::SI_SPILL_S64_SAVE: 995 case AMDGPU::SI_SPILL_S32_SAVE: { 996 spillSGPR(MI, Index, RS); 997 break; 998 } 999 1000 // SGPR register restore 1001 case AMDGPU::SI_SPILL_S1024_RESTORE: 1002 case AMDGPU::SI_SPILL_S512_RESTORE: 1003 case AMDGPU::SI_SPILL_S256_RESTORE: 1004 case AMDGPU::SI_SPILL_S160_RESTORE: 1005 case AMDGPU::SI_SPILL_S128_RESTORE: 1006 case AMDGPU::SI_SPILL_S96_RESTORE: 1007 case AMDGPU::SI_SPILL_S64_RESTORE: 1008 case AMDGPU::SI_SPILL_S32_RESTORE: { 1009 restoreSGPR(MI, Index, RS); 1010 break; 1011 } 1012 1013 // VGPR register spill 1014 case AMDGPU::SI_SPILL_V1024_SAVE: 1015 case AMDGPU::SI_SPILL_V512_SAVE: 1016 case AMDGPU::SI_SPILL_V256_SAVE: 1017 case AMDGPU::SI_SPILL_V160_SAVE: 1018 case AMDGPU::SI_SPILL_V128_SAVE: 1019 case AMDGPU::SI_SPILL_V96_SAVE: 1020 case AMDGPU::SI_SPILL_V64_SAVE: 1021 case AMDGPU::SI_SPILL_V32_SAVE: 1022 case AMDGPU::SI_SPILL_A1024_SAVE: 1023 case AMDGPU::SI_SPILL_A512_SAVE: 1024 case AMDGPU::SI_SPILL_A128_SAVE: 1025 case AMDGPU::SI_SPILL_A64_SAVE: 1026 case AMDGPU::SI_SPILL_A32_SAVE: { 1027 const MachineOperand *VData = TII->getNamedOperand(*MI, 1028 AMDGPU::OpName::vdata); 1029 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() == 1030 MFI->getStackPtrOffsetReg()); 1031 1032 buildSpillLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET, 1033 Index, 1034 VData->getReg(), VData->isKill(), 1035 TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(), 1036 FrameReg, 1037 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1038 *MI->memoperands_begin(), 1039 RS); 1040 MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode())); 1041 MI->eraseFromParent(); 1042 break; 1043 } 1044 case AMDGPU::SI_SPILL_V32_RESTORE: 1045 case AMDGPU::SI_SPILL_V64_RESTORE: 1046 case AMDGPU::SI_SPILL_V96_RESTORE: 1047 case AMDGPU::SI_SPILL_V128_RESTORE: 1048 case AMDGPU::SI_SPILL_V160_RESTORE: 1049 case AMDGPU::SI_SPILL_V256_RESTORE: 1050 case AMDGPU::SI_SPILL_V512_RESTORE: 1051 case AMDGPU::SI_SPILL_V1024_RESTORE: 1052 case AMDGPU::SI_SPILL_A32_RESTORE: 1053 case AMDGPU::SI_SPILL_A64_RESTORE: 1054 case AMDGPU::SI_SPILL_A128_RESTORE: 1055 case AMDGPU::SI_SPILL_A512_RESTORE: 1056 case AMDGPU::SI_SPILL_A1024_RESTORE: { 1057 const MachineOperand *VData = TII->getNamedOperand(*MI, 1058 AMDGPU::OpName::vdata); 1059 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() == 1060 MFI->getStackPtrOffsetReg()); 1061 1062 buildSpillLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET, 1063 Index, 1064 VData->getReg(), VData->isKill(), 1065 TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(), 1066 FrameReg, 1067 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), 1068 *MI->memoperands_begin(), 1069 RS); 1070 MI->eraseFromParent(); 1071 break; 1072 } 1073 1074 default: { 1075 const DebugLoc &DL = MI->getDebugLoc(); 1076 bool IsMUBUF = TII->isMUBUF(*MI); 1077 1078 if (!IsMUBUF && !MFI->isEntryFunction()) { 1079 // Convert to an absolute stack address by finding the offset from the 1080 // scratch wave base and scaling by the wave size. 1081 // 1082 // In an entry function/kernel the offset is already the absolute 1083 // address relative to the frame register. 1084 1085 Register TmpDiffReg = 1086 RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, false); 1087 1088 // If there's no free SGPR, in-place modify the FP 1089 Register DiffReg = TmpDiffReg.isValid() ? TmpDiffReg : FrameReg; 1090 1091 bool IsCopy = MI->getOpcode() == AMDGPU::V_MOV_B32_e32; 1092 Register ResultReg = IsCopy ? 1093 MI->getOperand(0).getReg() : 1094 RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1095 1096 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), DiffReg) 1097 .addReg(FrameReg) 1098 .addReg(MFI->getScratchWaveOffsetReg()); 1099 1100 int64_t Offset = FrameInfo.getObjectOffset(Index); 1101 if (Offset == 0) { 1102 // XXX - This never happens because of emergency scavenging slot at 0? 1103 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ResultReg) 1104 .addImm(ST.getWavefrontSizeLog2()) 1105 .addReg(DiffReg); 1106 } else { 1107 if (auto MIB = TII->getAddNoCarry(*MBB, MI, DL, ResultReg, *RS)) { 1108 Register ScaledReg = 1109 RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MIB, 0); 1110 1111 BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), 1112 ScaledReg) 1113 .addImm(ST.getWavefrontSizeLog2()) 1114 .addReg(DiffReg, RegState::Kill); 1115 1116 const bool IsVOP2 = MIB->getOpcode() == AMDGPU::V_ADD_U32_e32; 1117 1118 // TODO: Fold if use instruction is another add of a constant. 1119 if (IsVOP2 || AMDGPU::isInlinableLiteral32(Offset, ST.hasInv2PiInlineImm())) { 1120 // FIXME: This can fail 1121 MIB.addImm(Offset); 1122 MIB.addReg(ScaledReg, RegState::Kill); 1123 if (!IsVOP2) 1124 MIB.addImm(0); // clamp bit 1125 } else { 1126 Register ConstOffsetReg = 1127 RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MIB, 0, false); 1128 1129 // This should always be able to use the unused carry out. 1130 assert(ConstOffsetReg && "this scavenge should not be able to fail"); 1131 1132 BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::S_MOV_B32), ConstOffsetReg) 1133 .addImm(Offset); 1134 MIB.addReg(ConstOffsetReg, RegState::Kill); 1135 MIB.addReg(ScaledReg, RegState::Kill); 1136 MIB.addImm(0); // clamp bit 1137 } 1138 } else { 1139 // We have to produce a carry out, and we there isn't a free SGPR 1140 // pair for it. We can keep the whole computation on the SALU to 1141 // avoid clobbering an additional register at the cost of an extra 1142 // mov. 1143 1144 // We may have 1 free scratch SGPR even though a carry out is 1145 // unavailable. Only one additional mov is needed. 1146 Register TmpScaledReg = 1147 RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, false); 1148 Register ScaledReg = TmpScaledReg.isValid() ? TmpScaledReg : DiffReg; 1149 1150 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHR_B32), ScaledReg) 1151 .addReg(DiffReg, RegState::Kill) 1152 .addImm(ST.getWavefrontSizeLog2()); 1153 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), ScaledReg) 1154 .addReg(ScaledReg, RegState::Kill) 1155 .addImm(Offset); 1156 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), ResultReg) 1157 .addReg(ScaledReg, RegState::Kill); 1158 1159 // If there were truly no free SGPRs, we need to undo everything. 1160 if (!TmpScaledReg.isValid()) { 1161 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScaledReg) 1162 .addReg(ScaledReg, RegState::Kill) 1163 .addImm(Offset); 1164 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHL_B32), ScaledReg) 1165 .addReg(DiffReg, RegState::Kill) 1166 .addImm(ST.getWavefrontSizeLog2()); 1167 } 1168 } 1169 } 1170 1171 if (!TmpDiffReg.isValid()) { 1172 // Restore the FP. 1173 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), FrameReg) 1174 .addReg(FrameReg) 1175 .addReg(MFI->getScratchWaveOffsetReg()); 1176 } 1177 1178 // Don't introduce an extra copy if we're just materializing in a mov. 1179 if (IsCopy) 1180 MI->eraseFromParent(); 1181 else 1182 FIOp.ChangeToRegister(ResultReg, false, false, true); 1183 return; 1184 } 1185 1186 if (IsMUBUF) { 1187 // Disable offen so we don't need a 0 vgpr base. 1188 assert(static_cast<int>(FIOperandNum) == 1189 AMDGPU::getNamedOperandIdx(MI->getOpcode(), 1190 AMDGPU::OpName::vaddr)); 1191 1192 assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() == 1193 MFI->getStackPtrOffsetReg()); 1194 1195 TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->setReg(FrameReg); 1196 1197 int64_t Offset = FrameInfo.getObjectOffset(Index); 1198 int64_t OldImm 1199 = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(); 1200 int64_t NewOffset = OldImm + Offset; 1201 1202 if (isUInt<12>(NewOffset) && 1203 buildMUBUFOffsetLoadStore(ST, FrameInfo, MI, Index, NewOffset)) { 1204 MI->eraseFromParent(); 1205 return; 1206 } 1207 } 1208 1209 // If the offset is simply too big, don't convert to a scratch wave offset 1210 // relative index. 1211 1212 int64_t Offset = FrameInfo.getObjectOffset(Index); 1213 FIOp.ChangeToImmediate(Offset); 1214 if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) { 1215 Register TmpReg = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0); 1216 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 1217 .addImm(Offset); 1218 FIOp.ChangeToRegister(TmpReg, false, false, true); 1219 } 1220 } 1221 } 1222 } 1223 1224 StringRef SIRegisterInfo::getRegAsmName(unsigned Reg) const { 1225 return AMDGPUInstPrinter::getRegisterName(Reg); 1226 } 1227 1228 // FIXME: This is very slow. It might be worth creating a map from physreg to 1229 // register class. 1230 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const { 1231 assert(!Register::isVirtualRegister(Reg)); 1232 1233 static const TargetRegisterClass *const BaseClasses[] = { 1234 &AMDGPU::VGPR_32RegClass, 1235 &AMDGPU::SReg_32RegClass, 1236 &AMDGPU::AGPR_32RegClass, 1237 &AMDGPU::VReg_64RegClass, 1238 &AMDGPU::SReg_64RegClass, 1239 &AMDGPU::AReg_64RegClass, 1240 &AMDGPU::VReg_96RegClass, 1241 &AMDGPU::SReg_96RegClass, 1242 &AMDGPU::VReg_128RegClass, 1243 &AMDGPU::SReg_128RegClass, 1244 &AMDGPU::AReg_128RegClass, 1245 &AMDGPU::VReg_160RegClass, 1246 &AMDGPU::SReg_160RegClass, 1247 &AMDGPU::VReg_256RegClass, 1248 &AMDGPU::SReg_256RegClass, 1249 &AMDGPU::VReg_512RegClass, 1250 &AMDGPU::SReg_512RegClass, 1251 &AMDGPU::AReg_512RegClass, 1252 &AMDGPU::SReg_1024RegClass, 1253 &AMDGPU::VReg_1024RegClass, 1254 &AMDGPU::AReg_1024RegClass, 1255 &AMDGPU::SCC_CLASSRegClass, 1256 &AMDGPU::Pseudo_SReg_32RegClass, 1257 &AMDGPU::Pseudo_SReg_128RegClass, 1258 }; 1259 1260 for (const TargetRegisterClass *BaseClass : BaseClasses) { 1261 if (BaseClass->contains(Reg)) { 1262 return BaseClass; 1263 } 1264 } 1265 return nullptr; 1266 } 1267 1268 // TODO: It might be helpful to have some target specific flags in 1269 // TargetRegisterClass to mark which classes are VGPRs to make this trivial. 1270 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const { 1271 unsigned Size = getRegSizeInBits(*RC); 1272 switch (Size) { 1273 case 32: 1274 return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr; 1275 case 64: 1276 return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr; 1277 case 96: 1278 return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr; 1279 case 128: 1280 return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr; 1281 case 160: 1282 return getCommonSubClass(&AMDGPU::VReg_160RegClass, RC) != nullptr; 1283 case 256: 1284 return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr; 1285 case 512: 1286 return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr; 1287 case 1024: 1288 return getCommonSubClass(&AMDGPU::VReg_1024RegClass, RC) != nullptr; 1289 case 1: 1290 return getCommonSubClass(&AMDGPU::VReg_1RegClass, RC) != nullptr; 1291 default: 1292 assert(Size < 32 && "Invalid register class size"); 1293 return false; 1294 } 1295 } 1296 1297 bool SIRegisterInfo::hasAGPRs(const TargetRegisterClass *RC) const { 1298 unsigned Size = getRegSizeInBits(*RC); 1299 if (Size < 32) 1300 return false; 1301 switch (Size) { 1302 case 32: 1303 return getCommonSubClass(&AMDGPU::AGPR_32RegClass, RC) != nullptr; 1304 case 64: 1305 return getCommonSubClass(&AMDGPU::AReg_64RegClass, RC) != nullptr; 1306 case 96: 1307 return false; 1308 case 128: 1309 return getCommonSubClass(&AMDGPU::AReg_128RegClass, RC) != nullptr; 1310 case 160: 1311 case 256: 1312 return false; 1313 case 512: 1314 return getCommonSubClass(&AMDGPU::AReg_512RegClass, RC) != nullptr; 1315 case 1024: 1316 return getCommonSubClass(&AMDGPU::AReg_1024RegClass, RC) != nullptr; 1317 default: 1318 llvm_unreachable("Invalid register class size"); 1319 } 1320 } 1321 1322 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass( 1323 const TargetRegisterClass *SRC) const { 1324 switch (getRegSizeInBits(*SRC)) { 1325 case 32: 1326 return &AMDGPU::VGPR_32RegClass; 1327 case 64: 1328 return &AMDGPU::VReg_64RegClass; 1329 case 96: 1330 return &AMDGPU::VReg_96RegClass; 1331 case 128: 1332 return &AMDGPU::VReg_128RegClass; 1333 case 160: 1334 return &AMDGPU::VReg_160RegClass; 1335 case 256: 1336 return &AMDGPU::VReg_256RegClass; 1337 case 512: 1338 return &AMDGPU::VReg_512RegClass; 1339 case 1024: 1340 return &AMDGPU::VReg_1024RegClass; 1341 case 1: 1342 return &AMDGPU::VReg_1RegClass; 1343 default: 1344 llvm_unreachable("Invalid register class size"); 1345 } 1346 } 1347 1348 const TargetRegisterClass *SIRegisterInfo::getEquivalentAGPRClass( 1349 const TargetRegisterClass *SRC) const { 1350 switch (getRegSizeInBits(*SRC)) { 1351 case 32: 1352 return &AMDGPU::AGPR_32RegClass; 1353 case 64: 1354 return &AMDGPU::AReg_64RegClass; 1355 case 128: 1356 return &AMDGPU::AReg_128RegClass; 1357 case 512: 1358 return &AMDGPU::AReg_512RegClass; 1359 case 1024: 1360 return &AMDGPU::AReg_1024RegClass; 1361 default: 1362 llvm_unreachable("Invalid register class size"); 1363 } 1364 } 1365 1366 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass( 1367 const TargetRegisterClass *VRC) const { 1368 switch (getRegSizeInBits(*VRC)) { 1369 case 32: 1370 return &AMDGPU::SGPR_32RegClass; 1371 case 64: 1372 return &AMDGPU::SReg_64RegClass; 1373 case 96: 1374 return &AMDGPU::SReg_96RegClass; 1375 case 128: 1376 return &AMDGPU::SGPR_128RegClass; 1377 case 160: 1378 return &AMDGPU::SReg_160RegClass; 1379 case 256: 1380 return &AMDGPU::SReg_256RegClass; 1381 case 512: 1382 return &AMDGPU::SReg_512RegClass; 1383 case 1024: 1384 return &AMDGPU::SReg_1024RegClass; 1385 default: 1386 llvm_unreachable("Invalid register class size"); 1387 } 1388 } 1389 1390 const TargetRegisterClass *SIRegisterInfo::getSubRegClass( 1391 const TargetRegisterClass *RC, unsigned SubIdx) const { 1392 if (SubIdx == AMDGPU::NoSubRegister) 1393 return RC; 1394 1395 // We can assume that each lane corresponds to one 32-bit register. 1396 unsigned Count = getSubRegIndexLaneMask(SubIdx).getNumLanes(); 1397 if (isSGPRClass(RC)) { 1398 switch (Count) { 1399 case 1: 1400 return &AMDGPU::SGPR_32RegClass; 1401 case 2: 1402 return &AMDGPU::SReg_64RegClass; 1403 case 3: 1404 return &AMDGPU::SReg_96RegClass; 1405 case 4: 1406 return &AMDGPU::SGPR_128RegClass; 1407 case 5: 1408 return &AMDGPU::SReg_160RegClass; 1409 case 8: 1410 return &AMDGPU::SReg_256RegClass; 1411 case 16: 1412 return &AMDGPU::SReg_512RegClass; 1413 case 32: /* fall-through */ 1414 default: 1415 llvm_unreachable("Invalid sub-register class size"); 1416 } 1417 } else if (hasAGPRs(RC)) { 1418 switch (Count) { 1419 case 1: 1420 return &AMDGPU::AGPR_32RegClass; 1421 case 2: 1422 return &AMDGPU::AReg_64RegClass; 1423 case 4: 1424 return &AMDGPU::AReg_128RegClass; 1425 case 16: 1426 return &AMDGPU::AReg_512RegClass; 1427 case 32: /* fall-through */ 1428 default: 1429 llvm_unreachable("Invalid sub-register class size"); 1430 } 1431 } else { 1432 switch (Count) { 1433 case 1: 1434 return &AMDGPU::VGPR_32RegClass; 1435 case 2: 1436 return &AMDGPU::VReg_64RegClass; 1437 case 3: 1438 return &AMDGPU::VReg_96RegClass; 1439 case 4: 1440 return &AMDGPU::VReg_128RegClass; 1441 case 5: 1442 return &AMDGPU::VReg_160RegClass; 1443 case 8: 1444 return &AMDGPU::VReg_256RegClass; 1445 case 16: 1446 return &AMDGPU::VReg_512RegClass; 1447 case 32: /* fall-through */ 1448 default: 1449 llvm_unreachable("Invalid sub-register class size"); 1450 } 1451 } 1452 } 1453 1454 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const { 1455 if (OpType >= AMDGPU::OPERAND_REG_INLINE_AC_FIRST && 1456 OpType <= AMDGPU::OPERAND_REG_INLINE_AC_LAST) 1457 return !ST.hasMFMAInlineLiteralBug(); 1458 1459 return OpType >= AMDGPU::OPERAND_SRC_FIRST && 1460 OpType <= AMDGPU::OPERAND_SRC_LAST; 1461 } 1462 1463 bool SIRegisterInfo::shouldRewriteCopySrc( 1464 const TargetRegisterClass *DefRC, 1465 unsigned DefSubReg, 1466 const TargetRegisterClass *SrcRC, 1467 unsigned SrcSubReg) const { 1468 // We want to prefer the smallest register class possible, so we don't want to 1469 // stop and rewrite on anything that looks like a subregister 1470 // extract. Operations mostly don't care about the super register class, so we 1471 // only want to stop on the most basic of copies between the same register 1472 // class. 1473 // 1474 // e.g. if we have something like 1475 // %0 = ... 1476 // %1 = ... 1477 // %2 = REG_SEQUENCE %0, sub0, %1, sub1, %2, sub2 1478 // %3 = COPY %2, sub0 1479 // 1480 // We want to look through the COPY to find: 1481 // => %3 = COPY %0 1482 1483 // Plain copy. 1484 return getCommonSubClass(DefRC, SrcRC) != nullptr; 1485 } 1486 1487 /// Returns a register that is not used at any point in the function. 1488 /// If all registers are used, then this function will return 1489 // AMDGPU::NoRegister. 1490 unsigned 1491 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI, 1492 const TargetRegisterClass *RC, 1493 const MachineFunction &MF) const { 1494 1495 for (unsigned Reg : *RC) 1496 if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg)) 1497 return Reg; 1498 return AMDGPU::NoRegister; 1499 } 1500 1501 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC, 1502 unsigned EltSize) const { 1503 if (EltSize == 4) { 1504 static const int16_t Sub0_31[] = { 1505 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1506 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7, 1507 AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11, 1508 AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15, 1509 AMDGPU::sub16, AMDGPU::sub17, AMDGPU::sub18, AMDGPU::sub19, 1510 AMDGPU::sub20, AMDGPU::sub21, AMDGPU::sub22, AMDGPU::sub23, 1511 AMDGPU::sub24, AMDGPU::sub25, AMDGPU::sub26, AMDGPU::sub27, 1512 AMDGPU::sub28, AMDGPU::sub29, AMDGPU::sub30, AMDGPU::sub31, 1513 }; 1514 1515 static const int16_t Sub0_15[] = { 1516 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1517 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7, 1518 AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11, 1519 AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15, 1520 }; 1521 1522 static const int16_t Sub0_7[] = { 1523 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1524 AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7, 1525 }; 1526 1527 static const int16_t Sub0_4[] = { 1528 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, AMDGPU::sub4, 1529 }; 1530 1531 static const int16_t Sub0_3[] = { 1532 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, 1533 }; 1534 1535 static const int16_t Sub0_2[] = { 1536 AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, 1537 }; 1538 1539 static const int16_t Sub0_1[] = { 1540 AMDGPU::sub0, AMDGPU::sub1, 1541 }; 1542 1543 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1544 case 32: 1545 return {}; 1546 case 64: 1547 return makeArrayRef(Sub0_1); 1548 case 96: 1549 return makeArrayRef(Sub0_2); 1550 case 128: 1551 return makeArrayRef(Sub0_3); 1552 case 160: 1553 return makeArrayRef(Sub0_4); 1554 case 256: 1555 return makeArrayRef(Sub0_7); 1556 case 512: 1557 return makeArrayRef(Sub0_15); 1558 case 1024: 1559 return makeArrayRef(Sub0_31); 1560 default: 1561 llvm_unreachable("unhandled register size"); 1562 } 1563 } 1564 1565 if (EltSize == 8) { 1566 static const int16_t Sub0_31_64[] = { 1567 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3, 1568 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7, 1569 AMDGPU::sub8_sub9, AMDGPU::sub10_sub11, 1570 AMDGPU::sub12_sub13, AMDGPU::sub14_sub15, 1571 AMDGPU::sub16_sub17, AMDGPU::sub18_sub19, 1572 AMDGPU::sub20_sub21, AMDGPU::sub22_sub23, 1573 AMDGPU::sub24_sub25, AMDGPU::sub26_sub27, 1574 AMDGPU::sub28_sub29, AMDGPU::sub30_sub31 1575 }; 1576 1577 static const int16_t Sub0_15_64[] = { 1578 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3, 1579 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7, 1580 AMDGPU::sub8_sub9, AMDGPU::sub10_sub11, 1581 AMDGPU::sub12_sub13, AMDGPU::sub14_sub15 1582 }; 1583 1584 static const int16_t Sub0_7_64[] = { 1585 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3, 1586 AMDGPU::sub4_sub5, AMDGPU::sub6_sub7 1587 }; 1588 1589 1590 static const int16_t Sub0_3_64[] = { 1591 AMDGPU::sub0_sub1, AMDGPU::sub2_sub3 1592 }; 1593 1594 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1595 case 64: 1596 return {}; 1597 case 128: 1598 return makeArrayRef(Sub0_3_64); 1599 case 256: 1600 return makeArrayRef(Sub0_7_64); 1601 case 512: 1602 return makeArrayRef(Sub0_15_64); 1603 case 1024: 1604 return makeArrayRef(Sub0_31_64); 1605 default: 1606 llvm_unreachable("unhandled register size"); 1607 } 1608 } 1609 1610 if (EltSize == 16) { 1611 1612 static const int16_t Sub0_31_128[] = { 1613 AMDGPU::sub0_sub1_sub2_sub3, 1614 AMDGPU::sub4_sub5_sub6_sub7, 1615 AMDGPU::sub8_sub9_sub10_sub11, 1616 AMDGPU::sub12_sub13_sub14_sub15, 1617 AMDGPU::sub16_sub17_sub18_sub19, 1618 AMDGPU::sub20_sub21_sub22_sub23, 1619 AMDGPU::sub24_sub25_sub26_sub27, 1620 AMDGPU::sub28_sub29_sub30_sub31 1621 }; 1622 1623 static const int16_t Sub0_15_128[] = { 1624 AMDGPU::sub0_sub1_sub2_sub3, 1625 AMDGPU::sub4_sub5_sub6_sub7, 1626 AMDGPU::sub8_sub9_sub10_sub11, 1627 AMDGPU::sub12_sub13_sub14_sub15 1628 }; 1629 1630 static const int16_t Sub0_7_128[] = { 1631 AMDGPU::sub0_sub1_sub2_sub3, 1632 AMDGPU::sub4_sub5_sub6_sub7 1633 }; 1634 1635 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1636 case 128: 1637 return {}; 1638 case 256: 1639 return makeArrayRef(Sub0_7_128); 1640 case 512: 1641 return makeArrayRef(Sub0_15_128); 1642 case 1024: 1643 return makeArrayRef(Sub0_31_128); 1644 default: 1645 llvm_unreachable("unhandled register size"); 1646 } 1647 } 1648 1649 assert(EltSize == 32 && "unhandled elt size"); 1650 1651 static const int16_t Sub0_31_256[] = { 1652 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7, 1653 AMDGPU::sub8_sub9_sub10_sub11_sub12_sub13_sub14_sub15, 1654 AMDGPU::sub16_sub17_sub18_sub19_sub20_sub21_sub22_sub23, 1655 AMDGPU::sub24_sub25_sub26_sub27_sub28_sub29_sub30_sub31 1656 }; 1657 1658 static const int16_t Sub0_15_256[] = { 1659 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7, 1660 AMDGPU::sub8_sub9_sub10_sub11_sub12_sub13_sub14_sub15 1661 }; 1662 1663 switch (AMDGPU::getRegBitWidth(*RC->MC)) { 1664 case 256: 1665 return {}; 1666 case 512: 1667 return makeArrayRef(Sub0_15_256); 1668 case 1024: 1669 return makeArrayRef(Sub0_31_256); 1670 default: 1671 llvm_unreachable("unhandled register size"); 1672 } 1673 } 1674 1675 const TargetRegisterClass* 1676 SIRegisterInfo::getRegClassForReg(const MachineRegisterInfo &MRI, 1677 unsigned Reg) const { 1678 if (Register::isVirtualRegister(Reg)) 1679 return MRI.getRegClass(Reg); 1680 1681 return getPhysRegClass(Reg); 1682 } 1683 1684 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI, 1685 unsigned Reg) const { 1686 const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg); 1687 assert(RC && "Register class for the reg not found"); 1688 return hasVGPRs(RC); 1689 } 1690 1691 bool SIRegisterInfo::isAGPR(const MachineRegisterInfo &MRI, 1692 unsigned Reg) const { 1693 const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg); 1694 assert(RC && "Register class for the reg not found"); 1695 return hasAGPRs(RC); 1696 } 1697 1698 bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI, 1699 const TargetRegisterClass *SrcRC, 1700 unsigned SubReg, 1701 const TargetRegisterClass *DstRC, 1702 unsigned DstSubReg, 1703 const TargetRegisterClass *NewRC, 1704 LiveIntervals &LIS) const { 1705 unsigned SrcSize = getRegSizeInBits(*SrcRC); 1706 unsigned DstSize = getRegSizeInBits(*DstRC); 1707 unsigned NewSize = getRegSizeInBits(*NewRC); 1708 1709 // Do not increase size of registers beyond dword, we would need to allocate 1710 // adjacent registers and constraint regalloc more than needed. 1711 1712 // Always allow dword coalescing. 1713 if (SrcSize <= 32 || DstSize <= 32) 1714 return true; 1715 1716 return NewSize <= DstSize || NewSize <= SrcSize; 1717 } 1718 1719 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, 1720 MachineFunction &MF) const { 1721 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 1722 1723 unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(), 1724 MF.getFunction()); 1725 switch (RC->getID()) { 1726 default: 1727 return AMDGPURegisterInfo::getRegPressureLimit(RC, MF); 1728 case AMDGPU::VGPR_32RegClassID: 1729 return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF)); 1730 case AMDGPU::SGPR_32RegClassID: 1731 return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF)); 1732 } 1733 } 1734 1735 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF, 1736 unsigned Idx) const { 1737 if (Idx == getVGPRPressureSet() || Idx == getAGPRPressureSet()) 1738 return getRegPressureLimit(&AMDGPU::VGPR_32RegClass, 1739 const_cast<MachineFunction &>(MF)); 1740 1741 if (Idx == getSGPRPressureSet()) 1742 return getRegPressureLimit(&AMDGPU::SGPR_32RegClass, 1743 const_cast<MachineFunction &>(MF)); 1744 1745 return AMDGPURegisterInfo::getRegPressureSetLimit(MF, Idx); 1746 } 1747 1748 const int *SIRegisterInfo::getRegUnitPressureSets(unsigned RegUnit) const { 1749 static const int Empty[] = { -1 }; 1750 1751 if (hasRegUnit(AMDGPU::M0, RegUnit)) 1752 return Empty; 1753 return AMDGPURegisterInfo::getRegUnitPressureSets(RegUnit); 1754 } 1755 1756 unsigned SIRegisterInfo::getReturnAddressReg(const MachineFunction &MF) const { 1757 // Not a callee saved register. 1758 return AMDGPU::SGPR30_SGPR31; 1759 } 1760 1761 const TargetRegisterClass * 1762 SIRegisterInfo::getRegClassForSizeOnBank(unsigned Size, 1763 const RegisterBank &RB, 1764 const MachineRegisterInfo &MRI) const { 1765 switch (Size) { 1766 case 1: { 1767 switch (RB.getID()) { 1768 case AMDGPU::VGPRRegBankID: 1769 return &AMDGPU::VGPR_32RegClass; 1770 case AMDGPU::VCCRegBankID: 1771 return isWave32 ? 1772 &AMDGPU::SReg_32_XM0_XEXECRegClass : &AMDGPU::SReg_64_XEXECRegClass; 1773 case AMDGPU::SGPRRegBankID: 1774 return &AMDGPU::SReg_32RegClass; 1775 case AMDGPU::SCCRegBankID: 1776 // This needs to return an allocatable class, so don't bother returning 1777 // the dummy SCC class. 1778 // 1779 // FIXME: This is a grotesque hack. We use SGPR_32 as an indication this 1780 // was not an VCC bank value since we use the larger class SReg_32 for 1781 // other values. These should all use SReg_32. 1782 return &AMDGPU::SGPR_32RegClass; 1783 default: 1784 llvm_unreachable("unknown register bank"); 1785 } 1786 } 1787 case 32: 1788 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass : 1789 &AMDGPU::SReg_32RegClass; 1790 case 64: 1791 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_64RegClass : 1792 &AMDGPU::SReg_64_XEXECRegClass; 1793 case 96: 1794 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_96RegClass : 1795 &AMDGPU::SReg_96RegClass; 1796 case 128: 1797 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_128RegClass : 1798 &AMDGPU::SGPR_128RegClass; 1799 case 160: 1800 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_160RegClass : 1801 &AMDGPU::SReg_160RegClass; 1802 case 256: 1803 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_256RegClass : 1804 &AMDGPU::SReg_256RegClass; 1805 case 512: 1806 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_512RegClass : 1807 &AMDGPU::SReg_512RegClass; 1808 case 1024: 1809 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_1024RegClass : 1810 &AMDGPU::SReg_1024RegClass; 1811 default: 1812 if (Size < 32) 1813 return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass : 1814 &AMDGPU::SReg_32RegClass; 1815 return nullptr; 1816 } 1817 } 1818 1819 const TargetRegisterClass * 1820 SIRegisterInfo::getConstrainedRegClassForOperand(const MachineOperand &MO, 1821 const MachineRegisterInfo &MRI) const { 1822 const RegClassOrRegBank &RCOrRB = MRI.getRegClassOrRegBank(MO.getReg()); 1823 if (const RegisterBank *RB = RCOrRB.dyn_cast<const RegisterBank*>()) 1824 return getRegClassForTypeOnBank(MRI.getType(MO.getReg()), *RB, MRI); 1825 1826 const TargetRegisterClass *RC = RCOrRB.get<const TargetRegisterClass*>(); 1827 return getAllocatableClass(RC); 1828 } 1829 1830 unsigned SIRegisterInfo::getVCC() const { 1831 return isWave32 ? AMDGPU::VCC_LO : AMDGPU::VCC; 1832 } 1833 1834 const TargetRegisterClass * 1835 SIRegisterInfo::getRegClass(unsigned RCID) const { 1836 switch ((int)RCID) { 1837 case AMDGPU::SReg_1RegClassID: 1838 return getBoolRC(); 1839 case AMDGPU::SReg_1_XEXECRegClassID: 1840 return isWave32 ? &AMDGPU::SReg_32_XM0_XEXECRegClass 1841 : &AMDGPU::SReg_64_XEXECRegClass; 1842 case -1: 1843 return nullptr; 1844 default: 1845 return AMDGPURegisterInfo::getRegClass(RCID); 1846 } 1847 } 1848 1849 // Find reaching register definition 1850 MachineInstr *SIRegisterInfo::findReachingDef(unsigned Reg, unsigned SubReg, 1851 MachineInstr &Use, 1852 MachineRegisterInfo &MRI, 1853 LiveIntervals *LIS) const { 1854 auto &MDT = LIS->getAnalysis<MachineDominatorTree>(); 1855 SlotIndex UseIdx = LIS->getInstructionIndex(Use); 1856 SlotIndex DefIdx; 1857 1858 if (Register::isVirtualRegister(Reg)) { 1859 if (!LIS->hasInterval(Reg)) 1860 return nullptr; 1861 LiveInterval &LI = LIS->getInterval(Reg); 1862 LaneBitmask SubLanes = SubReg ? getSubRegIndexLaneMask(SubReg) 1863 : MRI.getMaxLaneMaskForVReg(Reg); 1864 VNInfo *V = nullptr; 1865 if (LI.hasSubRanges()) { 1866 for (auto &S : LI.subranges()) { 1867 if ((S.LaneMask & SubLanes) == SubLanes) { 1868 V = S.getVNInfoAt(UseIdx); 1869 break; 1870 } 1871 } 1872 } else { 1873 V = LI.getVNInfoAt(UseIdx); 1874 } 1875 if (!V) 1876 return nullptr; 1877 DefIdx = V->def; 1878 } else { 1879 // Find last def. 1880 for (MCRegUnitIterator Units(Reg, this); Units.isValid(); ++Units) { 1881 LiveRange &LR = LIS->getRegUnit(*Units); 1882 if (VNInfo *V = LR.getVNInfoAt(UseIdx)) { 1883 if (!DefIdx.isValid() || 1884 MDT.dominates(LIS->getInstructionFromIndex(DefIdx), 1885 LIS->getInstructionFromIndex(V->def))) 1886 DefIdx = V->def; 1887 } else { 1888 return nullptr; 1889 } 1890 } 1891 } 1892 1893 MachineInstr *Def = LIS->getInstructionFromIndex(DefIdx); 1894 1895 if (!Def || !MDT.dominates(Def, &Use)) 1896 return nullptr; 1897 1898 assert(Def->modifiesRegister(Reg, this)); 1899 1900 return Def; 1901 } 1902