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