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