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 /// SI implementation of the TargetRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "SIRegisterInfo.h"
16 #include "AMDGPURegisterBankInfo.h"
17 #include "AMDGPUSubtarget.h"
18 #include "SIInstrInfo.h"
19 #include "SIMachineFunctionInfo.h"
20 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/RegisterScavenging.h"
24 #include "llvm/IR/Function.h"
25 #include "llvm/IR/LLVMContext.h"
26 
27 using namespace llvm;
28 
29 static bool hasPressureSet(const int *PSets, unsigned PSetID) {
30   for (unsigned i = 0; PSets[i] != -1; ++i) {
31     if (PSets[i] == (int)PSetID)
32       return true;
33   }
34   return false;
35 }
36 
37 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg,
38                                          BitVector &PressureSets) const {
39   for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) {
40     const int *PSets = getRegUnitPressureSets(*U);
41     if (hasPressureSet(PSets, PSetID)) {
42       PressureSets.set(PSetID);
43       break;
44     }
45   }
46 }
47 
48 static cl::opt<bool> EnableSpillSGPRToSMEM(
49   "amdgpu-spill-sgpr-to-smem",
50   cl::desc("Use scalar stores to spill SGPRs if supported by subtarget"),
51   cl::init(false));
52 
53 static cl::opt<bool> EnableSpillSGPRToVGPR(
54   "amdgpu-spill-sgpr-to-vgpr",
55   cl::desc("Enable spilling VGPRs to SGPRs"),
56   cl::ReallyHidden,
57   cl::init(true));
58 
59 SIRegisterInfo::SIRegisterInfo(const GCNSubtarget &ST) :
60   AMDGPURegisterInfo(),
61   SGPRPressureSets(getNumRegPressureSets()),
62   VGPRPressureSets(getNumRegPressureSets()),
63   SpillSGPRToVGPR(false),
64   SpillSGPRToSMEM(false) {
65   if (EnableSpillSGPRToSMEM && ST.hasScalarStores())
66     SpillSGPRToSMEM = true;
67   else if (EnableSpillSGPRToVGPR)
68     SpillSGPRToVGPR = true;
69 
70   unsigned NumRegPressureSets = getNumRegPressureSets();
71 
72   SGPRSetID = NumRegPressureSets;
73   VGPRSetID = NumRegPressureSets;
74 
75   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
76     classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets);
77     classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets);
78   }
79 
80   // Determine the number of reg units for each pressure set.
81   std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0);
82   for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) {
83     const int *PSets = getRegUnitPressureSets(i);
84     for (unsigned j = 0; PSets[j] != -1; ++j) {
85       ++PressureSetRegUnits[PSets[j]];
86     }
87   }
88 
89   unsigned VGPRMax = 0, SGPRMax = 0;
90   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
91     if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) {
92       VGPRSetID = i;
93       VGPRMax = PressureSetRegUnits[i];
94       continue;
95     }
96     if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) {
97       SGPRSetID = i;
98       SGPRMax = PressureSetRegUnits[i];
99     }
100   }
101 
102   assert(SGPRSetID < NumRegPressureSets &&
103          VGPRSetID < NumRegPressureSets);
104 }
105 
106 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
107   const MachineFunction &MF) const {
108 
109   const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
110   unsigned BaseIdx = alignDown(ST.getMaxNumSGPRs(MF), 4) - 4;
111   unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
112   return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass);
113 }
114 
115 static unsigned findPrivateSegmentWaveByteOffsetRegIndex(unsigned RegCount) {
116   unsigned Reg;
117 
118   // Try to place it in a hole after PrivateSegmentBufferReg.
119   if (RegCount & 3) {
120     // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to
121     // alignment constraints, so we have a hole where can put the wave offset.
122     Reg = RegCount - 1;
123   } else {
124     // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the
125     // wave offset before it.
126     Reg = RegCount - 5;
127   }
128 
129   return Reg;
130 }
131 
132 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
133   const MachineFunction &MF) const {
134   const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
135   unsigned Reg = findPrivateSegmentWaveByteOffsetRegIndex(ST.getMaxNumSGPRs(MF));
136   return AMDGPU::SGPR_32RegClass.getRegister(Reg);
137 }
138 
139 unsigned SIRegisterInfo::reservedStackPtrOffsetReg(
140   const MachineFunction &MF) const {
141   return AMDGPU::SGPR32;
142 }
143 
144 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
145   BitVector Reserved(getNumRegs());
146 
147   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
148   // this seems likely to result in bugs, so I'm marking them as reserved.
149   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
150   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
151 
152   // M0 has to be reserved so that llvm accepts it as a live-in into a block.
153   reserveRegisterTuples(Reserved, AMDGPU::M0);
154 
155   // Reserve the memory aperture registers.
156   reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_BASE);
157   reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_LIMIT);
158   reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_BASE);
159   reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_LIMIT);
160 
161   // Reserve xnack_mask registers - support is not implemented in Codegen.
162   reserveRegisterTuples(Reserved, AMDGPU::XNACK_MASK);
163 
164   // Reserve Trap Handler registers - support is not implemented in Codegen.
165   reserveRegisterTuples(Reserved, AMDGPU::TBA);
166   reserveRegisterTuples(Reserved, AMDGPU::TMA);
167   reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1);
168   reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3);
169   reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5);
170   reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7);
171   reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9);
172   reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11);
173   reserveRegisterTuples(Reserved, AMDGPU::TTMP12_TTMP13);
174   reserveRegisterTuples(Reserved, AMDGPU::TTMP14_TTMP15);
175 
176   const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
177 
178   unsigned MaxNumSGPRs = ST.getMaxNumSGPRs(MF);
179   unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
180   for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) {
181     unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
182     reserveRegisterTuples(Reserved, Reg);
183   }
184 
185   unsigned MaxNumVGPRs = ST.getMaxNumVGPRs(MF);
186   unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs();
187   for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) {
188     unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i);
189     reserveRegisterTuples(Reserved, Reg);
190   }
191 
192   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
193 
194   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
195   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
196     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
197     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
198   }
199 
200   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
201   if (ScratchRSrcReg != AMDGPU::NoRegister) {
202     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
203     // to spill.
204     // TODO: May need to reserve a VGPR if doing LDS spilling.
205     reserveRegisterTuples(Reserved, ScratchRSrcReg);
206     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
207   }
208 
209   // We have to assume the SP is needed in case there are calls in the function,
210   // which is detected after the function is lowered. If we aren't really going
211   // to need SP, don't bother reserving it.
212   unsigned StackPtrReg = MFI->getStackPtrOffsetReg();
213 
214   if (StackPtrReg != AMDGPU::NoRegister) {
215     reserveRegisterTuples(Reserved, StackPtrReg);
216     assert(!isSubRegister(ScratchRSrcReg, StackPtrReg));
217   }
218 
219   unsigned FrameReg = MFI->getFrameOffsetReg();
220   if (FrameReg != AMDGPU::NoRegister) {
221     reserveRegisterTuples(Reserved, FrameReg);
222     assert(!isSubRegister(ScratchRSrcReg, FrameReg));
223   }
224 
225   return Reserved;
226 }
227 
228 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
229   const SIMachineFunctionInfo *Info = Fn.getInfo<SIMachineFunctionInfo>();
230   if (Info->isEntryFunction()) {
231     const MachineFrameInfo &MFI = Fn.getFrameInfo();
232     return MFI.hasStackObjects() || MFI.hasCalls();
233   }
234 
235   // May need scavenger for dealing with callee saved registers.
236   return true;
237 }
238 
239 bool SIRegisterInfo::requiresFrameIndexScavenging(
240   const MachineFunction &MF) const {
241   const MachineFrameInfo &MFI = MF.getFrameInfo();
242   if (MFI.hasStackObjects())
243     return true;
244 
245   // May need to deal with callee saved registers.
246   const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>();
247   return !Info->isEntryFunction();
248 }
249 
250 bool SIRegisterInfo::requiresFrameIndexReplacementScavenging(
251   const MachineFunction &MF) const {
252   // m0 is needed for the scalar store offset. m0 is unallocatable, so we can't
253   // create a virtual register for it during frame index elimination, so the
254   // scavenger is directly needed.
255   return MF.getFrameInfo().hasStackObjects() &&
256          MF.getSubtarget<GCNSubtarget>().hasScalarStores() &&
257          MF.getInfo<SIMachineFunctionInfo>()->hasSpilledSGPRs();
258 }
259 
260 bool SIRegisterInfo::requiresVirtualBaseRegisters(
261   const MachineFunction &) const {
262   // There are no special dedicated stack or frame pointers.
263   return true;
264 }
265 
266 bool SIRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
267   // This helps catch bugs as verifier errors.
268   return true;
269 }
270 
271 int64_t SIRegisterInfo::getMUBUFInstrOffset(const MachineInstr *MI) const {
272   assert(SIInstrInfo::isMUBUF(*MI));
273 
274   int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
275                                           AMDGPU::OpName::offset);
276   return MI->getOperand(OffIdx).getImm();
277 }
278 
279 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI,
280                                                  int Idx) const {
281   if (!SIInstrInfo::isMUBUF(*MI))
282     return 0;
283 
284   assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
285                                            AMDGPU::OpName::vaddr) &&
286          "Should never see frame index on non-address operand");
287 
288   return getMUBUFInstrOffset(MI);
289 }
290 
291 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
292   if (!MI->mayLoadOrStore())
293     return false;
294 
295   int64_t FullOffset = Offset + getMUBUFInstrOffset(MI);
296 
297   return !isUInt<12>(FullOffset);
298 }
299 
300 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
301                                                   unsigned BaseReg,
302                                                   int FrameIdx,
303                                                   int64_t Offset) const {
304   MachineBasicBlock::iterator Ins = MBB->begin();
305   DebugLoc DL; // Defaults to "unknown"
306 
307   if (Ins != MBB->end())
308     DL = Ins->getDebugLoc();
309 
310   MachineFunction *MF = MBB->getParent();
311   const GCNSubtarget &Subtarget = MF->getSubtarget<GCNSubtarget>();
312   const SIInstrInfo *TII = Subtarget.getInstrInfo();
313 
314   if (Offset == 0) {
315     BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg)
316       .addFrameIndex(FrameIdx);
317     return;
318   }
319 
320   MachineRegisterInfo &MRI = MF->getRegInfo();
321   unsigned OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
322 
323   unsigned FIReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
324 
325   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
326     .addImm(Offset);
327   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), FIReg)
328     .addFrameIndex(FrameIdx);
329 
330   TII->getAddNoCarry(*MBB, Ins, DL, BaseReg)
331     .addReg(OffsetReg, RegState::Kill)
332     .addReg(FIReg);
333 }
334 
335 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
336                                        int64_t Offset) const {
337 
338   MachineBasicBlock *MBB = MI.getParent();
339   MachineFunction *MF = MBB->getParent();
340   const GCNSubtarget &Subtarget = MF->getSubtarget<GCNSubtarget>();
341   const SIInstrInfo *TII = Subtarget.getInstrInfo();
342 
343 #ifndef NDEBUG
344   // FIXME: Is it possible to be storing a frame index to itself?
345   bool SeenFI = false;
346   for (const MachineOperand &MO: MI.operands()) {
347     if (MO.isFI()) {
348       if (SeenFI)
349         llvm_unreachable("should not see multiple frame indices");
350 
351       SeenFI = true;
352     }
353   }
354 #endif
355 
356   MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr);
357   assert(FIOp && FIOp->isFI() && "frame index must be address operand");
358   assert(TII->isMUBUF(MI));
359   assert(TII->getNamedOperand(MI, AMDGPU::OpName::soffset)->getReg() ==
360          MF->getInfo<SIMachineFunctionInfo>()->getFrameOffsetReg() &&
361          "should only be seeing frame offset relative FrameIndex");
362 
363 
364   MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset);
365   int64_t NewOffset = OffsetOp->getImm() + Offset;
366   assert(isUInt<12>(NewOffset) && "offset should be legal");
367 
368   FIOp->ChangeToRegister(BaseReg, false);
369   OffsetOp->setImm(NewOffset);
370 }
371 
372 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
373                                         unsigned BaseReg,
374                                         int64_t Offset) const {
375   if (!SIInstrInfo::isMUBUF(*MI))
376     return false;
377 
378   int64_t NewOffset = Offset + getMUBUFInstrOffset(MI);
379 
380   return isUInt<12>(NewOffset);
381 }
382 
383 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass(
384   const MachineFunction &MF, unsigned Kind) const {
385   // This is inaccurate. It depends on the instruction and address space. The
386   // only place where we should hit this is for dealing with frame indexes /
387   // private accesses, so this is correct in that case.
388   return &AMDGPU::VGPR_32RegClass;
389 }
390 
391 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
392 
393   switch (Op) {
394   case AMDGPU::SI_SPILL_S512_SAVE:
395   case AMDGPU::SI_SPILL_S512_RESTORE:
396   case AMDGPU::SI_SPILL_V512_SAVE:
397   case AMDGPU::SI_SPILL_V512_RESTORE:
398     return 16;
399   case AMDGPU::SI_SPILL_S256_SAVE:
400   case AMDGPU::SI_SPILL_S256_RESTORE:
401   case AMDGPU::SI_SPILL_V256_SAVE:
402   case AMDGPU::SI_SPILL_V256_RESTORE:
403     return 8;
404   case AMDGPU::SI_SPILL_S128_SAVE:
405   case AMDGPU::SI_SPILL_S128_RESTORE:
406   case AMDGPU::SI_SPILL_V128_SAVE:
407   case AMDGPU::SI_SPILL_V128_RESTORE:
408     return 4;
409   case AMDGPU::SI_SPILL_V96_SAVE:
410   case AMDGPU::SI_SPILL_V96_RESTORE:
411     return 3;
412   case AMDGPU::SI_SPILL_S64_SAVE:
413   case AMDGPU::SI_SPILL_S64_RESTORE:
414   case AMDGPU::SI_SPILL_V64_SAVE:
415   case AMDGPU::SI_SPILL_V64_RESTORE:
416     return 2;
417   case AMDGPU::SI_SPILL_S32_SAVE:
418   case AMDGPU::SI_SPILL_S32_RESTORE:
419   case AMDGPU::SI_SPILL_V32_SAVE:
420   case AMDGPU::SI_SPILL_V32_RESTORE:
421     return 1;
422   default: llvm_unreachable("Invalid spill opcode");
423   }
424 }
425 
426 static int getOffsetMUBUFStore(unsigned Opc) {
427   switch (Opc) {
428   case AMDGPU::BUFFER_STORE_DWORD_OFFEN:
429     return AMDGPU::BUFFER_STORE_DWORD_OFFSET;
430   case AMDGPU::BUFFER_STORE_BYTE_OFFEN:
431     return AMDGPU::BUFFER_STORE_BYTE_OFFSET;
432   case AMDGPU::BUFFER_STORE_SHORT_OFFEN:
433     return AMDGPU::BUFFER_STORE_SHORT_OFFSET;
434   case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN:
435     return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET;
436   case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN:
437     return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET;
438   case AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFEN:
439     return AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFSET;
440   case AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFEN:
441     return AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFSET;
442   default:
443     return -1;
444   }
445 }
446 
447 static int getOffsetMUBUFLoad(unsigned Opc) {
448   switch (Opc) {
449   case AMDGPU::BUFFER_LOAD_DWORD_OFFEN:
450     return AMDGPU::BUFFER_LOAD_DWORD_OFFSET;
451   case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN:
452     return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET;
453   case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN:
454     return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET;
455   case AMDGPU::BUFFER_LOAD_USHORT_OFFEN:
456     return AMDGPU::BUFFER_LOAD_USHORT_OFFSET;
457   case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN:
458     return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET;
459   case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN:
460     return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET;
461   case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN:
462     return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET;
463   case AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFEN:
464     return AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFSET;
465   case AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFEN:
466     return AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFSET;
467   case AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFEN:
468     return AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFSET;
469   case AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFEN:
470     return AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFSET;
471   case AMDGPU::BUFFER_LOAD_SHORT_D16_OFFEN:
472     return AMDGPU::BUFFER_LOAD_SHORT_D16_OFFSET;
473   case AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFEN:
474     return AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFSET;
475   default:
476     return -1;
477   }
478 }
479 
480 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not
481 // need to handle the case where an SGPR may need to be spilled while spilling.
482 static bool buildMUBUFOffsetLoadStore(const SIInstrInfo *TII,
483                                       MachineFrameInfo &MFI,
484                                       MachineBasicBlock::iterator MI,
485                                       int Index,
486                                       int64_t Offset) {
487   MachineBasicBlock *MBB = MI->getParent();
488   const DebugLoc &DL = MI->getDebugLoc();
489   bool IsStore = MI->mayStore();
490 
491   unsigned Opc = MI->getOpcode();
492   int LoadStoreOp = IsStore ?
493     getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc);
494   if (LoadStoreOp == -1)
495     return false;
496 
497   const MachineOperand *Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata);
498   MachineInstrBuilder NewMI = BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
499     .add(*Reg)
500     .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc))
501     .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset))
502     .addImm(Offset)
503     .addImm(0) // glc
504     .addImm(0) // slc
505     .addImm(0) // tfe
506     .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
507 
508   const MachineOperand *VDataIn = TII->getNamedOperand(*MI,
509                                                        AMDGPU::OpName::vdata_in);
510   if (VDataIn)
511     NewMI.add(*VDataIn);
512   return true;
513 }
514 
515 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI,
516                                          unsigned LoadStoreOp,
517                                          int Index,
518                                          unsigned ValueReg,
519                                          bool IsKill,
520                                          unsigned ScratchRsrcReg,
521                                          unsigned ScratchOffsetReg,
522                                          int64_t InstOffset,
523                                          MachineMemOperand *MMO,
524                                          RegScavenger *RS) const {
525   MachineBasicBlock *MBB = MI->getParent();
526   MachineFunction *MF = MI->getParent()->getParent();
527   const GCNSubtarget &ST =  MF->getSubtarget<GCNSubtarget>();
528   const SIInstrInfo *TII = ST.getInstrInfo();
529   const MachineFrameInfo &MFI = MF->getFrameInfo();
530 
531   const MCInstrDesc &Desc = TII->get(LoadStoreOp);
532   const DebugLoc &DL = MI->getDebugLoc();
533   bool IsStore = Desc.mayStore();
534 
535   bool RanOutOfSGPRs = false;
536   bool Scavenged = false;
537   unsigned SOffset = ScratchOffsetReg;
538 
539   const TargetRegisterClass *RC = getRegClassForReg(MF->getRegInfo(), ValueReg);
540   unsigned NumSubRegs = AMDGPU::getRegBitWidth(RC->getID()) / 32;
541   unsigned Size = NumSubRegs * 4;
542   int64_t Offset = InstOffset + MFI.getObjectOffset(Index);
543   const int64_t OriginalImmOffset = Offset;
544 
545   unsigned Align = MFI.getObjectAlignment(Index);
546   const MachinePointerInfo &BasePtrInfo = MMO->getPointerInfo();
547 
548   if (!isUInt<12>(Offset + Size)) {
549     SOffset = AMDGPU::NoRegister;
550 
551     // We don't have access to the register scavenger if this function is called
552     // during  PEI::scavengeFrameVirtualRegs().
553     if (RS)
554       SOffset = RS->FindUnusedReg(&AMDGPU::SGPR_32RegClass);
555 
556     if (SOffset == AMDGPU::NoRegister) {
557       // There are no free SGPRs, and since we are in the process of spilling
558       // VGPRs too.  Since we need a VGPR in order to spill SGPRs (this is true
559       // on SI/CI and on VI it is true until we implement spilling using scalar
560       // stores), we have no way to free up an SGPR.  Our solution here is to
561       // add the offset directly to the ScratchOffset register, and then
562       // subtract the offset after the spill to return ScratchOffset to it's
563       // original value.
564       RanOutOfSGPRs = true;
565       SOffset = ScratchOffsetReg;
566     } else {
567       Scavenged = true;
568     }
569 
570     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
571       .addReg(ScratchOffsetReg)
572       .addImm(Offset);
573 
574     Offset = 0;
575   }
576 
577   const unsigned EltSize = 4;
578 
579   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += EltSize) {
580     unsigned SubReg = NumSubRegs == 1 ?
581       ValueReg : getSubReg(ValueReg, getSubRegFromChannel(i));
582 
583     unsigned SOffsetRegState = 0;
584     unsigned SrcDstRegState = getDefRegState(!IsStore);
585     if (i + 1 == e) {
586       SOffsetRegState |= getKillRegState(Scavenged);
587       // The last implicit use carries the "Kill" flag.
588       SrcDstRegState |= getKillRegState(IsKill);
589     }
590 
591     MachinePointerInfo PInfo = BasePtrInfo.getWithOffset(EltSize * i);
592     MachineMemOperand *NewMMO
593       = MF->getMachineMemOperand(PInfo, MMO->getFlags(),
594                                  EltSize, MinAlign(Align, EltSize * i));
595 
596     auto MIB = BuildMI(*MBB, MI, DL, Desc)
597       .addReg(SubReg, getDefRegState(!IsStore) | getKillRegState(IsKill))
598       .addReg(ScratchRsrcReg)
599       .addReg(SOffset, SOffsetRegState)
600       .addImm(Offset)
601       .addImm(0) // glc
602       .addImm(0) // slc
603       .addImm(0) // tfe
604       .addMemOperand(NewMMO);
605 
606     if (NumSubRegs > 1)
607       MIB.addReg(ValueReg, RegState::Implicit | SrcDstRegState);
608   }
609 
610   if (RanOutOfSGPRs) {
611     // Subtract the offset we added to the ScratchOffset register.
612     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffsetReg)
613       .addReg(ScratchOffsetReg)
614       .addImm(OriginalImmOffset);
615   }
616 }
617 
618 static std::pair<unsigned, unsigned> getSpillEltSize(unsigned SuperRegSize,
619                                                      bool Store) {
620   if (SuperRegSize % 16 == 0) {
621     return { 16, Store ? AMDGPU::S_BUFFER_STORE_DWORDX4_SGPR :
622                          AMDGPU::S_BUFFER_LOAD_DWORDX4_SGPR };
623   }
624 
625   if (SuperRegSize % 8 == 0) {
626     return { 8, Store ? AMDGPU::S_BUFFER_STORE_DWORDX2_SGPR :
627                         AMDGPU::S_BUFFER_LOAD_DWORDX2_SGPR };
628   }
629 
630   return { 4, Store ? AMDGPU::S_BUFFER_STORE_DWORD_SGPR :
631                       AMDGPU::S_BUFFER_LOAD_DWORD_SGPR};
632 }
633 
634 bool SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI,
635                                int Index,
636                                RegScavenger *RS,
637                                bool OnlyToVGPR) const {
638   MachineBasicBlock *MBB = MI->getParent();
639   MachineFunction *MF = MBB->getParent();
640   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
641   DenseSet<unsigned> SGPRSpillVGPRDefinedSet;
642 
643   ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills
644     = MFI->getSGPRToVGPRSpills(Index);
645   bool SpillToVGPR = !VGPRSpills.empty();
646   if (OnlyToVGPR && !SpillToVGPR)
647     return false;
648 
649   MachineRegisterInfo &MRI = MF->getRegInfo();
650   const GCNSubtarget &ST =  MF->getSubtarget<GCNSubtarget>();
651   const SIInstrInfo *TII = ST.getInstrInfo();
652 
653   unsigned SuperReg = MI->getOperand(0).getReg();
654   bool IsKill = MI->getOperand(0).isKill();
655   const DebugLoc &DL = MI->getDebugLoc();
656 
657   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
658 
659   bool SpillToSMEM = spillSGPRToSMEM();
660   if (SpillToSMEM && OnlyToVGPR)
661     return false;
662 
663   assert(SpillToVGPR || (SuperReg != MFI->getStackPtrOffsetReg() &&
664                          SuperReg != MFI->getFrameOffsetReg() &&
665                          SuperReg != MFI->getScratchWaveOffsetReg()));
666 
667   assert(SuperReg != AMDGPU::M0 && "m0 should never spill");
668 
669   unsigned OffsetReg = AMDGPU::M0;
670   unsigned M0CopyReg = AMDGPU::NoRegister;
671 
672   if (SpillToSMEM) {
673     if (RS->isRegUsed(AMDGPU::M0)) {
674       M0CopyReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
675       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), M0CopyReg)
676         .addReg(AMDGPU::M0);
677     }
678   }
679 
680   unsigned ScalarStoreOp;
681   unsigned EltSize = 4;
682   const TargetRegisterClass *RC = getPhysRegClass(SuperReg);
683   if (SpillToSMEM && isSGPRClass(RC)) {
684     // XXX - if private_element_size is larger than 4 it might be useful to be
685     // able to spill wider vmem spills.
686     std::tie(EltSize, ScalarStoreOp) =
687           getSpillEltSize(getRegSizeInBits(*RC) / 8, true);
688   }
689 
690   ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize);
691   unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size();
692 
693   // SubReg carries the "Kill" flag when SubReg == SuperReg.
694   unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill);
695   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
696     unsigned SubReg = NumSubRegs == 1 ?
697       SuperReg : getSubReg(SuperReg, SplitParts[i]);
698 
699     if (SpillToSMEM) {
700       int64_t FrOffset = FrameInfo.getObjectOffset(Index);
701 
702       // The allocated memory size is really the wavefront size * the frame
703       // index size. The widest register class is 64 bytes, so a 4-byte scratch
704       // allocation is enough to spill this in a single stack object.
705       //
706       // FIXME: Frame size/offsets are computed earlier than this, so the extra
707       // space is still unnecessarily allocated.
708 
709       unsigned Align = FrameInfo.getObjectAlignment(Index);
710       MachinePointerInfo PtrInfo
711         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
712       MachineMemOperand *MMO
713         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
714                                    EltSize, MinAlign(Align, EltSize * i));
715 
716       // SMEM instructions only support a single offset, so increment the wave
717       // offset.
718 
719       int64_t Offset = (ST.getWavefrontSize() * FrOffset) + (EltSize * i);
720       if (Offset != 0) {
721         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg)
722           .addReg(MFI->getFrameOffsetReg())
723           .addImm(Offset);
724       } else {
725         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
726           .addReg(MFI->getFrameOffsetReg());
727       }
728 
729       BuildMI(*MBB, MI, DL, TII->get(ScalarStoreOp))
730         .addReg(SubReg, getKillRegState(IsKill)) // sdata
731         .addReg(MFI->getScratchRSrcReg())        // sbase
732         .addReg(OffsetReg, RegState::Kill)       // soff
733         .addImm(0)                               // glc
734         .addMemOperand(MMO);
735 
736       continue;
737     }
738 
739     if (SpillToVGPR) {
740       SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i];
741 
742       // During SGPR spilling to VGPR, determine if the VGPR is defined. The
743       // only circumstance in which we say it is undefined is when it is the
744       // first spill to this VGPR in the first basic block.
745       bool VGPRDefined = true;
746       if (MBB == &MF->front())
747         VGPRDefined = !SGPRSpillVGPRDefinedSet.insert(Spill.VGPR).second;
748 
749       // Mark the "old value of vgpr" input undef only if this is the first sgpr
750       // spill to this specific vgpr in the first basic block.
751       BuildMI(*MBB, MI, DL,
752               TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
753               Spill.VGPR)
754         .addReg(SubReg, getKillRegState(IsKill))
755         .addImm(Spill.Lane)
756         .addReg(Spill.VGPR, VGPRDefined ? 0 : RegState::Undef);
757 
758       // FIXME: Since this spills to another register instead of an actual
759       // frame index, we should delete the frame index when all references to
760       // it are fixed.
761     } else {
762       // XXX - Can to VGPR spill fail for some subregisters but not others?
763       if (OnlyToVGPR)
764         return false;
765 
766       // Spill SGPR to a frame index.
767       // TODO: Should VI try to spill to VGPR and then spill to SMEM?
768       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
769       // TODO: Should VI try to spill to VGPR and then spill to SMEM?
770 
771       MachineInstrBuilder Mov
772         = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
773         .addReg(SubReg, SubKillState);
774 
775 
776       // There could be undef components of a spilled super register.
777       // TODO: Can we detect this and skip the spill?
778       if (NumSubRegs > 1) {
779         // The last implicit use of the SuperReg carries the "Kill" flag.
780         unsigned SuperKillState = 0;
781         if (i + 1 == e)
782           SuperKillState |= getKillRegState(IsKill);
783         Mov.addReg(SuperReg, RegState::Implicit | SuperKillState);
784       }
785 
786       unsigned Align = FrameInfo.getObjectAlignment(Index);
787       MachinePointerInfo PtrInfo
788         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
789       MachineMemOperand *MMO
790         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
791                                    EltSize, MinAlign(Align, EltSize * i));
792       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE))
793         .addReg(TmpReg, RegState::Kill)    // src
794         .addFrameIndex(Index)              // vaddr
795         .addReg(MFI->getScratchRSrcReg())  // srrsrc
796         .addReg(MFI->getFrameOffsetReg())  // soffset
797         .addImm(i * 4)                     // offset
798         .addMemOperand(MMO);
799     }
800   }
801 
802   if (M0CopyReg != AMDGPU::NoRegister) {
803     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), AMDGPU::M0)
804       .addReg(M0CopyReg, RegState::Kill);
805   }
806 
807   MI->eraseFromParent();
808   MFI->addToSpilledSGPRs(NumSubRegs);
809   return true;
810 }
811 
812 bool SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI,
813                                  int Index,
814                                  RegScavenger *RS,
815                                  bool OnlyToVGPR) const {
816   MachineFunction *MF = MI->getParent()->getParent();
817   MachineRegisterInfo &MRI = MF->getRegInfo();
818   MachineBasicBlock *MBB = MI->getParent();
819   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
820 
821   ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills
822     = MFI->getSGPRToVGPRSpills(Index);
823   bool SpillToVGPR = !VGPRSpills.empty();
824   if (OnlyToVGPR && !SpillToVGPR)
825     return false;
826 
827   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
828   const GCNSubtarget &ST =  MF->getSubtarget<GCNSubtarget>();
829   const SIInstrInfo *TII = ST.getInstrInfo();
830   const DebugLoc &DL = MI->getDebugLoc();
831 
832   unsigned SuperReg = MI->getOperand(0).getReg();
833   bool SpillToSMEM = spillSGPRToSMEM();
834   if (SpillToSMEM && OnlyToVGPR)
835     return false;
836 
837   assert(SuperReg != AMDGPU::M0 && "m0 should never spill");
838 
839   unsigned OffsetReg = AMDGPU::M0;
840   unsigned M0CopyReg = AMDGPU::NoRegister;
841 
842   if (SpillToSMEM) {
843     if (RS->isRegUsed(AMDGPU::M0)) {
844       M0CopyReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
845       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), M0CopyReg)
846         .addReg(AMDGPU::M0);
847     }
848   }
849 
850   unsigned EltSize = 4;
851   unsigned ScalarLoadOp;
852 
853   const TargetRegisterClass *RC = getPhysRegClass(SuperReg);
854   if (SpillToSMEM && isSGPRClass(RC)) {
855     // XXX - if private_element_size is larger than 4 it might be useful to be
856     // able to spill wider vmem spills.
857     std::tie(EltSize, ScalarLoadOp) =
858           getSpillEltSize(getRegSizeInBits(*RC) / 8, false);
859   }
860 
861   ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize);
862   unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size();
863 
864   // SubReg carries the "Kill" flag when SubReg == SuperReg.
865   int64_t FrOffset = FrameInfo.getObjectOffset(Index);
866 
867   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
868     unsigned SubReg = NumSubRegs == 1 ?
869       SuperReg : getSubReg(SuperReg, SplitParts[i]);
870 
871     if (SpillToSMEM) {
872       // FIXME: Size may be > 4 but extra bytes wasted.
873       unsigned Align = FrameInfo.getObjectAlignment(Index);
874       MachinePointerInfo PtrInfo
875         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
876       MachineMemOperand *MMO
877         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
878                                    EltSize, MinAlign(Align, EltSize * i));
879 
880       // Add i * 4 offset
881       int64_t Offset = (ST.getWavefrontSize() * FrOffset) + (EltSize * i);
882       if (Offset != 0) {
883         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg)
884           .addReg(MFI->getFrameOffsetReg())
885           .addImm(Offset);
886       } else {
887         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
888           .addReg(MFI->getFrameOffsetReg());
889       }
890 
891       auto MIB =
892         BuildMI(*MBB, MI, DL, TII->get(ScalarLoadOp), SubReg)
893         .addReg(MFI->getScratchRSrcReg()) // sbase
894         .addReg(OffsetReg, RegState::Kill)                // soff
895         .addImm(0)                        // glc
896         .addMemOperand(MMO);
897 
898       if (NumSubRegs > 1)
899         MIB.addReg(SuperReg, RegState::ImplicitDefine);
900 
901       continue;
902     }
903 
904     if (SpillToVGPR) {
905       SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i];
906       auto MIB =
907         BuildMI(*MBB, MI, DL, TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
908                 SubReg)
909         .addReg(Spill.VGPR)
910         .addImm(Spill.Lane);
911 
912       if (NumSubRegs > 1)
913         MIB.addReg(SuperReg, RegState::ImplicitDefine);
914     } else {
915       if (OnlyToVGPR)
916         return false;
917 
918       // Restore SGPR from a stack slot.
919       // FIXME: We should use S_LOAD_DWORD here for VI.
920       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
921       unsigned Align = FrameInfo.getObjectAlignment(Index);
922 
923       MachinePointerInfo PtrInfo
924         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
925 
926       MachineMemOperand *MMO = MF->getMachineMemOperand(PtrInfo,
927         MachineMemOperand::MOLoad, EltSize,
928         MinAlign(Align, EltSize * i));
929 
930       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg)
931         .addFrameIndex(Index)              // vaddr
932         .addReg(MFI->getScratchRSrcReg())  // srsrc
933         .addReg(MFI->getFrameOffsetReg())  // soffset
934         .addImm(i * 4)                     // offset
935         .addMemOperand(MMO);
936 
937       auto MIB =
938         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg)
939         .addReg(TmpReg, RegState::Kill);
940 
941       if (NumSubRegs > 1)
942         MIB.addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
943     }
944   }
945 
946   if (M0CopyReg != AMDGPU::NoRegister) {
947     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), AMDGPU::M0)
948       .addReg(M0CopyReg, RegState::Kill);
949   }
950 
951   MI->eraseFromParent();
952   return true;
953 }
954 
955 /// Special case of eliminateFrameIndex. Returns true if the SGPR was spilled to
956 /// a VGPR and the stack slot can be safely eliminated when all other users are
957 /// handled.
958 bool SIRegisterInfo::eliminateSGPRToVGPRSpillFrameIndex(
959   MachineBasicBlock::iterator MI,
960   int FI,
961   RegScavenger *RS) const {
962   switch (MI->getOpcode()) {
963   case AMDGPU::SI_SPILL_S512_SAVE:
964   case AMDGPU::SI_SPILL_S256_SAVE:
965   case AMDGPU::SI_SPILL_S128_SAVE:
966   case AMDGPU::SI_SPILL_S64_SAVE:
967   case AMDGPU::SI_SPILL_S32_SAVE:
968     return spillSGPR(MI, FI, RS, true);
969   case AMDGPU::SI_SPILL_S512_RESTORE:
970   case AMDGPU::SI_SPILL_S256_RESTORE:
971   case AMDGPU::SI_SPILL_S128_RESTORE:
972   case AMDGPU::SI_SPILL_S64_RESTORE:
973   case AMDGPU::SI_SPILL_S32_RESTORE:
974     return restoreSGPR(MI, FI, RS, true);
975   default:
976     llvm_unreachable("not an SGPR spill instruction");
977   }
978 }
979 
980 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
981                                         int SPAdj, unsigned FIOperandNum,
982                                         RegScavenger *RS) const {
983   MachineFunction *MF = MI->getParent()->getParent();
984   MachineRegisterInfo &MRI = MF->getRegInfo();
985   MachineBasicBlock *MBB = MI->getParent();
986   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
987   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
988   const GCNSubtarget &ST =  MF->getSubtarget<GCNSubtarget>();
989   const SIInstrInfo *TII = ST.getInstrInfo();
990   DebugLoc DL = MI->getDebugLoc();
991 
992   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
993   int Index = MI->getOperand(FIOperandNum).getIndex();
994 
995   switch (MI->getOpcode()) {
996     // SGPR register spill
997     case AMDGPU::SI_SPILL_S512_SAVE:
998     case AMDGPU::SI_SPILL_S256_SAVE:
999     case AMDGPU::SI_SPILL_S128_SAVE:
1000     case AMDGPU::SI_SPILL_S64_SAVE:
1001     case AMDGPU::SI_SPILL_S32_SAVE: {
1002       spillSGPR(MI, Index, RS);
1003       break;
1004     }
1005 
1006     // SGPR register restore
1007     case AMDGPU::SI_SPILL_S512_RESTORE:
1008     case AMDGPU::SI_SPILL_S256_RESTORE:
1009     case AMDGPU::SI_SPILL_S128_RESTORE:
1010     case AMDGPU::SI_SPILL_S64_RESTORE:
1011     case AMDGPU::SI_SPILL_S32_RESTORE: {
1012       restoreSGPR(MI, Index, RS);
1013       break;
1014     }
1015 
1016     // VGPR register spill
1017     case AMDGPU::SI_SPILL_V512_SAVE:
1018     case AMDGPU::SI_SPILL_V256_SAVE:
1019     case AMDGPU::SI_SPILL_V128_SAVE:
1020     case AMDGPU::SI_SPILL_V96_SAVE:
1021     case AMDGPU::SI_SPILL_V64_SAVE:
1022     case AMDGPU::SI_SPILL_V32_SAVE: {
1023       const MachineOperand *VData = TII->getNamedOperand(*MI,
1024                                                          AMDGPU::OpName::vdata);
1025       buildSpillLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
1026             Index,
1027             VData->getReg(), VData->isKill(),
1028             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
1029             TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(),
1030             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(),
1031             *MI->memoperands_begin(),
1032             RS);
1033       MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode()));
1034       MI->eraseFromParent();
1035       break;
1036     }
1037     case AMDGPU::SI_SPILL_V32_RESTORE:
1038     case AMDGPU::SI_SPILL_V64_RESTORE:
1039     case AMDGPU::SI_SPILL_V96_RESTORE:
1040     case AMDGPU::SI_SPILL_V128_RESTORE:
1041     case AMDGPU::SI_SPILL_V256_RESTORE:
1042     case AMDGPU::SI_SPILL_V512_RESTORE: {
1043       const MachineOperand *VData = TII->getNamedOperand(*MI,
1044                                                          AMDGPU::OpName::vdata);
1045 
1046       buildSpillLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
1047             Index,
1048             VData->getReg(), VData->isKill(),
1049             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
1050             TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(),
1051             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(),
1052             *MI->memoperands_begin(),
1053             RS);
1054       MI->eraseFromParent();
1055       break;
1056     }
1057 
1058     default: {
1059       const DebugLoc &DL = MI->getDebugLoc();
1060       bool IsMUBUF = TII->isMUBUF(*MI);
1061 
1062       if (!IsMUBUF &&
1063           MFI->getFrameOffsetReg() != MFI->getScratchWaveOffsetReg()) {
1064         // Convert to an absolute stack address by finding the offset from the
1065         // scratch wave base and scaling by the wave size.
1066         //
1067         // In an entry function/kernel the stack address is already the
1068         // absolute address relative to the scratch wave offset.
1069 
1070         unsigned DiffReg
1071           = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
1072 
1073         bool IsCopy = MI->getOpcode() == AMDGPU::V_MOV_B32_e32;
1074         unsigned ResultReg = IsCopy ?
1075           MI->getOperand(0).getReg() :
1076           MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1077 
1078         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), DiffReg)
1079           .addReg(MFI->getFrameOffsetReg())
1080           .addReg(MFI->getScratchWaveOffsetReg());
1081 
1082         int64_t Offset = FrameInfo.getObjectOffset(Index);
1083         if (Offset == 0) {
1084           // XXX - This never happens because of emergency scavenging slot at 0?
1085           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ResultReg)
1086             .addImm(Log2_32(ST.getWavefrontSize()))
1087             .addReg(DiffReg);
1088         } else {
1089           unsigned ScaledReg
1090             = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1091 
1092           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ScaledReg)
1093             .addImm(Log2_32(ST.getWavefrontSize()))
1094             .addReg(DiffReg, RegState::Kill);
1095 
1096           // TODO: Fold if use instruction is another add of a constant.
1097           if (AMDGPU::isInlinableLiteral32(Offset, ST.hasInv2PiInlineImm())) {
1098             TII->getAddNoCarry(*MBB, MI, DL, ResultReg)
1099               .addImm(Offset)
1100               .addReg(ScaledReg, RegState::Kill);
1101           } else {
1102             unsigned ConstOffsetReg
1103               = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
1104 
1105             BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), ConstOffsetReg)
1106               .addImm(Offset);
1107             TII->getAddNoCarry(*MBB, MI, DL, ResultReg)
1108               .addReg(ConstOffsetReg, RegState::Kill)
1109               .addReg(ScaledReg, RegState::Kill);
1110           }
1111         }
1112 
1113         // Don't introduce an extra copy if we're just materializing in a mov.
1114         if (IsCopy)
1115           MI->eraseFromParent();
1116         else
1117           FIOp.ChangeToRegister(ResultReg, false, false, true);
1118         return;
1119       }
1120 
1121       if (IsMUBUF) {
1122         // Disable offen so we don't need a 0 vgpr base.
1123         assert(static_cast<int>(FIOperandNum) ==
1124                AMDGPU::getNamedOperandIdx(MI->getOpcode(),
1125                                           AMDGPU::OpName::vaddr));
1126 
1127         assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg()
1128                == MFI->getFrameOffsetReg());
1129 
1130         int64_t Offset = FrameInfo.getObjectOffset(Index);
1131         int64_t OldImm
1132           = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm();
1133         int64_t NewOffset = OldImm + Offset;
1134 
1135         if (isUInt<12>(NewOffset) &&
1136             buildMUBUFOffsetLoadStore(TII, FrameInfo, MI, Index, NewOffset)) {
1137           MI->eraseFromParent();
1138           return;
1139         }
1140       }
1141 
1142       // If the offset is simply too big, don't convert to a scratch wave offset
1143       // relative index.
1144 
1145       int64_t Offset = FrameInfo.getObjectOffset(Index);
1146       FIOp.ChangeToImmediate(Offset);
1147       if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) {
1148         unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1149         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
1150           .addImm(Offset);
1151         FIOp.ChangeToRegister(TmpReg, false, false, true);
1152       }
1153     }
1154   }
1155 }
1156 
1157 StringRef SIRegisterInfo::getRegAsmName(unsigned Reg) const {
1158   #define AMDGPU_REG_ASM_NAMES
1159   #include "AMDGPURegAsmNames.inc.cpp"
1160 
1161   #define REG_RANGE(BeginReg, EndReg, RegTable)            \
1162     if (Reg >= BeginReg && Reg <= EndReg) {                \
1163       unsigned Index = Reg - BeginReg;                     \
1164       assert(Index < array_lengthof(RegTable));            \
1165       return RegTable[Index];                              \
1166     }
1167 
1168   REG_RANGE(AMDGPU::VGPR0, AMDGPU::VGPR255, VGPR32RegNames);
1169   REG_RANGE(AMDGPU::SGPR0, AMDGPU::SGPR103, SGPR32RegNames);
1170   REG_RANGE(AMDGPU::VGPR0_VGPR1, AMDGPU::VGPR254_VGPR255, VGPR64RegNames);
1171   REG_RANGE(AMDGPU::SGPR0_SGPR1, AMDGPU::SGPR102_SGPR103, SGPR64RegNames);
1172   REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2, AMDGPU::VGPR253_VGPR254_VGPR255,
1173             VGPR96RegNames);
1174 
1175   REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3,
1176             AMDGPU::VGPR252_VGPR253_VGPR254_VGPR255,
1177             VGPR128RegNames);
1178   REG_RANGE(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3,
1179             AMDGPU::SGPR100_SGPR101_SGPR102_SGPR103,
1180             SGPR128RegNames);
1181 
1182   REG_RANGE(AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3_VGPR4_VGPR5_VGPR6_VGPR7,
1183             AMDGPU::VGPR248_VGPR249_VGPR250_VGPR251_VGPR252_VGPR253_VGPR254_VGPR255,
1184             VGPR256RegNames);
1185 
1186   REG_RANGE(
1187     AMDGPU::VGPR0_VGPR1_VGPR2_VGPR3_VGPR4_VGPR5_VGPR6_VGPR7_VGPR8_VGPR9_VGPR10_VGPR11_VGPR12_VGPR13_VGPR14_VGPR15,
1188     AMDGPU::VGPR240_VGPR241_VGPR242_VGPR243_VGPR244_VGPR245_VGPR246_VGPR247_VGPR248_VGPR249_VGPR250_VGPR251_VGPR252_VGPR253_VGPR254_VGPR255,
1189     VGPR512RegNames);
1190 
1191   REG_RANGE(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3_SGPR4_SGPR5_SGPR6_SGPR7,
1192             AMDGPU::SGPR96_SGPR97_SGPR98_SGPR99_SGPR100_SGPR101_SGPR102_SGPR103,
1193             SGPR256RegNames);
1194 
1195   REG_RANGE(
1196     AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3_SGPR4_SGPR5_SGPR6_SGPR7_SGPR8_SGPR9_SGPR10_SGPR11_SGPR12_SGPR13_SGPR14_SGPR15,
1197     AMDGPU::SGPR88_SGPR89_SGPR90_SGPR91_SGPR92_SGPR93_SGPR94_SGPR95_SGPR96_SGPR97_SGPR98_SGPR99_SGPR100_SGPR101_SGPR102_SGPR103,
1198     SGPR512RegNames
1199   );
1200 
1201 #undef REG_RANGE
1202 
1203   // FIXME: Rename flat_scr so we don't need to special case this.
1204   switch (Reg) {
1205   case AMDGPU::FLAT_SCR:
1206     return "flat_scratch";
1207   case AMDGPU::FLAT_SCR_LO:
1208     return "flat_scratch_lo";
1209   case AMDGPU::FLAT_SCR_HI:
1210     return "flat_scratch_hi";
1211   default:
1212     // For the special named registers the default is fine.
1213     return TargetRegisterInfo::getRegAsmName(Reg);
1214   }
1215 }
1216 
1217 // FIXME: This is very slow. It might be worth creating a map from physreg to
1218 // register class.
1219 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
1220   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
1221 
1222   static const TargetRegisterClass *const BaseClasses[] = {
1223     &AMDGPU::VGPR_32RegClass,
1224     &AMDGPU::SReg_32RegClass,
1225     &AMDGPU::VReg_64RegClass,
1226     &AMDGPU::SReg_64RegClass,
1227     &AMDGPU::VReg_96RegClass,
1228     &AMDGPU::VReg_128RegClass,
1229     &AMDGPU::SReg_128RegClass,
1230     &AMDGPU::VReg_256RegClass,
1231     &AMDGPU::SReg_256RegClass,
1232     &AMDGPU::VReg_512RegClass,
1233     &AMDGPU::SReg_512RegClass,
1234     &AMDGPU::SCC_CLASSRegClass,
1235     &AMDGPU::Pseudo_SReg_32RegClass,
1236     &AMDGPU::Pseudo_SReg_128RegClass,
1237   };
1238 
1239   for (const TargetRegisterClass *BaseClass : BaseClasses) {
1240     if (BaseClass->contains(Reg)) {
1241       return BaseClass;
1242     }
1243   }
1244   return nullptr;
1245 }
1246 
1247 // TODO: It might be helpful to have some target specific flags in
1248 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
1249 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
1250   unsigned Size = getRegSizeInBits(*RC);
1251   if (Size < 32)
1252     return false;
1253   switch (Size) {
1254   case 32:
1255     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
1256   case 64:
1257     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
1258   case 96:
1259     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
1260   case 128:
1261     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
1262   case 256:
1263     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
1264   case 512:
1265     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
1266   default:
1267     llvm_unreachable("Invalid register class size");
1268   }
1269 }
1270 
1271 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
1272                                          const TargetRegisterClass *SRC) const {
1273   switch (getRegSizeInBits(*SRC)) {
1274   case 32:
1275     return &AMDGPU::VGPR_32RegClass;
1276   case 64:
1277     return &AMDGPU::VReg_64RegClass;
1278   case 96:
1279     return &AMDGPU::VReg_96RegClass;
1280   case 128:
1281     return &AMDGPU::VReg_128RegClass;
1282   case 256:
1283     return &AMDGPU::VReg_256RegClass;
1284   case 512:
1285     return &AMDGPU::VReg_512RegClass;
1286   default:
1287     llvm_unreachable("Invalid register class size");
1288   }
1289 }
1290 
1291 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass(
1292                                          const TargetRegisterClass *VRC) const {
1293   switch (getRegSizeInBits(*VRC)) {
1294   case 32:
1295     return &AMDGPU::SGPR_32RegClass;
1296   case 64:
1297     return &AMDGPU::SReg_64RegClass;
1298   case 128:
1299     return &AMDGPU::SReg_128RegClass;
1300   case 256:
1301     return &AMDGPU::SReg_256RegClass;
1302   case 512:
1303     return &AMDGPU::SReg_512RegClass;
1304   default:
1305     llvm_unreachable("Invalid register class size");
1306   }
1307 }
1308 
1309 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
1310                          const TargetRegisterClass *RC, unsigned SubIdx) const {
1311   if (SubIdx == AMDGPU::NoSubRegister)
1312     return RC;
1313 
1314   // We can assume that each lane corresponds to one 32-bit register.
1315   unsigned Count = getSubRegIndexLaneMask(SubIdx).getNumLanes();
1316   if (isSGPRClass(RC)) {
1317     switch (Count) {
1318     case 1:
1319       return &AMDGPU::SGPR_32RegClass;
1320     case 2:
1321       return &AMDGPU::SReg_64RegClass;
1322     case 4:
1323       return &AMDGPU::SReg_128RegClass;
1324     case 8:
1325       return &AMDGPU::SReg_256RegClass;
1326     case 16: /* fall-through */
1327     default:
1328       llvm_unreachable("Invalid sub-register class size");
1329     }
1330   } else {
1331     switch (Count) {
1332     case 1:
1333       return &AMDGPU::VGPR_32RegClass;
1334     case 2:
1335       return &AMDGPU::VReg_64RegClass;
1336     case 3:
1337       return &AMDGPU::VReg_96RegClass;
1338     case 4:
1339       return &AMDGPU::VReg_128RegClass;
1340     case 8:
1341       return &AMDGPU::VReg_256RegClass;
1342     case 16: /* fall-through */
1343     default:
1344       llvm_unreachable("Invalid sub-register class size");
1345     }
1346   }
1347 }
1348 
1349 bool SIRegisterInfo::shouldRewriteCopySrc(
1350   const TargetRegisterClass *DefRC,
1351   unsigned DefSubReg,
1352   const TargetRegisterClass *SrcRC,
1353   unsigned SrcSubReg) const {
1354   // We want to prefer the smallest register class possible, so we don't want to
1355   // stop and rewrite on anything that looks like a subregister
1356   // extract. Operations mostly don't care about the super register class, so we
1357   // only want to stop on the most basic of copies between the same register
1358   // class.
1359   //
1360   // e.g. if we have something like
1361   // %0 = ...
1362   // %1 = ...
1363   // %2 = REG_SEQUENCE %0, sub0, %1, sub1, %2, sub2
1364   // %3 = COPY %2, sub0
1365   //
1366   // We want to look through the COPY to find:
1367   //  => %3 = COPY %0
1368 
1369   // Plain copy.
1370   return getCommonSubClass(DefRC, SrcRC) != nullptr;
1371 }
1372 
1373 /// Returns a register that is not used at any point in the function.
1374 ///        If all registers are used, then this function will return
1375 //         AMDGPU::NoRegister.
1376 unsigned
1377 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
1378                                    const TargetRegisterClass *RC,
1379                                    const MachineFunction &MF) const {
1380 
1381   for (unsigned Reg : *RC)
1382     if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg))
1383       return Reg;
1384   return AMDGPU::NoRegister;
1385 }
1386 
1387 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC,
1388                                                    unsigned EltSize) const {
1389   if (EltSize == 4) {
1390     static const int16_t Sub0_15[] = {
1391       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1392       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1393       AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11,
1394       AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15,
1395     };
1396 
1397     static const int16_t Sub0_7[] = {
1398       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1399       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1400     };
1401 
1402     static const int16_t Sub0_3[] = {
1403       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1404     };
1405 
1406     static const int16_t Sub0_2[] = {
1407       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2,
1408     };
1409 
1410     static const int16_t Sub0_1[] = {
1411       AMDGPU::sub0, AMDGPU::sub1,
1412     };
1413 
1414     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1415     case 32:
1416       return {};
1417     case 64:
1418       return makeArrayRef(Sub0_1);
1419     case 96:
1420       return makeArrayRef(Sub0_2);
1421     case 128:
1422       return makeArrayRef(Sub0_3);
1423     case 256:
1424       return makeArrayRef(Sub0_7);
1425     case 512:
1426       return makeArrayRef(Sub0_15);
1427     default:
1428       llvm_unreachable("unhandled register size");
1429     }
1430   }
1431 
1432   if (EltSize == 8) {
1433     static const int16_t Sub0_15_64[] = {
1434       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1435       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7,
1436       AMDGPU::sub8_sub9, AMDGPU::sub10_sub11,
1437       AMDGPU::sub12_sub13, AMDGPU::sub14_sub15
1438     };
1439 
1440     static const int16_t Sub0_7_64[] = {
1441       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1442       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7
1443     };
1444 
1445 
1446     static const int16_t Sub0_3_64[] = {
1447       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3
1448     };
1449 
1450     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1451     case 64:
1452       return {};
1453     case 128:
1454       return makeArrayRef(Sub0_3_64);
1455     case 256:
1456       return makeArrayRef(Sub0_7_64);
1457     case 512:
1458       return makeArrayRef(Sub0_15_64);
1459     default:
1460       llvm_unreachable("unhandled register size");
1461     }
1462   }
1463 
1464   assert(EltSize == 16 && "unhandled register spill split size");
1465 
1466   static const int16_t Sub0_15_128[] = {
1467     AMDGPU::sub0_sub1_sub2_sub3,
1468     AMDGPU::sub4_sub5_sub6_sub7,
1469     AMDGPU::sub8_sub9_sub10_sub11,
1470     AMDGPU::sub12_sub13_sub14_sub15
1471   };
1472 
1473   static const int16_t Sub0_7_128[] = {
1474     AMDGPU::sub0_sub1_sub2_sub3,
1475     AMDGPU::sub4_sub5_sub6_sub7
1476   };
1477 
1478   switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1479   case 128:
1480     return {};
1481   case 256:
1482     return makeArrayRef(Sub0_7_128);
1483   case 512:
1484     return makeArrayRef(Sub0_15_128);
1485   default:
1486     llvm_unreachable("unhandled register size");
1487   }
1488 }
1489 
1490 const TargetRegisterClass*
1491 SIRegisterInfo::getRegClassForReg(const MachineRegisterInfo &MRI,
1492                                   unsigned Reg) const {
1493   if (TargetRegisterInfo::isVirtualRegister(Reg))
1494     return  MRI.getRegClass(Reg);
1495 
1496   return getPhysRegClass(Reg);
1497 }
1498 
1499 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI,
1500                             unsigned Reg) const {
1501   const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg);
1502   assert(RC && "Register class for the reg not found");
1503   return hasVGPRs(RC);
1504 }
1505 
1506 bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI,
1507                                     const TargetRegisterClass *SrcRC,
1508                                     unsigned SubReg,
1509                                     const TargetRegisterClass *DstRC,
1510                                     unsigned DstSubReg,
1511                                     const TargetRegisterClass *NewRC,
1512                                     LiveIntervals &LIS) const {
1513   unsigned SrcSize = getRegSizeInBits(*SrcRC);
1514   unsigned DstSize = getRegSizeInBits(*DstRC);
1515   unsigned NewSize = getRegSizeInBits(*NewRC);
1516 
1517   // Do not increase size of registers beyond dword, we would need to allocate
1518   // adjacent registers and constraint regalloc more than needed.
1519 
1520   // Always allow dword coalescing.
1521   if (SrcSize <= 32 || DstSize <= 32)
1522     return true;
1523 
1524   return NewSize <= DstSize || NewSize <= SrcSize;
1525 }
1526 
1527 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
1528                                              MachineFunction &MF) const {
1529 
1530   const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
1531   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
1532 
1533   unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(),
1534                                                        MF.getFunction());
1535   switch (RC->getID()) {
1536   default:
1537     return AMDGPURegisterInfo::getRegPressureLimit(RC, MF);
1538   case AMDGPU::VGPR_32RegClassID:
1539     return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF));
1540   case AMDGPU::SGPR_32RegClassID:
1541     return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF));
1542   }
1543 }
1544 
1545 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF,
1546                                                 unsigned Idx) const {
1547   if (Idx == getVGPRPressureSet())
1548     return getRegPressureLimit(&AMDGPU::VGPR_32RegClass,
1549                                const_cast<MachineFunction &>(MF));
1550 
1551   if (Idx == getSGPRPressureSet())
1552     return getRegPressureLimit(&AMDGPU::SGPR_32RegClass,
1553                                const_cast<MachineFunction &>(MF));
1554 
1555   return AMDGPURegisterInfo::getRegPressureSetLimit(MF, Idx);
1556 }
1557 
1558 const int *SIRegisterInfo::getRegUnitPressureSets(unsigned RegUnit) const {
1559   static const int Empty[] = { -1 };
1560 
1561   if (hasRegUnit(AMDGPU::M0, RegUnit))
1562     return Empty;
1563   return AMDGPURegisterInfo::getRegUnitPressureSets(RegUnit);
1564 }
1565 
1566 unsigned SIRegisterInfo::getReturnAddressReg(const MachineFunction &MF) const {
1567   // Not a callee saved register.
1568   return AMDGPU::SGPR30_SGPR31;
1569 }
1570 
1571 const TargetRegisterClass *
1572 SIRegisterInfo::getConstrainedRegClassForOperand(const MachineOperand &MO,
1573                                          const MachineRegisterInfo &MRI) const {
1574   unsigned Size = getRegSizeInBits(MO.getReg(), MRI);
1575   const RegisterBank *RB = MRI.getRegBankOrNull(MO.getReg());
1576   if (!RB)
1577     return nullptr;
1578 
1579   switch (Size) {
1580   case 32:
1581     return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass :
1582                                                   &AMDGPU::SReg_32_XM0RegClass;
1583   case 64:
1584     return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_64RegClass :
1585                                                    &AMDGPU::SReg_64_XEXECRegClass;
1586   case 96:
1587     return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_96RegClass :
1588                                                   nullptr;
1589   case 128:
1590     return RB->getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_128RegClass :
1591                                                   &AMDGPU::SReg_128RegClass;
1592   default:
1593     llvm_unreachable("not implemented");
1594   }
1595 }
1596