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