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