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