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