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 bool hasPressureSet(const int *PSets, unsigned PSetID) {
27   for (unsigned i = 0; PSets[i] != -1; ++i) {
28     if (PSets[i] == (int)PSetID)
29       return true;
30   }
31   return false;
32 }
33 
34 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg,
35                                          BitVector &PressureSets) const {
36   for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) {
37     const int *PSets = getRegUnitPressureSets(*U);
38     if (hasPressureSet(PSets, PSetID)) {
39       PressureSets.set(PSetID);
40       break;
41     }
42   }
43 }
44 
45 SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo(),
46                                    SGPRPressureSets(getNumRegPressureSets()),
47                                    VGPRPressureSets(getNumRegPressureSets()) {
48   unsigned NumRegPressureSets = getNumRegPressureSets();
49 
50   SGPR32SetID = NumRegPressureSets;
51   VGPR32SetID = NumRegPressureSets;
52   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
53     if (strncmp("SGPR_32", getRegPressureSetName(i), 7) == 0)
54       SGPR32SetID = i;
55     else if (strncmp("VGPR_32", getRegPressureSetName(i), 7) == 0)
56       VGPR32SetID = i;
57 
58     classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets);
59     classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets);
60   }
61   assert(SGPR32SetID < NumRegPressureSets &&
62          VGPR32SetID < NumRegPressureSets);
63 }
64 
65 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const {
66   MCRegAliasIterator R(Reg, this, true);
67 
68   for (; R.isValid(); ++R)
69     Reserved.set(*R);
70 }
71 
72 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
73   const MachineFunction &MF) const {
74   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
75   if (ST.hasSGPRInitBug()) {
76     // Leave space for flat_scr, xnack_mask, vcc, and alignment
77     unsigned BaseIdx = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 8 - 4;
78     unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
79     return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass);
80   }
81 
82   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
83     // 96/97 need to be reserved for flat_scr, 98/99 for xnack_mask, and
84     // 100/101 for vcc. This is the next sgpr128 down.
85     return AMDGPU::SGPR92_SGPR93_SGPR94_SGPR95;
86   }
87 
88   return AMDGPU::SGPR96_SGPR97_SGPR98_SGPR99;
89 }
90 
91 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
92   const MachineFunction &MF) const {
93   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
94   if (ST.hasSGPRInitBug()) {
95     unsigned Idx = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 6 - 1;
96     return AMDGPU::SGPR_32RegClass.getRegister(Idx);
97   }
98 
99   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
100     // Next register before reservations for flat_scr, xnack_mask, vcc,
101     // and scratch resource.
102     return AMDGPU::SGPR91;
103   }
104 
105   return AMDGPU::SGPR95;
106 }
107 
108 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
109   BitVector Reserved(getNumRegs());
110   Reserved.set(AMDGPU::INDIRECT_BASE_ADDR);
111 
112   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
113   // this seems likely to result in bugs, so I'm marking them as reserved.
114   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
115   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
116 
117   // Reserve the last 2 registers so we will always have at least 2 more that
118   // will physically contain VCC.
119   reserveRegisterTuples(Reserved, AMDGPU::SGPR102_SGPR103);
120 
121   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
122 
123   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
124     // SI/CI have 104 SGPRs. VI has 102. We need to shift down the reservation
125     // for VCC/XNACK_MASK/FLAT_SCR.
126     //
127     // TODO The SGPRs that alias to XNACK_MASK could be used as general purpose
128     // SGPRs when the XNACK feature is not used. This is currently not done
129     // because the code that counts SGPRs cannot account for such holes.
130     reserveRegisterTuples(Reserved, AMDGPU::SGPR96_SGPR97);
131     reserveRegisterTuples(Reserved, AMDGPU::SGPR98_SGPR99);
132     reserveRegisterTuples(Reserved, AMDGPU::SGPR100_SGPR101);
133   }
134 
135   // Tonga and Iceland can only allocate a fixed number of SGPRs due
136   // to a hw bug.
137   if (ST.hasSGPRInitBug()) {
138     unsigned NumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
139     // Reserve some SGPRs for FLAT_SCRATCH, XNACK_MASK, and VCC (6 SGPRs).
140     unsigned Limit = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 6;
141 
142     for (unsigned i = Limit; i < NumSGPRs; ++i) {
143       unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
144       reserveRegisterTuples(Reserved, Reg);
145     }
146   }
147 
148   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
149 
150   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
151   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
152     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
153     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
154   }
155 
156   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
157   if (ScratchRSrcReg != AMDGPU::NoRegister) {
158     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
159     // to spill.
160     // TODO: May need to reserve a VGPR if doing LDS spilling.
161     reserveRegisterTuples(Reserved, ScratchRSrcReg);
162     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
163   }
164 
165   return Reserved;
166 }
167 
168 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF,
169                                                 unsigned Idx) const {
170   const AMDGPUSubtarget &STI = MF.getSubtarget<AMDGPUSubtarget>();
171   // FIXME: We should adjust the max number of waves based on LDS size.
172   unsigned SGPRLimit = getNumSGPRsAllowed(STI.getGeneration(),
173                                           STI.getMaxWavesPerCU());
174   unsigned VGPRLimit = getNumVGPRsAllowed(STI.getMaxWavesPerCU());
175 
176   unsigned VSLimit = SGPRLimit + VGPRLimit;
177 
178   if (SGPRPressureSets.test(Idx) && VGPRPressureSets.test(Idx)) {
179     // FIXME: This is a hack. We should never be considering the pressure of
180     // these since no virtual register should ever have this class.
181     return VSLimit;
182   }
183 
184   if (SGPRPressureSets.test(Idx))
185     return SGPRLimit;
186 
187   return VGPRLimit;
188 }
189 
190 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
191   return Fn.getFrameInfo()->hasStackObjects();
192 }
193 
194 bool
195 SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
196   return MF.getFrameInfo()->hasStackObjects();
197 }
198 
199 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
200 
201   switch (Op) {
202   case AMDGPU::SI_SPILL_S512_SAVE:
203   case AMDGPU::SI_SPILL_S512_RESTORE:
204   case AMDGPU::SI_SPILL_V512_SAVE:
205   case AMDGPU::SI_SPILL_V512_RESTORE:
206     return 16;
207   case AMDGPU::SI_SPILL_S256_SAVE:
208   case AMDGPU::SI_SPILL_S256_RESTORE:
209   case AMDGPU::SI_SPILL_V256_SAVE:
210   case AMDGPU::SI_SPILL_V256_RESTORE:
211     return 8;
212   case AMDGPU::SI_SPILL_S128_SAVE:
213   case AMDGPU::SI_SPILL_S128_RESTORE:
214   case AMDGPU::SI_SPILL_V128_SAVE:
215   case AMDGPU::SI_SPILL_V128_RESTORE:
216     return 4;
217   case AMDGPU::SI_SPILL_V96_SAVE:
218   case AMDGPU::SI_SPILL_V96_RESTORE:
219     return 3;
220   case AMDGPU::SI_SPILL_S64_SAVE:
221   case AMDGPU::SI_SPILL_S64_RESTORE:
222   case AMDGPU::SI_SPILL_V64_SAVE:
223   case AMDGPU::SI_SPILL_V64_RESTORE:
224     return 2;
225   case AMDGPU::SI_SPILL_S32_SAVE:
226   case AMDGPU::SI_SPILL_S32_RESTORE:
227   case AMDGPU::SI_SPILL_V32_SAVE:
228   case AMDGPU::SI_SPILL_V32_RESTORE:
229     return 1;
230   default: llvm_unreachable("Invalid spill opcode");
231   }
232 }
233 
234 void SIRegisterInfo::buildScratchLoadStore(MachineBasicBlock::iterator MI,
235                                            unsigned LoadStoreOp,
236                                            unsigned Value,
237                                            unsigned ScratchRsrcReg,
238                                            unsigned ScratchOffset,
239                                            int64_t Offset) const {
240 
241   MachineBasicBlock *MBB = MI->getParent();
242   MachineFunction *MF = MI->getParent()->getParent();
243   MachineRegisterInfo &MRI = MF->getRegInfo();
244   const SIInstrInfo *TII =
245       static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo());
246   LLVMContext &Ctx = MF->getFunction()->getContext();
247   DebugLoc DL = MI->getDebugLoc();
248   bool IsStore = TII->get(LoadStoreOp).mayStore();
249 
250   bool RanOutOfSGPRs = false;
251   bool Scavenged = false;
252   unsigned SOffset = ScratchOffset;
253 
254   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
255   unsigned Size = NumSubRegs * 4;
256 
257   if (!isUInt<12>(Offset + Size)) {
258     SOffset = MRI.createVirtualRegister(&AMDGPU::SGPR_32RegClass);
259     if (SOffset == AMDGPU::NoRegister) {
260       RanOutOfSGPRs = true;
261       SOffset = AMDGPU::SGPR0;
262     } else {
263       Scavenged = true;
264     }
265     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
266             .addReg(ScratchOffset)
267             .addImm(Offset);
268     Offset = 0;
269   }
270 
271   if (RanOutOfSGPRs)
272     Ctx.emitError("Ran out of SGPRs for spilling VGPRS");
273 
274   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += 4) {
275     unsigned SubReg = NumSubRegs > 1 ?
276         getPhysRegSubReg(Value, &AMDGPU::VGPR_32RegClass, i) :
277         Value;
278 
279     unsigned SOffsetRegState = 0;
280     if (i + 1 == e && Scavenged)
281       SOffsetRegState |= RegState::Kill;
282 
283     BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
284       .addReg(SubReg, getDefRegState(!IsStore))
285       .addReg(ScratchRsrcReg)
286       .addReg(SOffset, SOffsetRegState)
287       .addImm(Offset)
288       .addImm(0) // glc
289       .addImm(0) // slc
290       .addImm(0) // tfe
291       .addReg(Value, RegState::Implicit | getDefRegState(!IsStore))
292       .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
293   }
294 }
295 
296 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
297                                         int SPAdj, unsigned FIOperandNum,
298                                         RegScavenger *RS) const {
299   MachineFunction *MF = MI->getParent()->getParent();
300   MachineRegisterInfo &MRI = MF->getRegInfo();
301   MachineBasicBlock *MBB = MI->getParent();
302   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
303   MachineFrameInfo *FrameInfo = MF->getFrameInfo();
304   const SIInstrInfo *TII =
305       static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo());
306   DebugLoc DL = MI->getDebugLoc();
307 
308   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
309   int Index = MI->getOperand(FIOperandNum).getIndex();
310 
311   switch (MI->getOpcode()) {
312     // SGPR register spill
313     case AMDGPU::SI_SPILL_S512_SAVE:
314     case AMDGPU::SI_SPILL_S256_SAVE:
315     case AMDGPU::SI_SPILL_S128_SAVE:
316     case AMDGPU::SI_SPILL_S64_SAVE:
317     case AMDGPU::SI_SPILL_S32_SAVE: {
318       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
319       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
320 
321       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
322         unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(),
323                                            &AMDGPU::SGPR_32RegClass, i);
324         struct SIMachineFunctionInfo::SpilledReg Spill =
325             MFI->getSpilledReg(MF, Index, i);
326 
327         if (Spill.hasReg()) {
328           BuildMI(*MBB, MI, DL,
329                   TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
330                   Spill.VGPR)
331                   .addReg(SubReg)
332                   .addImm(Spill.Lane);
333 
334           // FIXME: Since this spills to another register instead of an actual
335           // frame index, we should delete the frame index when all references to
336           // it are fixed.
337         } else {
338           // Spill SGPR to a frame index.
339           // FIXME we should use S_STORE_DWORD here for VI.
340           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
341                   .addReg(SubReg);
342 
343           unsigned Size = FrameInfo->getObjectSize(Index);
344           unsigned Align = FrameInfo->getObjectAlignment(Index);
345           MachinePointerInfo PtrInfo
346               = MachinePointerInfo::getFixedStack(*MF, Index);
347           MachineMemOperand *MMO
348               = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
349                                          Size, Align);
350           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE))
351                   .addReg(TmpReg)                         // src
352                   .addFrameIndex(Index)                   // frame_idx
353                   .addReg(MFI->getScratchRSrcReg())       // scratch_rsrc
354                   .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset
355                   .addImm(i * 4)                          // offset
356                   .addMemOperand(MMO);
357         }
358       }
359       MI->eraseFromParent();
360       break;
361     }
362 
363     // SGPR register restore
364     case AMDGPU::SI_SPILL_S512_RESTORE:
365     case AMDGPU::SI_SPILL_S256_RESTORE:
366     case AMDGPU::SI_SPILL_S128_RESTORE:
367     case AMDGPU::SI_SPILL_S64_RESTORE:
368     case AMDGPU::SI_SPILL_S32_RESTORE: {
369       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
370       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
371 
372       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
373         unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(),
374                                            &AMDGPU::SGPR_32RegClass, i);
375         struct SIMachineFunctionInfo::SpilledReg Spill =
376             MFI->getSpilledReg(MF, Index, i);
377 
378         if (Spill.hasReg()) {
379           BuildMI(*MBB, MI, DL,
380                   TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
381                   SubReg)
382                   .addReg(Spill.VGPR)
383                   .addImm(Spill.Lane)
384                   .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
385         } else {
386           // Restore SGPR from a stack slot.
387           // FIXME: We should use S_LOAD_DWORD here for VI.
388 
389           unsigned Align = FrameInfo->getObjectAlignment(Index);
390           unsigned Size = FrameInfo->getObjectSize(Index);
391 
392           MachinePointerInfo PtrInfo
393               = MachinePointerInfo::getFixedStack(*MF, Index);
394 
395           MachineMemOperand *MMO = MF->getMachineMemOperand(
396               PtrInfo, MachineMemOperand::MOLoad, Size, Align);
397 
398           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg)
399                   .addFrameIndex(Index)                   // frame_idx
400                   .addReg(MFI->getScratchRSrcReg())       // scratch_rsrc
401                   .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset
402                   .addImm(i * 4)                          // offset
403                   .addMemOperand(MMO);
404           BuildMI(*MBB, MI, DL,
405                   TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32), SubReg)
406                   .addReg(TmpReg)
407                   .addImm(0)
408                   .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
409         }
410       }
411 
412       // TODO: only do this when it is needed
413       switch (MF->getSubtarget<AMDGPUSubtarget>().getGeneration()) {
414       case AMDGPUSubtarget::SOUTHERN_ISLANDS:
415         // "VALU writes SGPR" -> "SMRD reads that SGPR" needs 4 wait states
416         // ("S_NOP 3") on SI
417         TII->insertWaitStates(MI, 4);
418         break;
419       case AMDGPUSubtarget::SEA_ISLANDS:
420         break;
421       default: // VOLCANIC_ISLANDS and later
422         // "VALU writes SGPR -> VMEM reads that SGPR" needs 5 wait states
423         // ("S_NOP 4") on VI and later. This also applies to VALUs which write
424         // VCC, but we're unlikely to see VMEM use VCC.
425         TII->insertWaitStates(MI, 5);
426       }
427 
428       MI->eraseFromParent();
429       break;
430     }
431 
432     // VGPR register spill
433     case AMDGPU::SI_SPILL_V512_SAVE:
434     case AMDGPU::SI_SPILL_V256_SAVE:
435     case AMDGPU::SI_SPILL_V128_SAVE:
436     case AMDGPU::SI_SPILL_V96_SAVE:
437     case AMDGPU::SI_SPILL_V64_SAVE:
438     case AMDGPU::SI_SPILL_V32_SAVE:
439       buildScratchLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
440             TII->getNamedOperand(*MI, AMDGPU::OpName::src)->getReg(),
441             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
442             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
443             FrameInfo->getObjectOffset(Index) +
444             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm());
445       MI->eraseFromParent();
446       break;
447     case AMDGPU::SI_SPILL_V32_RESTORE:
448     case AMDGPU::SI_SPILL_V64_RESTORE:
449     case AMDGPU::SI_SPILL_V96_RESTORE:
450     case AMDGPU::SI_SPILL_V128_RESTORE:
451     case AMDGPU::SI_SPILL_V256_RESTORE:
452     case AMDGPU::SI_SPILL_V512_RESTORE: {
453       buildScratchLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
454             TII->getNamedOperand(*MI, AMDGPU::OpName::dst)->getReg(),
455             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
456             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
457             FrameInfo->getObjectOffset(Index) +
458             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm());
459       MI->eraseFromParent();
460       break;
461     }
462 
463     default: {
464       int64_t Offset = FrameInfo->getObjectOffset(Index);
465       FIOp.ChangeToImmediate(Offset);
466       if (!TII->isImmOperandLegal(MI, FIOperandNum, FIOp)) {
467         unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
468         BuildMI(*MBB, MI, MI->getDebugLoc(),
469                 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
470                 .addImm(Offset);
471         FIOp.ChangeToRegister(TmpReg, false, false, true);
472       }
473     }
474   }
475 }
476 
477 unsigned SIRegisterInfo::getHWRegIndex(unsigned Reg) const {
478   return getEncodingValue(Reg) & 0xff;
479 }
480 
481 // FIXME: This is very slow. It might be worth creating a map from physreg to
482 // register class.
483 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
484   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
485 
486   static const TargetRegisterClass *const BaseClasses[] = {
487     &AMDGPU::VGPR_32RegClass,
488     &AMDGPU::SReg_32RegClass,
489     &AMDGPU::VReg_64RegClass,
490     &AMDGPU::SReg_64RegClass,
491     &AMDGPU::VReg_96RegClass,
492     &AMDGPU::VReg_128RegClass,
493     &AMDGPU::SReg_128RegClass,
494     &AMDGPU::VReg_256RegClass,
495     &AMDGPU::SReg_256RegClass,
496     &AMDGPU::VReg_512RegClass,
497     &AMDGPU::SReg_512RegClass,
498     &AMDGPU::SCC_CLASSRegClass,
499   };
500 
501   for (const TargetRegisterClass *BaseClass : BaseClasses) {
502     if (BaseClass->contains(Reg)) {
503       return BaseClass;
504     }
505   }
506   return nullptr;
507 }
508 
509 // TODO: It might be helpful to have some target specific flags in
510 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
511 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
512   switch (RC->getSize()) {
513   case 0: return false;
514   case 1: return false;
515   case 4:
516     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
517   case 8:
518     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
519   case 12:
520     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
521   case 16:
522     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
523   case 32:
524     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
525   case 64:
526     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
527   default:
528     llvm_unreachable("Invalid register class size");
529   }
530 }
531 
532 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
533                                          const TargetRegisterClass *SRC) const {
534   switch (SRC->getSize()) {
535   case 4:
536     return &AMDGPU::VGPR_32RegClass;
537   case 8:
538     return &AMDGPU::VReg_64RegClass;
539   case 12:
540     return &AMDGPU::VReg_96RegClass;
541   case 16:
542     return &AMDGPU::VReg_128RegClass;
543   case 32:
544     return &AMDGPU::VReg_256RegClass;
545   case 64:
546     return &AMDGPU::VReg_512RegClass;
547   default:
548     llvm_unreachable("Invalid register class size");
549   }
550 }
551 
552 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass(
553                                          const TargetRegisterClass *VRC) const {
554   switch (VRC->getSize()) {
555   case 4:
556     return &AMDGPU::SGPR_32RegClass;
557   case 8:
558     return &AMDGPU::SReg_64RegClass;
559   case 16:
560     return &AMDGPU::SReg_128RegClass;
561   case 32:
562     return &AMDGPU::SReg_256RegClass;
563   case 64:
564     return &AMDGPU::SReg_512RegClass;
565   default:
566     llvm_unreachable("Invalid register class size");
567   }
568 }
569 
570 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
571                          const TargetRegisterClass *RC, unsigned SubIdx) const {
572   if (SubIdx == AMDGPU::NoSubRegister)
573     return RC;
574 
575   // We can assume that each lane corresponds to one 32-bit register.
576   unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx));
577   if (isSGPRClass(RC)) {
578     switch (Count) {
579     case 1:
580       return &AMDGPU::SGPR_32RegClass;
581     case 2:
582       return &AMDGPU::SReg_64RegClass;
583     case 4:
584       return &AMDGPU::SReg_128RegClass;
585     case 8:
586       return &AMDGPU::SReg_256RegClass;
587     case 16: /* fall-through */
588     default:
589       llvm_unreachable("Invalid sub-register class size");
590     }
591   } else {
592     switch (Count) {
593     case 1:
594       return &AMDGPU::VGPR_32RegClass;
595     case 2:
596       return &AMDGPU::VReg_64RegClass;
597     case 3:
598       return &AMDGPU::VReg_96RegClass;
599     case 4:
600       return &AMDGPU::VReg_128RegClass;
601     case 8:
602       return &AMDGPU::VReg_256RegClass;
603     case 16: /* fall-through */
604     default:
605       llvm_unreachable("Invalid sub-register class size");
606     }
607   }
608 }
609 
610 bool SIRegisterInfo::shouldRewriteCopySrc(
611   const TargetRegisterClass *DefRC,
612   unsigned DefSubReg,
613   const TargetRegisterClass *SrcRC,
614   unsigned SrcSubReg) const {
615   // We want to prefer the smallest register class possible, so we don't want to
616   // stop and rewrite on anything that looks like a subregister
617   // extract. Operations mostly don't care about the super register class, so we
618   // only want to stop on the most basic of copies between the smae register
619   // class.
620   //
621   // e.g. if we have something like
622   // vreg0 = ...
623   // vreg1 = ...
624   // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2
625   // vreg3 = COPY vreg2, sub0
626   //
627   // We want to look through the COPY to find:
628   //  => vreg3 = COPY vreg0
629 
630   // Plain copy.
631   return getCommonSubClass(DefRC, SrcRC) != nullptr;
632 }
633 
634 unsigned SIRegisterInfo::getPhysRegSubReg(unsigned Reg,
635                                           const TargetRegisterClass *SubRC,
636                                           unsigned Channel) const {
637 
638   switch (Reg) {
639     case AMDGPU::VCC:
640       switch(Channel) {
641         case 0: return AMDGPU::VCC_LO;
642         case 1: return AMDGPU::VCC_HI;
643         default: llvm_unreachable("Invalid SubIdx for VCC");
644       }
645 
646   case AMDGPU::FLAT_SCR:
647     switch (Channel) {
648     case 0:
649       return AMDGPU::FLAT_SCR_LO;
650     case 1:
651       return AMDGPU::FLAT_SCR_HI;
652     default:
653       llvm_unreachable("Invalid SubIdx for FLAT_SCR");
654     }
655     break;
656 
657   case AMDGPU::EXEC:
658     switch (Channel) {
659     case 0:
660       return AMDGPU::EXEC_LO;
661     case 1:
662       return AMDGPU::EXEC_HI;
663     default:
664       llvm_unreachable("Invalid SubIdx for EXEC");
665     }
666     break;
667   }
668 
669   const TargetRegisterClass *RC = getPhysRegClass(Reg);
670   // 32-bit registers don't have sub-registers, so we can just return the
671   // Reg.  We need to have this check here, because the calculation below
672   // using getHWRegIndex() will fail with special 32-bit registers like
673   // VCC_LO, VCC_HI, EXEC_LO, EXEC_HI and M0.
674   if (RC->getSize() == 4) {
675     assert(Channel == 0);
676     return Reg;
677   }
678 
679   unsigned Index = getHWRegIndex(Reg);
680   return SubRC->getRegister(Index + Channel);
681 }
682 
683 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const {
684   return OpType == AMDGPU::OPERAND_REG_IMM32;
685 }
686 
687 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const {
688   if (opCanUseLiteralConstant(OpType))
689     return true;
690 
691   return OpType == AMDGPU::OPERAND_REG_INLINE_C;
692 }
693 
694 // FIXME: Most of these are flexible with HSA and we don't need to reserve them
695 // as input registers if unused. Whether the dispatch ptr is necessary should be
696 // easy to detect from used intrinsics. Scratch setup is harder to know.
697 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF,
698                                            enum PreloadedValue Value) const {
699 
700   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
701   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
702   (void)ST;
703   switch (Value) {
704   case SIRegisterInfo::WORKGROUP_ID_X:
705     assert(MFI->hasWorkGroupIDX());
706     return MFI->WorkGroupIDXSystemSGPR;
707   case SIRegisterInfo::WORKGROUP_ID_Y:
708     assert(MFI->hasWorkGroupIDY());
709     return MFI->WorkGroupIDYSystemSGPR;
710   case SIRegisterInfo::WORKGROUP_ID_Z:
711     assert(MFI->hasWorkGroupIDZ());
712     return MFI->WorkGroupIDZSystemSGPR;
713   case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:
714     return MFI->PrivateSegmentWaveByteOffsetSystemSGPR;
715   case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER:
716     assert(ST.isAmdHsaOS() && "Non-HSA ABI currently uses relocations");
717     assert(MFI->hasPrivateSegmentBuffer());
718     return MFI->PrivateSegmentBufferUserSGPR;
719   case SIRegisterInfo::KERNARG_SEGMENT_PTR:
720     assert(MFI->hasKernargSegmentPtr());
721     return MFI->KernargSegmentPtrUserSGPR;
722   case SIRegisterInfo::DISPATCH_ID:
723     llvm_unreachable("unimplemented");
724   case SIRegisterInfo::FLAT_SCRATCH_INIT:
725     assert(MFI->hasFlatScratchInit());
726     return MFI->FlatScratchInitUserSGPR;
727   case SIRegisterInfo::DISPATCH_PTR:
728     assert(MFI->hasDispatchPtr());
729     return MFI->DispatchPtrUserSGPR;
730   case SIRegisterInfo::QUEUE_PTR:
731     llvm_unreachable("not implemented");
732   case SIRegisterInfo::WORKITEM_ID_X:
733     assert(MFI->hasWorkItemIDX());
734     return AMDGPU::VGPR0;
735   case SIRegisterInfo::WORKITEM_ID_Y:
736     assert(MFI->hasWorkItemIDY());
737     return AMDGPU::VGPR1;
738   case SIRegisterInfo::WORKITEM_ID_Z:
739     assert(MFI->hasWorkItemIDZ());
740     return AMDGPU::VGPR2;
741   }
742   llvm_unreachable("unexpected preloaded value type");
743 }
744 
745 /// \brief Returns a register that is not used at any point in the function.
746 ///        If all registers are used, then this function will return
747 //         AMDGPU::NoRegister.
748 unsigned SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
749                                            const TargetRegisterClass *RC) const {
750   for (unsigned Reg : *RC)
751     if (!MRI.isPhysRegUsed(Reg))
752       return Reg;
753   return AMDGPU::NoRegister;
754 }
755 
756 unsigned SIRegisterInfo::getNumVGPRsAllowed(unsigned WaveCount) const {
757   switch(WaveCount) {
758     case 10: return 24;
759     case 9:  return 28;
760     case 8:  return 32;
761     case 7:  return 36;
762     case 6:  return 40;
763     case 5:  return 48;
764     case 4:  return 64;
765     case 3:  return 84;
766     case 2:  return 128;
767     default: return 256;
768   }
769 }
770 
771 unsigned SIRegisterInfo::getNumSGPRsAllowed(AMDGPUSubtarget::Generation gen,
772                                             unsigned WaveCount) const {
773   if (gen >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
774     switch (WaveCount) {
775       case 10: return 80;
776       case 9:  return 80;
777       case 8:  return 96;
778       default: return 102;
779     }
780   } else {
781     switch(WaveCount) {
782       case 10: return 48;
783       case 9:  return 56;
784       case 8:  return 64;
785       case 7:  return 72;
786       case 6:  return 80;
787       case 5:  return 96;
788       default: return 103;
789     }
790   }
791 }
792