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 registers for debugger usage if "amdgpu-debugger-reserve-trap-regs" 197 // attribute was specified. 198 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 199 if (ST.debuggerReserveRegs()) { 200 unsigned ReservedVGPRFirst = 201 MaxWorkGroupVGPRCount - MFI->getDebuggerReservedVGPRCount(); 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 unsigned SuperReg = MI->getOperand(0).getReg(); 509 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 510 unsigned SubReg = getPhysRegSubReg(SuperReg, 511 &AMDGPU::SGPR_32RegClass, i); 512 513 struct SIMachineFunctionInfo::SpilledReg Spill = 514 MFI->getSpilledReg(MF, Index, i); 515 516 if (Spill.hasReg()) { 517 BuildMI(*MBB, MI, DL, 518 TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32), 519 Spill.VGPR) 520 .addReg(SubReg) 521 .addImm(Spill.Lane); 522 523 // FIXME: Since this spills to another register instead of an actual 524 // frame index, we should delete the frame index when all references to 525 // it are fixed. 526 } else { 527 // Spill SGPR to a frame index. 528 // FIXME we should use S_STORE_DWORD here for VI. 529 MachineInstrBuilder Mov 530 = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 531 .addReg(SubReg); 532 533 // There could be undef components of a spilled super register. 534 // TODO: Can we detect this and skip the spill? 535 if (NumSubRegs > 1) 536 Mov.addReg(SuperReg, RegState::Implicit); 537 538 unsigned Size = FrameInfo->getObjectSize(Index); 539 unsigned Align = FrameInfo->getObjectAlignment(Index); 540 MachinePointerInfo PtrInfo 541 = MachinePointerInfo::getFixedStack(*MF, Index); 542 MachineMemOperand *MMO 543 = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore, 544 Size, Align); 545 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE)) 546 .addReg(TmpReg) // src 547 .addFrameIndex(Index) // frame_idx 548 .addReg(MFI->getScratchRSrcReg()) // scratch_rsrc 549 .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset 550 .addImm(i * 4) // offset 551 .addMemOperand(MMO); 552 } 553 } 554 MI->eraseFromParent(); 555 break; 556 } 557 558 // SGPR register restore 559 case AMDGPU::SI_SPILL_S512_RESTORE: 560 case AMDGPU::SI_SPILL_S256_RESTORE: 561 case AMDGPU::SI_SPILL_S128_RESTORE: 562 case AMDGPU::SI_SPILL_S64_RESTORE: 563 case AMDGPU::SI_SPILL_S32_RESTORE: { 564 unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode()); 565 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 566 567 for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { 568 unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(), 569 &AMDGPU::SGPR_32RegClass, i); 570 struct SIMachineFunctionInfo::SpilledReg Spill = 571 MFI->getSpilledReg(MF, Index, i); 572 573 if (Spill.hasReg()) { 574 BuildMI(*MBB, MI, DL, 575 TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), 576 SubReg) 577 .addReg(Spill.VGPR) 578 .addImm(Spill.Lane) 579 .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 580 } else { 581 // Restore SGPR from a stack slot. 582 // FIXME: We should use S_LOAD_DWORD here for VI. 583 584 unsigned Align = FrameInfo->getObjectAlignment(Index); 585 unsigned Size = FrameInfo->getObjectSize(Index); 586 587 MachinePointerInfo PtrInfo 588 = MachinePointerInfo::getFixedStack(*MF, Index); 589 590 MachineMemOperand *MMO = MF->getMachineMemOperand( 591 PtrInfo, MachineMemOperand::MOLoad, Size, Align); 592 593 BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg) 594 .addFrameIndex(Index) // frame_idx 595 .addReg(MFI->getScratchRSrcReg()) // scratch_rsrc 596 .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset 597 .addImm(i * 4) // offset 598 .addMemOperand(MMO); 599 BuildMI(*MBB, MI, DL, 600 TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg) 601 .addReg(TmpReg, RegState::Kill) 602 .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine); 603 } 604 } 605 606 MI->eraseFromParent(); 607 break; 608 } 609 610 // VGPR register spill 611 case AMDGPU::SI_SPILL_V512_SAVE: 612 case AMDGPU::SI_SPILL_V256_SAVE: 613 case AMDGPU::SI_SPILL_V128_SAVE: 614 case AMDGPU::SI_SPILL_V96_SAVE: 615 case AMDGPU::SI_SPILL_V64_SAVE: 616 case AMDGPU::SI_SPILL_V32_SAVE: 617 buildScratchLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET, 618 TII->getNamedOperand(*MI, AMDGPU::OpName::src)->getReg(), 619 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(), 620 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(), 621 FrameInfo->getObjectOffset(Index) + 622 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS); 623 MI->eraseFromParent(); 624 break; 625 case AMDGPU::SI_SPILL_V32_RESTORE: 626 case AMDGPU::SI_SPILL_V64_RESTORE: 627 case AMDGPU::SI_SPILL_V96_RESTORE: 628 case AMDGPU::SI_SPILL_V128_RESTORE: 629 case AMDGPU::SI_SPILL_V256_RESTORE: 630 case AMDGPU::SI_SPILL_V512_RESTORE: { 631 buildScratchLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET, 632 TII->getNamedOperand(*MI, AMDGPU::OpName::dst)->getReg(), 633 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(), 634 TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(), 635 FrameInfo->getObjectOffset(Index) + 636 TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS); 637 MI->eraseFromParent(); 638 break; 639 } 640 641 default: { 642 int64_t Offset = FrameInfo->getObjectOffset(Index); 643 FIOp.ChangeToImmediate(Offset); 644 if (!TII->isImmOperandLegal(MI, FIOperandNum, FIOp)) { 645 unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); 646 BuildMI(*MBB, MI, MI->getDebugLoc(), 647 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) 648 .addImm(Offset); 649 FIOp.ChangeToRegister(TmpReg, false, false, true); 650 } 651 } 652 } 653 } 654 655 unsigned SIRegisterInfo::getHWRegIndex(unsigned Reg) const { 656 return getEncodingValue(Reg) & 0xff; 657 } 658 659 // FIXME: This is very slow. It might be worth creating a map from physreg to 660 // register class. 661 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const { 662 assert(!TargetRegisterInfo::isVirtualRegister(Reg)); 663 664 static const TargetRegisterClass *const BaseClasses[] = { 665 &AMDGPU::VGPR_32RegClass, 666 &AMDGPU::SReg_32RegClass, 667 &AMDGPU::VReg_64RegClass, 668 &AMDGPU::SReg_64RegClass, 669 &AMDGPU::VReg_96RegClass, 670 &AMDGPU::VReg_128RegClass, 671 &AMDGPU::SReg_128RegClass, 672 &AMDGPU::VReg_256RegClass, 673 &AMDGPU::SReg_256RegClass, 674 &AMDGPU::VReg_512RegClass, 675 &AMDGPU::SReg_512RegClass, 676 &AMDGPU::SCC_CLASSRegClass, 677 }; 678 679 for (const TargetRegisterClass *BaseClass : BaseClasses) { 680 if (BaseClass->contains(Reg)) { 681 return BaseClass; 682 } 683 } 684 return nullptr; 685 } 686 687 // TODO: It might be helpful to have some target specific flags in 688 // TargetRegisterClass to mark which classes are VGPRs to make this trivial. 689 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const { 690 switch (RC->getSize()) { 691 case 0: return false; 692 case 1: return false; 693 case 4: 694 return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr; 695 case 8: 696 return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr; 697 case 12: 698 return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr; 699 case 16: 700 return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr; 701 case 32: 702 return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr; 703 case 64: 704 return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr; 705 default: 706 llvm_unreachable("Invalid register class size"); 707 } 708 } 709 710 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass( 711 const TargetRegisterClass *SRC) const { 712 switch (SRC->getSize()) { 713 case 4: 714 return &AMDGPU::VGPR_32RegClass; 715 case 8: 716 return &AMDGPU::VReg_64RegClass; 717 case 12: 718 return &AMDGPU::VReg_96RegClass; 719 case 16: 720 return &AMDGPU::VReg_128RegClass; 721 case 32: 722 return &AMDGPU::VReg_256RegClass; 723 case 64: 724 return &AMDGPU::VReg_512RegClass; 725 default: 726 llvm_unreachable("Invalid register class size"); 727 } 728 } 729 730 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass( 731 const TargetRegisterClass *VRC) const { 732 switch (VRC->getSize()) { 733 case 4: 734 return &AMDGPU::SGPR_32RegClass; 735 case 8: 736 return &AMDGPU::SReg_64RegClass; 737 case 16: 738 return &AMDGPU::SReg_128RegClass; 739 case 32: 740 return &AMDGPU::SReg_256RegClass; 741 case 64: 742 return &AMDGPU::SReg_512RegClass; 743 default: 744 llvm_unreachable("Invalid register class size"); 745 } 746 } 747 748 const TargetRegisterClass *SIRegisterInfo::getSubRegClass( 749 const TargetRegisterClass *RC, unsigned SubIdx) const { 750 if (SubIdx == AMDGPU::NoSubRegister) 751 return RC; 752 753 // We can assume that each lane corresponds to one 32-bit register. 754 unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx)); 755 if (isSGPRClass(RC)) { 756 switch (Count) { 757 case 1: 758 return &AMDGPU::SGPR_32RegClass; 759 case 2: 760 return &AMDGPU::SReg_64RegClass; 761 case 4: 762 return &AMDGPU::SReg_128RegClass; 763 case 8: 764 return &AMDGPU::SReg_256RegClass; 765 case 16: /* fall-through */ 766 default: 767 llvm_unreachable("Invalid sub-register class size"); 768 } 769 } else { 770 switch (Count) { 771 case 1: 772 return &AMDGPU::VGPR_32RegClass; 773 case 2: 774 return &AMDGPU::VReg_64RegClass; 775 case 3: 776 return &AMDGPU::VReg_96RegClass; 777 case 4: 778 return &AMDGPU::VReg_128RegClass; 779 case 8: 780 return &AMDGPU::VReg_256RegClass; 781 case 16: /* fall-through */ 782 default: 783 llvm_unreachable("Invalid sub-register class size"); 784 } 785 } 786 } 787 788 bool SIRegisterInfo::shouldRewriteCopySrc( 789 const TargetRegisterClass *DefRC, 790 unsigned DefSubReg, 791 const TargetRegisterClass *SrcRC, 792 unsigned SrcSubReg) const { 793 // We want to prefer the smallest register class possible, so we don't want to 794 // stop and rewrite on anything that looks like a subregister 795 // extract. Operations mostly don't care about the super register class, so we 796 // only want to stop on the most basic of copies between the smae register 797 // class. 798 // 799 // e.g. if we have something like 800 // vreg0 = ... 801 // vreg1 = ... 802 // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2 803 // vreg3 = COPY vreg2, sub0 804 // 805 // We want to look through the COPY to find: 806 // => vreg3 = COPY vreg0 807 808 // Plain copy. 809 return getCommonSubClass(DefRC, SrcRC) != nullptr; 810 } 811 812 unsigned SIRegisterInfo::getPhysRegSubReg(unsigned Reg, 813 const TargetRegisterClass *SubRC, 814 unsigned Channel) const { 815 816 switch (Reg) { 817 case AMDGPU::VCC: 818 switch(Channel) { 819 case 0: return AMDGPU::VCC_LO; 820 case 1: return AMDGPU::VCC_HI; 821 default: llvm_unreachable("Invalid SubIdx for VCC"); break; 822 } 823 824 case AMDGPU::TBA: 825 switch(Channel) { 826 case 0: return AMDGPU::TBA_LO; 827 case 1: return AMDGPU::TBA_HI; 828 default: llvm_unreachable("Invalid SubIdx for TBA"); break; 829 } 830 831 case AMDGPU::TMA: 832 switch(Channel) { 833 case 0: return AMDGPU::TMA_LO; 834 case 1: return AMDGPU::TMA_HI; 835 default: llvm_unreachable("Invalid SubIdx for TMA"); break; 836 } 837 838 case AMDGPU::FLAT_SCR: 839 switch (Channel) { 840 case 0: 841 return AMDGPU::FLAT_SCR_LO; 842 case 1: 843 return AMDGPU::FLAT_SCR_HI; 844 default: 845 llvm_unreachable("Invalid SubIdx for FLAT_SCR"); 846 } 847 break; 848 849 case AMDGPU::EXEC: 850 switch (Channel) { 851 case 0: 852 return AMDGPU::EXEC_LO; 853 case 1: 854 return AMDGPU::EXEC_HI; 855 default: 856 llvm_unreachable("Invalid SubIdx for EXEC"); 857 } 858 break; 859 } 860 861 const TargetRegisterClass *RC = getPhysRegClass(Reg); 862 // 32-bit registers don't have sub-registers, so we can just return the 863 // Reg. We need to have this check here, because the calculation below 864 // using getHWRegIndex() will fail with special 32-bit registers like 865 // VCC_LO, VCC_HI, EXEC_LO, EXEC_HI and M0. 866 if (RC->getSize() == 4) { 867 assert(Channel == 0); 868 return Reg; 869 } 870 871 unsigned Index = getHWRegIndex(Reg); 872 return SubRC->getRegister(Index + Channel); 873 } 874 875 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const { 876 return OpType == AMDGPU::OPERAND_REG_IMM32; 877 } 878 879 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const { 880 if (opCanUseLiteralConstant(OpType)) 881 return true; 882 883 return OpType == AMDGPU::OPERAND_REG_INLINE_C; 884 } 885 886 // FIXME: Most of these are flexible with HSA and we don't need to reserve them 887 // as input registers if unused. Whether the dispatch ptr is necessary should be 888 // easy to detect from used intrinsics. Scratch setup is harder to know. 889 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF, 890 enum PreloadedValue Value) const { 891 892 const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); 893 const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>(); 894 (void)ST; 895 switch (Value) { 896 case SIRegisterInfo::WORKGROUP_ID_X: 897 assert(MFI->hasWorkGroupIDX()); 898 return MFI->WorkGroupIDXSystemSGPR; 899 case SIRegisterInfo::WORKGROUP_ID_Y: 900 assert(MFI->hasWorkGroupIDY()); 901 return MFI->WorkGroupIDYSystemSGPR; 902 case SIRegisterInfo::WORKGROUP_ID_Z: 903 assert(MFI->hasWorkGroupIDZ()); 904 return MFI->WorkGroupIDZSystemSGPR; 905 case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET: 906 return MFI->PrivateSegmentWaveByteOffsetSystemSGPR; 907 case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER: 908 assert(ST.isAmdHsaOS() && "Non-HSA ABI currently uses relocations"); 909 assert(MFI->hasPrivateSegmentBuffer()); 910 return MFI->PrivateSegmentBufferUserSGPR; 911 case SIRegisterInfo::KERNARG_SEGMENT_PTR: 912 assert(MFI->hasKernargSegmentPtr()); 913 return MFI->KernargSegmentPtrUserSGPR; 914 case SIRegisterInfo::DISPATCH_ID: 915 llvm_unreachable("unimplemented"); 916 case SIRegisterInfo::FLAT_SCRATCH_INIT: 917 assert(MFI->hasFlatScratchInit()); 918 return MFI->FlatScratchInitUserSGPR; 919 case SIRegisterInfo::DISPATCH_PTR: 920 assert(MFI->hasDispatchPtr()); 921 return MFI->DispatchPtrUserSGPR; 922 case SIRegisterInfo::QUEUE_PTR: 923 assert(MFI->hasQueuePtr()); 924 return MFI->QueuePtrUserSGPR; 925 case SIRegisterInfo::WORKITEM_ID_X: 926 assert(MFI->hasWorkItemIDX()); 927 return AMDGPU::VGPR0; 928 case SIRegisterInfo::WORKITEM_ID_Y: 929 assert(MFI->hasWorkItemIDY()); 930 return AMDGPU::VGPR1; 931 case SIRegisterInfo::WORKITEM_ID_Z: 932 assert(MFI->hasWorkItemIDZ()); 933 return AMDGPU::VGPR2; 934 } 935 llvm_unreachable("unexpected preloaded value type"); 936 } 937 938 /// \brief Returns a register that is not used at any point in the function. 939 /// If all registers are used, then this function will return 940 // AMDGPU::NoRegister. 941 unsigned SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI, 942 const TargetRegisterClass *RC) const { 943 for (unsigned Reg : *RC) 944 if (!MRI.isPhysRegUsed(Reg)) 945 return Reg; 946 return AMDGPU::NoRegister; 947 } 948 949 unsigned SIRegisterInfo::getNumVGPRsAllowed(unsigned WaveCount) const { 950 switch(WaveCount) { 951 case 10: return 24; 952 case 9: return 28; 953 case 8: return 32; 954 case 7: return 36; 955 case 6: return 40; 956 case 5: return 48; 957 case 4: return 64; 958 case 3: return 84; 959 case 2: return 128; 960 default: return 256; 961 } 962 } 963 964 unsigned SIRegisterInfo::getNumSGPRsAllowed(AMDGPUSubtarget::Generation gen, 965 unsigned WaveCount) const { 966 if (gen >= AMDGPUSubtarget::VOLCANIC_ISLANDS) { 967 switch (WaveCount) { 968 case 10: return 80; 969 case 9: return 80; 970 case 8: return 96; 971 default: return 102; 972 } 973 } else { 974 switch(WaveCount) { 975 case 10: return 48; 976 case 9: return 56; 977 case 8: return 64; 978 case 7: return 72; 979 case 6: return 80; 980 case 5: return 96; 981 default: return 103; 982 } 983 } 984 } 985 986 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI, 987 unsigned Reg) const { 988 const TargetRegisterClass *RC; 989 if (TargetRegisterInfo::isVirtualRegister(Reg)) 990 RC = MRI.getRegClass(Reg); 991 else 992 RC = getPhysRegClass(Reg); 993 994 return hasVGPRs(RC); 995 } 996