1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file 11 /// \brief SI implementation of the TargetRegisterInfo class. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "SIRegisterInfo.h" 16 #include "SIInstrInfo.h" 17 #include "SIMachineFunctionInfo.h" 18 #include "llvm/CodeGen/MachineFrameInfo.h" 19 #include "llvm/CodeGen/MachineInstrBuilder.h" 20 #include "llvm/CodeGen/RegisterScavenging.h" 21 #include "llvm/IR/Function.h" 22 #include "llvm/IR/LLVMContext.h" 23 24 using namespace llvm; 25 26 static unsigned getMaxWaveCountPerSIMD(const MachineFunction &MF) { 27 const SIMachineFunctionInfo& MFI = *MF.getInfo<SIMachineFunctionInfo>(); 28 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 29 unsigned SIMDPerCU = 4; 30 31 unsigned MaxInvocationsPerWave = SIMDPerCU * ST.getWavefrontSize(); 32 return alignTo(MFI.getMaximumWorkGroupSize(MF), MaxInvocationsPerWave) / 33 MaxInvocationsPerWave; 34 } 35 36 static unsigned getMaxWorkGroupSGPRCount(const MachineFunction &MF) { 37 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 38 unsigned MaxWaveCountPerSIMD = getMaxWaveCountPerSIMD(MF); 39 40 unsigned TotalSGPRCountPerSIMD, AddressableSGPRCount, SGPRUsageAlignment; 41 unsigned ReservedSGPRCount; 42 43 if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) { 44 TotalSGPRCountPerSIMD = 800; 45 AddressableSGPRCount = 102; 46 SGPRUsageAlignment = 16; 47 ReservedSGPRCount = 6; // VCC, FLAT_SCRATCH, XNACK 48 } else { 49 TotalSGPRCountPerSIMD = 512; 50 AddressableSGPRCount = 104; 51 SGPRUsageAlignment = 8; 52 ReservedSGPRCount = 2; // VCC 53 } 54 55 unsigned MaxSGPRCount = (TotalSGPRCountPerSIMD / MaxWaveCountPerSIMD); 56 MaxSGPRCount = alignDown(MaxSGPRCount, SGPRUsageAlignment); 57 58 if (ST.hasSGPRInitBug()) 59 MaxSGPRCount = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG; 60 61 return std::min(MaxSGPRCount - ReservedSGPRCount, AddressableSGPRCount); 62 } 63 64 static unsigned getMaxWorkGroupVGPRCount(const MachineFunction &MF) { 65 unsigned MaxWaveCountPerSIMD = getMaxWaveCountPerSIMD(MF); 66 unsigned TotalVGPRCountPerSIMD = 256; 67 unsigned VGPRUsageAlignment = 4; 68 69 return alignDown(TotalVGPRCountPerSIMD / MaxWaveCountPerSIMD, 70 VGPRUsageAlignment); 71 } 72 73 static bool hasPressureSet(const int *PSets, unsigned PSetID) { 74 for (unsigned i = 0; PSets[i] != -1; ++i) { 75 if (PSets[i] == (int)PSetID) 76 return true; 77 } 78 return false; 79 } 80 81 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg, 82 BitVector &PressureSets) const { 83 for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) { 84 const int *PSets = getRegUnitPressureSets(*U); 85 if (hasPressureSet(PSets, PSetID)) { 86 PressureSets.set(PSetID); 87 break; 88 } 89 } 90 } 91 92 SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo(), 93 SGPRPressureSets(getNumRegPressureSets()), 94 VGPRPressureSets(getNumRegPressureSets()) { 95 unsigned NumRegPressureSets = getNumRegPressureSets(); 96 97 SGPR32SetID = NumRegPressureSets; 98 VGPR32SetID = NumRegPressureSets; 99 for (unsigned i = 0; i < NumRegPressureSets; ++i) { 100 if (strncmp("SGPR_32", getRegPressureSetName(i), 7) == 0) 101 SGPR32SetID = i; 102 else if (strncmp("VGPR_32", getRegPressureSetName(i), 7) == 0) 103 VGPR32SetID = i; 104 105 classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets); 106 classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets); 107 } 108 assert(SGPR32SetID < NumRegPressureSets && 109 VGPR32SetID < NumRegPressureSets); 110 } 111 112 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const { 113 MCRegAliasIterator R(Reg, this, true); 114 115 for (; R.isValid(); ++R) 116 Reserved.set(*R); 117 } 118 119 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg( 120 const MachineFunction &MF) const { 121 unsigned BaseIdx = alignDown(getMaxWorkGroupSGPRCount(MF), 4) - 4; 122 unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx)); 123 return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass); 124 } 125 126 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg( 127 const MachineFunction &MF) const { 128 unsigned RegCount = getMaxWorkGroupSGPRCount(MF); 129 unsigned Reg; 130 131 // Try to place it in a hole after PrivateSegmentbufferReg. 132 if (RegCount & 3) { 133 // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to 134 // alignment constraints, so we have a hole where can put the wave offset. 135 Reg = RegCount - 1; 136 } else { 137 // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the 138 // wave offset before it. 139 Reg = RegCount - 5; 140 } 141 return AMDGPU::SGPR_32RegClass.getRegister(Reg); 142 } 143 144 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 145 BitVector Reserved(getNumRegs()); 146 Reserved.set(AMDGPU::INDIRECT_BASE_ADDR); 147 148 // EXEC_LO and EXEC_HI could be allocated and used as regular register, but 149 // this seems likely to result in bugs, so I'm marking them as reserved. 150 reserveRegisterTuples(Reserved, AMDGPU::EXEC); 151 reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR); 152 153 // Reserve Trap Handler registers - support is not implemented in Codegen. 154 reserveRegisterTuples(Reserved, AMDGPU::TBA); 155 reserveRegisterTuples(Reserved, AMDGPU::TMA); 156 reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1); 157 reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3); 158 reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5); 159 reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7); 160 reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9); 161 reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11); 162 163 unsigned MaxWorkGroupSGPRCount = getMaxWorkGroupSGPRCount(MF); 164 unsigned MaxWorkGroupVGPRCount = getMaxWorkGroupVGPRCount(MF); 165 166 unsigned NumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs(); 167 unsigned NumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs(); 168 for (unsigned i = MaxWorkGroupSGPRCount; i < NumSGPRs; ++i) { 169 unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i); 170 reserveRegisterTuples(Reserved, Reg); 171 } 172 173 174 for (unsigned i = MaxWorkGroupVGPRCount; i < NumVGPRs; ++i) { 175 unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); 176 reserveRegisterTuples(Reserved, Reg); 177 } 178 179 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 180 181 unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg(); 182 if (ScratchWaveOffsetReg != AMDGPU::NoRegister) { 183 // Reserve 1 SGPR for scratch wave offset in case we need to spill. 184 reserveRegisterTuples(Reserved, ScratchWaveOffsetReg); 185 } 186 187 unsigned ScratchRSrcReg = MFI->getScratchRSrcReg(); 188 if (ScratchRSrcReg != AMDGPU::NoRegister) { 189 // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need 190 // to spill. 191 // TODO: May need to reserve a VGPR if doing LDS spilling. 192 reserveRegisterTuples(Reserved, ScratchRSrcReg); 193 assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg)); 194 } 195 196 // Reserve VGPRs for trap handler usage if "amdgpu-debugger-reserve-trap-regs" 197 // attribute was specified. 198 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 199 if (ST.debuggerReserveTrapVGPRs()) { 200 unsigned ReservedVGPRFirst = 201 MaxWorkGroupVGPRCount - MFI->getDebuggerReserveTrapVGPRCount(); 202 for (unsigned i = ReservedVGPRFirst; i < MaxWorkGroupVGPRCount; ++i) { 203 unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); 204 reserveRegisterTuples(Reserved, Reg); 205 } 206 } 207 208 return Reserved; 209 } 210 211 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF, 212 unsigned Idx) const { 213 const AMDGPUSubtarget &STI = MF.getSubtarget<AMDGPUSubtarget>(); 214 // FIXME: We should adjust the max number of waves based on LDS size. 215 unsigned SGPRLimit = getNumSGPRsAllowed(STI.getGeneration(), 216 STI.getMaxWavesPerCU()); 217 unsigned VGPRLimit = getNumVGPRsAllowed(STI.getMaxWavesPerCU()); 218 219 unsigned VSLimit = SGPRLimit + VGPRLimit; 220 221 if (SGPRPressureSets.test(Idx) && VGPRPressureSets.test(Idx)) { 222 // FIXME: This is a hack. We should never be considering the pressure of 223 // these since no virtual register should ever have this class. 224 return VSLimit; 225 } 226 227 if (SGPRPressureSets.test(Idx)) 228 return SGPRLimit; 229 230 return VGPRLimit; 231 } 232 233 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const { 234 return Fn.getFrameInfo()->hasStackObjects(); 235 } 236 237 bool 238 SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const { 239 return MF.getFrameInfo()->hasStackObjects(); 240 } 241 242 bool SIRegisterInfo::requiresVirtualBaseRegisters( 243 const MachineFunction &) const { 244 // There are no special dedicated stack or frame pointers. 245 return true; 246 } 247 248 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI, 249 int Idx) const { 250 if (!SIInstrInfo::isMUBUF(*MI)) 251 return 0; 252 253 assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(), 254 AMDGPU::OpName::vaddr) && 255 "Should never see frame index on non-address operand"); 256 257 int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(), 258 AMDGPU::OpName::offset); 259 return MI->getOperand(OffIdx).getImm(); 260 } 261 262 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const { 263 return MI->mayLoadOrStore(); 264 } 265 266 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, 267 unsigned BaseReg, 268 int FrameIdx, 269 int64_t Offset) const { 270 MachineBasicBlock::iterator Ins = MBB->begin(); 271 DebugLoc DL; // Defaults to "unknown" 272 273 if (Ins != MBB->end()) 274 DL = Ins->getDebugLoc(); 275 276 MachineFunction *MF = MBB->getParent(); 277 const AMDGPUSubtarget &Subtarget = MF->getSubtarget<AMDGPUSubtarget>(); 278 const TargetInstrInfo *TII = Subtarget.getInstrInfo(); 279 280 assert(isUInt<27>(Offset) && 281 "Private offset should never exceed maximum private size"); 282 283 284 if (Offset == 0) { 285 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg) 286 .addFrameIndex(FrameIdx); 287 return; 288 } 289 290 MachineRegisterInfo &MRI = MF->getRegInfo(); 291 unsigned UnusedCarry = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 292 293 BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_ADD_I32_e64), BaseReg) 294 .addReg(UnusedCarry, RegState::Define | RegState::Dead) 295 .addImm(Offset) 296 .addFrameIndex(FrameIdx); 297 } 298 299 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg, 300 int64_t Offset) const { 301 302 MachineBasicBlock *MBB = MI.getParent(); 303 MachineFunction *MF = MBB->getParent(); 304 const AMDGPUSubtarget &Subtarget = MF->getSubtarget<AMDGPUSubtarget>(); 305 const SIInstrInfo *TII 306 = static_cast<const SIInstrInfo *>(Subtarget.getInstrInfo()); 307 308 #ifndef NDEBUG 309 // FIXME: Is it possible to be storing a frame index to itself? 310 bool SeenFI = false; 311 for (const MachineOperand &MO: MI.operands()) { 312 if (MO.isFI()) { 313 if (SeenFI) 314 llvm_unreachable("should not see multiple frame indices"); 315 316 SeenFI = true; 317 } 318 } 319 #endif 320 321 MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr); 322 assert(FIOp && FIOp->isFI() && "frame index must be address operand"); 323 324 assert(TII->isMUBUF(MI)); 325 326 MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset); 327 int64_t NewOffset = OffsetOp->getImm() + Offset; 328 if (isUInt<12>(NewOffset)) { 329 // If we have a legal offset, fold it directly into the instruction. 330 FIOp->ChangeToRegister(BaseReg, false); 331 OffsetOp->setImm(NewOffset); 332 return; 333 } 334 335 // The offset is not legal, so we must insert an add of the offset. 336 MachineRegisterInfo &MRI = MF->getRegInfo(); 337 unsigned NewReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 338 DebugLoc DL = MI.getDebugLoc(); 339 340 assert(Offset != 0 && "Non-zero offset expected"); 341 342 unsigned UnusedCarry = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass); 343 344 // In the case the instruction already had an immediate offset, here only 345 // the requested new offset is added because we are leaving the original 346 // immediate in place. 347 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ADD_I32_e64), NewReg) 348 .addReg(UnusedCarry, RegState::Define | RegState::Dead) 349 .addImm(Offset) 350 .addReg(BaseReg); 351 352 FIOp->ChangeToRegister(NewReg, false); 353 } 354 355 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, 356 unsigned BaseReg, 357 int64_t Offset) const { 358 return SIInstrInfo::isMUBUF(*MI) && isUInt<12>(Offset); 359 } 360 361 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass( 362 const MachineFunction &MF, unsigned Kind) const { 363 // This is inaccurate. It depends on the instruction and address space. The 364 // only place where we should hit this is for dealing with frame indexes / 365 // private accesses, so this is correct in that case. 366 return &AMDGPU::VGPR_32RegClass; 367 } 368 369 static unsigned getNumSubRegsForSpillOp(unsigned Op) { 370 371 switch (Op) { 372 case AMDGPU::SI_SPILL_S512_SAVE: 373 case AMDGPU::SI_SPILL_S512_RESTORE: 374 case AMDGPU::SI_SPILL_V512_SAVE: 375 case AMDGPU::SI_SPILL_V512_RESTORE: 376 return 16; 377 case AMDGPU::SI_SPILL_S256_SAVE: 378 case AMDGPU::SI_SPILL_S256_RESTORE: 379 case AMDGPU::SI_SPILL_V256_SAVE: 380 case AMDGPU::SI_SPILL_V256_RESTORE: 381 return 8; 382 case AMDGPU::SI_SPILL_S128_SAVE: 383 case AMDGPU::SI_SPILL_S128_RESTORE: 384 case AMDGPU::SI_SPILL_V128_SAVE: 385 case AMDGPU::SI_SPILL_V128_RESTORE: 386 return 4; 387 case AMDGPU::SI_SPILL_V96_SAVE: 388 case AMDGPU::SI_SPILL_V96_RESTORE: 389 return 3; 390 case AMDGPU::SI_SPILL_S64_SAVE: 391 case AMDGPU::SI_SPILL_S64_RESTORE: 392 case AMDGPU::SI_SPILL_V64_SAVE: 393 case AMDGPU::SI_SPILL_V64_RESTORE: 394 return 2; 395 case AMDGPU::SI_SPILL_S32_SAVE: 396 case AMDGPU::SI_SPILL_S32_RESTORE: 397 case AMDGPU::SI_SPILL_V32_SAVE: 398 case AMDGPU::SI_SPILL_V32_RESTORE: 399 return 1; 400 default: llvm_unreachable("Invalid spill opcode"); 401 } 402 } 403 404 void SIRegisterInfo::buildScratchLoadStore(MachineBasicBlock::iterator MI, 405 unsigned LoadStoreOp, 406 unsigned Value, 407 unsigned ScratchRsrcReg, 408 unsigned ScratchOffset, 409 int64_t Offset, 410 RegScavenger *RS) const { 411 412 MachineBasicBlock *MBB = MI->getParent(); 413 MachineFunction *MF = MI->getParent()->getParent(); 414 const SIInstrInfo *TII = 415 static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo()); 416 DebugLoc DL = MI->getDebugLoc(); 417 bool IsStore = TII->get(LoadStoreOp).mayStore(); 418 419 bool RanOutOfSGPRs = false; 420 bool Scavenged = false; 421 unsigned SOffset = ScratchOffset; 422 unsigned OriginalImmOffset = Offset; 423 424 unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode()); 425 unsigned Size = NumSubRegs * 4; 426 427 if (!isUInt<12>(Offset + Size)) { 428 SOffset = AMDGPU::NoRegister; 429 430 // We don't have access to the register scavenger if this function is called 431 // during PEI::scavengeFrameVirtualRegs(). 432 if (RS) 433 SOffset = RS->FindUnusedReg(&AMDGPU::SGPR_32RegClass); 434 435 if (SOffset == AMDGPU::NoRegister) { 436 // There are no free SGPRs, and since we are in the process of spilling 437 // VGPRs too. Since we need a VGPR in order to spill SGPRs (this is true 438 // on SI/CI and on VI it is true until we implement spilling using scalar 439 // stores), we have no way to free up an SGPR. Our solution here is to 440 // add the offset directly to the ScratchOffset register, and then 441 // subtract the offset after the spill to return ScratchOffset to it's 442 // original value. 443 RanOutOfSGPRs = true; 444 SOffset = ScratchOffset; 445 } else { 446 Scavenged = true; 447 } 448 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset) 449 .addReg(ScratchOffset) 450 .addImm(Offset); 451 Offset = 0; 452 } 453 454 for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += 4) { 455 unsigned SubReg = NumSubRegs > 1 ? 456 getPhysRegSubReg(Value, &AMDGPU::VGPR_32RegClass, i) : 457 Value; 458 459 unsigned SOffsetRegState = 0; 460 if (i + 1 == e && Scavenged) 461 SOffsetRegState |= RegState::Kill; 462 463 BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp)) 464 .addReg(SubReg, getDefRegState(!IsStore)) 465 .addReg(ScratchRsrcReg) 466 .addReg(SOffset, SOffsetRegState) 467 .addImm(Offset) 468 .addImm(0) // glc 469 .addImm(0) // slc 470 .addImm(0) // tfe 471 .addReg(Value, RegState::Implicit | getDefRegState(!IsStore)) 472 .setMemRefs(MI->memoperands_begin(), MI->memoperands_end()); 473 } 474 475 if (RanOutOfSGPRs) { 476 // Subtract the offset we added to the ScratchOffset register. 477 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffset) 478 .addReg(ScratchOffset) 479 .addImm(OriginalImmOffset); 480 } 481 } 482 483 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, 484 int SPAdj, unsigned FIOperandNum, 485 RegScavenger *RS) const { 486 MachineFunction *MF = MI->getParent()->getParent(); 487 MachineRegisterInfo &MRI = MF->getRegInfo(); 488 MachineBasicBlock *MBB = MI->getParent(); 489 SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); 490 MachineFrameInfo *FrameInfo = MF->getFrameInfo(); 491 const SIInstrInfo *TII = 492 static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo()); 493 DebugLoc DL = MI->getDebugLoc(); 494 495 MachineOperand &FIOp = MI->getOperand(FIOperandNum); 496 int Index = MI->getOperand(FIOperandNum).getIndex(); 497 498 switch (MI->getOpcode()) { 499 // SGPR register spill 500 case AMDGPU::SI_SPILL_S512_SAVE: 501 case AMDGPU::SI_SPILL_S256_SAVE: 502 case AMDGPU::SI_SPILL_S128_SAVE: 503 case AMDGPU::SI_SPILL_S64_SAVE: 504 case AMDGPU::SI_SPILL_S32_SAVE: { 505 unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode()); 506 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 507 508 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 509 unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(), 510 &AMDGPU::SGPR_32RegClass, i); 511 struct SIMachineFunctionInfo::SpilledReg Spill = 512 MFI->getSpilledReg(MF, Index, i); 513 514 if (Spill.hasReg()) { 515 BuildMI(*MBB, MI, DL, 516 TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32), 517 Spill.VGPR) 518 .addReg(SubReg) 519 .addImm(Spill.Lane); 520 521 // FIXME: Since this spills to another register instead of an actual 522 // frame index, we should delete the frame index when all references to 523 // it are fixed. 524 } else { 525 // Spill SGPR to a frame index. 526 // FIXME we should use S_STORE_DWORD here for VI. 527 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 528 .addReg(SubReg); 529 530 unsigned Size = FrameInfo->getObjectSize(Index); 531 unsigned Align = FrameInfo->getObjectAlignment(Index); 532 MachinePointerInfo PtrInfo 533 = MachinePointerInfo::getFixedStack(*MF, Index); 534 MachineMemOperand *MMO 535 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 536 Size, Align); 537 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE)) 538 .addReg(TmpReg) // src 539 .addFrameIndex(Index) // frame_idx 540 .addReg(MFI->getScratchRSrcReg()) // scratch_rsrc 541 .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset 542 .addImm(i * 4) // offset 543 .addMemOperand(MMO); 544 } 545 } 546 MI->eraseFromParent(); 547 break; 548 } 549 550 // SGPR register restore 551 case AMDGPU::SI_SPILL_S512_RESTORE: 552 case AMDGPU::SI_SPILL_S256_RESTORE: 553 case AMDGPU::SI_SPILL_S128_RESTORE: 554 case AMDGPU::SI_SPILL_S64_RESTORE: 555 case AMDGPU::SI_SPILL_S32_RESTORE: { 556 unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode()); 557 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 558 559 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 560 unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(), 561 &AMDGPU::SGPR_32RegClass, i); 562 struct SIMachineFunctionInfo::SpilledReg Spill = 563 MFI->getSpilledReg(MF, Index, i); 564 565 if (Spill.hasReg()) { 566 BuildMI(*MBB, MI, DL, 567 TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), 568 SubReg) 569 .addReg(Spill.VGPR) 570 .addImm(Spill.Lane) 571 .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 572 } else { 573 // Restore SGPR from a stack slot. 574 // FIXME: We should use S_LOAD_DWORD here for VI. 575 576 unsigned Align = FrameInfo->getObjectAlignment(Index); 577 unsigned Size = FrameInfo->getObjectSize(Index); 578 579 MachinePointerInfo PtrInfo 580 = MachinePointerInfo::getFixedStack(*MF, Index); 581 582 MachineMemOperand *MMO = MF->getMachineMemOperand( 583 PtrInfo, MachineMemOperand::MOLoad, Size, Align); 584 585 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg) 586 .addFrameIndex(Index) // frame_idx 587 .addReg(MFI->getScratchRSrcReg()) // scratch_rsrc 588 .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset 589 .addImm(i * 4) // offset 590 .addMemOperand(MMO); 591 BuildMI(*MBB, MI, DL, 592 TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), SubReg) 593 .addReg(TmpReg) 594 .addImm(0) 595 .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 596 } 597 } 598 599 // TODO: only do this when it is needed 600 switch (MF->getSubtarget<AMDGPUSubtarget>().getGeneration()) { 601 case AMDGPUSubtarget::SOUTHERN_ISLANDS: 602 // "VALU writes SGPR" -> "SMRD reads that SGPR" needs 4 wait states 603 // ("S_NOP 3") on SI 604 TII->insertWaitStates(*MBB, MI, 4); 605 break; 606 case AMDGPUSubtarget::SEA_ISLANDS: 607 break; 608 default: // VOLCANIC_ISLANDS and later 609 // "VALU writes SGPR -> VMEM reads that SGPR" needs 5 wait states 610 // ("S_NOP 4") on VI and later. This also applies to VALUs which write 611 // VCC, but we're unlikely to see VMEM use VCC. 612 TII->insertWaitStates(*MBB, MI, 5); 613 } 614 615 MI->eraseFromParent(); 616 break; 617 } 618 619 // VGPR register spill 620 case AMDGPU::SI_SPILL_V512_SAVE: 621 case AMDGPU::SI_SPILL_V256_SAVE: 622 case AMDGPU::SI_SPILL_V128_SAVE: 623 case AMDGPU::SI_SPILL_V96_SAVE: 624 case AMDGPU::SI_SPILL_V64_SAVE: 625 case AMDGPU::SI_SPILL_V32_SAVE: 626 buildScratchLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET, 627 TII->getNamedOperand(*MI, AMDGPU::OpName::src)->getReg(), 628 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(), 629 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(), 630 FrameInfo->getObjectOffset(Index) + 631 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS); 632 MI->eraseFromParent(); 633 break; 634 case AMDGPU::SI_SPILL_V32_RESTORE: 635 case AMDGPU::SI_SPILL_V64_RESTORE: 636 case AMDGPU::SI_SPILL_V96_RESTORE: 637 case AMDGPU::SI_SPILL_V128_RESTORE: 638 case AMDGPU::SI_SPILL_V256_RESTORE: 639 case AMDGPU::SI_SPILL_V512_RESTORE: { 640 buildScratchLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET, 641 TII->getNamedOperand(*MI, AMDGPU::OpName::dst)->getReg(), 642 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(), 643 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(), 644 FrameInfo->getObjectOffset(Index) + 645 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS); 646 MI->eraseFromParent(); 647 break; 648 } 649 650 default: { 651 int64_t Offset = FrameInfo->getObjectOffset(Index); 652 FIOp.ChangeToImmediate(Offset); 653 if (!TII->isImmOperandLegal(MI, FIOperandNum, FIOp)) { 654 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 655 BuildMI(*MBB, MI, MI->getDebugLoc(), 656 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 657 .addImm(Offset); 658 FIOp.ChangeToRegister(TmpReg, false, false, true); 659 } 660 } 661 } 662 } 663 664 unsigned SIRegisterInfo::getHWRegIndex(unsigned Reg) const { 665 return getEncodingValue(Reg) & 0xff; 666 } 667 668 // FIXME: This is very slow. It might be worth creating a map from physreg to 669 // register class. 670 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const { 671 assert(!TargetRegisterInfo::isVirtualRegister(Reg)); 672 673 static const TargetRegisterClass *const BaseClasses[] = { 674 &AMDGPU::VGPR_32RegClass, 675 &AMDGPU::SReg_32RegClass, 676 &AMDGPU::VReg_64RegClass, 677 &AMDGPU::SReg_64RegClass, 678 &AMDGPU::VReg_96RegClass, 679 &AMDGPU::VReg_128RegClass, 680 &AMDGPU::SReg_128RegClass, 681 &AMDGPU::VReg_256RegClass, 682 &AMDGPU::SReg_256RegClass, 683 &AMDGPU::VReg_512RegClass, 684 &AMDGPU::SReg_512RegClass, 685 &AMDGPU::SCC_CLASSRegClass, 686 }; 687 688 for (const TargetRegisterClass *BaseClass : BaseClasses) { 689 if (BaseClass->contains(Reg)) { 690 return BaseClass; 691 } 692 } 693 return nullptr; 694 } 695 696 // TODO: It might be helpful to have some target specific flags in 697 // TargetRegisterClass to mark which classes are VGPRs to make this trivial. 698 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const { 699 switch (RC->getSize()) { 700 case 0: return false; 701 case 1: return false; 702 case 4: 703 return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr; 704 case 8: 705 return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr; 706 case 12: 707 return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr; 708 case 16: 709 return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr; 710 case 32: 711 return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr; 712 case 64: 713 return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr; 714 default: 715 llvm_unreachable("Invalid register class size"); 716 } 717 } 718 719 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass( 720 const TargetRegisterClass *SRC) const { 721 switch (SRC->getSize()) { 722 case 4: 723 return &AMDGPU::VGPR_32RegClass; 724 case 8: 725 return &AMDGPU::VReg_64RegClass; 726 case 12: 727 return &AMDGPU::VReg_96RegClass; 728 case 16: 729 return &AMDGPU::VReg_128RegClass; 730 case 32: 731 return &AMDGPU::VReg_256RegClass; 732 case 64: 733 return &AMDGPU::VReg_512RegClass; 734 default: 735 llvm_unreachable("Invalid register class size"); 736 } 737 } 738 739 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass( 740 const TargetRegisterClass *VRC) const { 741 switch (VRC->getSize()) { 742 case 4: 743 return &AMDGPU::SGPR_32RegClass; 744 case 8: 745 return &AMDGPU::SReg_64RegClass; 746 case 16: 747 return &AMDGPU::SReg_128RegClass; 748 case 32: 749 return &AMDGPU::SReg_256RegClass; 750 case 64: 751 return &AMDGPU::SReg_512RegClass; 752 default: 753 llvm_unreachable("Invalid register class size"); 754 } 755 } 756 757 const TargetRegisterClass *SIRegisterInfo::getSubRegClass( 758 const TargetRegisterClass *RC, unsigned SubIdx) const { 759 if (SubIdx == AMDGPU::NoSubRegister) 760 return RC; 761 762 // We can assume that each lane corresponds to one 32-bit register. 763 unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx)); 764 if (isSGPRClass(RC)) { 765 switch (Count) { 766 case 1: 767 return &AMDGPU::SGPR_32RegClass; 768 case 2: 769 return &AMDGPU::SReg_64RegClass; 770 case 4: 771 return &AMDGPU::SReg_128RegClass; 772 case 8: 773 return &AMDGPU::SReg_256RegClass; 774 case 16: /* fall-through */ 775 default: 776 llvm_unreachable("Invalid sub-register class size"); 777 } 778 } else { 779 switch (Count) { 780 case 1: 781 return &AMDGPU::VGPR_32RegClass; 782 case 2: 783 return &AMDGPU::VReg_64RegClass; 784 case 3: 785 return &AMDGPU::VReg_96RegClass; 786 case 4: 787 return &AMDGPU::VReg_128RegClass; 788 case 8: 789 return &AMDGPU::VReg_256RegClass; 790 case 16: /* fall-through */ 791 default: 792 llvm_unreachable("Invalid sub-register class size"); 793 } 794 } 795 } 796 797 bool SIRegisterInfo::shouldRewriteCopySrc( 798 const TargetRegisterClass *DefRC, 799 unsigned DefSubReg, 800 const TargetRegisterClass *SrcRC, 801 unsigned SrcSubReg) const { 802 // We want to prefer the smallest register class possible, so we don't want to 803 // stop and rewrite on anything that looks like a subregister 804 // extract. Operations mostly don't care about the super register class, so we 805 // only want to stop on the most basic of copies between the smae register 806 // class. 807 // 808 // e.g. if we have something like 809 // vreg0 = ... 810 // vreg1 = ... 811 // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2 812 // vreg3 = COPY vreg2, sub0 813 // 814 // We want to look through the COPY to find: 815 // => vreg3 = COPY vreg0 816 817 // Plain copy. 818 return getCommonSubClass(DefRC, SrcRC) != nullptr; 819 } 820 821 unsigned SIRegisterInfo::getPhysRegSubReg(unsigned Reg, 822 const TargetRegisterClass *SubRC, 823 unsigned Channel) const { 824 825 switch (Reg) { 826 case AMDGPU::VCC: 827 switch(Channel) { 828 case 0: return AMDGPU::VCC_LO; 829 case 1: return AMDGPU::VCC_HI; 830 default: llvm_unreachable("Invalid SubIdx for VCC"); break; 831 } 832 833 case AMDGPU::TBA: 834 switch(Channel) { 835 case 0: return AMDGPU::TBA_LO; 836 case 1: return AMDGPU::TBA_HI; 837 default: llvm_unreachable("Invalid SubIdx for TBA"); break; 838 } 839 840 case AMDGPU::TMA: 841 switch(Channel) { 842 case 0: return AMDGPU::TMA_LO; 843 case 1: return AMDGPU::TMA_HI; 844 default: llvm_unreachable("Invalid SubIdx for TMA"); break; 845 } 846 847 case AMDGPU::FLAT_SCR: 848 switch (Channel) { 849 case 0: 850 return AMDGPU::FLAT_SCR_LO; 851 case 1: 852 return AMDGPU::FLAT_SCR_HI; 853 default: 854 llvm_unreachable("Invalid SubIdx for FLAT_SCR"); 855 } 856 break; 857 858 case AMDGPU::EXEC: 859 switch (Channel) { 860 case 0: 861 return AMDGPU::EXEC_LO; 862 case 1: 863 return AMDGPU::EXEC_HI; 864 default: 865 llvm_unreachable("Invalid SubIdx for EXEC"); 866 } 867 break; 868 } 869 870 const TargetRegisterClass *RC = getPhysRegClass(Reg); 871 // 32-bit registers don't have sub-registers, so we can just return the 872 // Reg. We need to have this check here, because the calculation below 873 // using getHWRegIndex() will fail with special 32-bit registers like 874 // VCC_LO, VCC_HI, EXEC_LO, EXEC_HI and M0. 875 if (RC->getSize() == 4) { 876 assert(Channel == 0); 877 return Reg; 878 } 879 880 unsigned Index = getHWRegIndex(Reg); 881 return SubRC->getRegister(Index + Channel); 882 } 883 884 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const { 885 return OpType == AMDGPU::OPERAND_REG_IMM32; 886 } 887 888 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const { 889 if (opCanUseLiteralConstant(OpType)) 890 return true; 891 892 return OpType == AMDGPU::OPERAND_REG_INLINE_C; 893 } 894 895 // FIXME: Most of these are flexible with HSA and we don't need to reserve them 896 // as input registers if unused. Whether the dispatch ptr is necessary should be 897 // easy to detect from used intrinsics. Scratch setup is harder to know. 898 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF, 899 enum PreloadedValue Value) const { 900 901 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 902 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 903 (void)ST; 904 switch (Value) { 905 case SIRegisterInfo::WORKGROUP_ID_X: 906 assert(MFI->hasWorkGroupIDX()); 907 return MFI->WorkGroupIDXSystemSGPR; 908 case SIRegisterInfo::WORKGROUP_ID_Y: 909 assert(MFI->hasWorkGroupIDY()); 910 return MFI->WorkGroupIDYSystemSGPR; 911 case SIRegisterInfo::WORKGROUP_ID_Z: 912 assert(MFI->hasWorkGroupIDZ()); 913 return MFI->WorkGroupIDZSystemSGPR; 914 case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET: 915 return MFI->PrivateSegmentWaveByteOffsetSystemSGPR; 916 case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER: 917 assert(ST.isAmdHsaOS() && "Non-HSA ABI currently uses relocations"); 918 assert(MFI->hasPrivateSegmentBuffer()); 919 return MFI->PrivateSegmentBufferUserSGPR; 920 case SIRegisterInfo::KERNARG_SEGMENT_PTR: 921 assert(MFI->hasKernargSegmentPtr()); 922 return MFI->KernargSegmentPtrUserSGPR; 923 case SIRegisterInfo::DISPATCH_ID: 924 llvm_unreachable("unimplemented"); 925 case SIRegisterInfo::FLAT_SCRATCH_INIT: 926 assert(MFI->hasFlatScratchInit()); 927 return MFI->FlatScratchInitUserSGPR; 928 case SIRegisterInfo::DISPATCH_PTR: 929 assert(MFI->hasDispatchPtr()); 930 return MFI->DispatchPtrUserSGPR; 931 case SIRegisterInfo::QUEUE_PTR: 932 assert(MFI->hasQueuePtr()); 933 return MFI->QueuePtrUserSGPR; 934 case SIRegisterInfo::WORKITEM_ID_X: 935 assert(MFI->hasWorkItemIDX()); 936 return AMDGPU::VGPR0; 937 case SIRegisterInfo::WORKITEM_ID_Y: 938 assert(MFI->hasWorkItemIDY()); 939 return AMDGPU::VGPR1; 940 case SIRegisterInfo::WORKITEM_ID_Z: 941 assert(MFI->hasWorkItemIDZ()); 942 return AMDGPU::VGPR2; 943 } 944 llvm_unreachable("unexpected preloaded value type"); 945 } 946 947 /// \brief Returns a register that is not used at any point in the function. 948 /// If all registers are used, then this function will return 949 // AMDGPU::NoRegister. 950 unsigned SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI, 951 const TargetRegisterClass *RC) const { 952 for (unsigned Reg : *RC) 953 if (!MRI.isPhysRegUsed(Reg)) 954 return Reg; 955 return AMDGPU::NoRegister; 956 } 957 958 unsigned SIRegisterInfo::getNumVGPRsAllowed(unsigned WaveCount) const { 959 switch(WaveCount) { 960 case 10: return 24; 961 case 9: return 28; 962 case 8: return 32; 963 case 7: return 36; 964 case 6: return 40; 965 case 5: return 48; 966 case 4: return 64; 967 case 3: return 84; 968 case 2: return 128; 969 default: return 256; 970 } 971 } 972 973 unsigned SIRegisterInfo::getNumSGPRsAllowed(AMDGPUSubtarget::Generation gen, 974 unsigned WaveCount) const { 975 if (gen >= AMDGPUSubtarget::VOLCANIC_ISLANDS) { 976 switch (WaveCount) { 977 case 10: return 80; 978 case 9: return 80; 979 case 8: return 96; 980 default: return 102; 981 } 982 } else { 983 switch(WaveCount) { 984 case 10: return 48; 985 case 9: return 56; 986 case 8: return 64; 987 case 7: return 72; 988 case 6: return 80; 989 case 5: return 96; 990 default: return 103; 991 } 992 } 993 } 994