1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// SI implementation of the TargetRegisterInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "SIRegisterInfo.h"
15 #include "AMDGPURegisterBankInfo.h"
16 #include "AMDGPUSubtarget.h"
17 #include "SIInstrInfo.h"
18 #include "SIMachineFunctionInfo.h"
19 #include "MCTargetDesc/AMDGPUInstPrinter.h"
20 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
21 #include "llvm/CodeGen/LiveIntervals.h"
22 #include "llvm/CodeGen/MachineDominators.h"
23 #include "llvm/CodeGen/MachineFrameInfo.h"
24 #include "llvm/CodeGen/MachineInstrBuilder.h"
25 #include "llvm/CodeGen/RegisterScavenging.h"
26 #include "llvm/CodeGen/SlotIndexes.h"
27 #include "llvm/IR/Function.h"
28 #include "llvm/IR/LLVMContext.h"
29 
30 using namespace llvm;
31 
32 static bool hasPressureSet(const int *PSets, unsigned PSetID) {
33   for (unsigned i = 0; PSets[i] != -1; ++i) {
34     if (PSets[i] == (int)PSetID)
35       return true;
36   }
37   return false;
38 }
39 
40 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg,
41                                          BitVector &PressureSets) const {
42   for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) {
43     const int *PSets = getRegUnitPressureSets(*U);
44     if (hasPressureSet(PSets, PSetID)) {
45       PressureSets.set(PSetID);
46       break;
47     }
48   }
49 }
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 GCNSubtarget &ST) :
58   AMDGPURegisterInfo(),
59   ST(ST),
60   SGPRPressureSets(getNumRegPressureSets()),
61   VGPRPressureSets(getNumRegPressureSets()),
62   AGPRPressureSets(getNumRegPressureSets()),
63   SpillSGPRToVGPR(EnableSpillSGPRToVGPR),
64   isWave32(ST.isWave32()) {
65   unsigned NumRegPressureSets = getNumRegPressureSets();
66 
67   SGPRSetID = NumRegPressureSets;
68   VGPRSetID = NumRegPressureSets;
69   AGPRSetID = NumRegPressureSets;
70 
71   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
72     classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets);
73     classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets);
74     classifyPressureSet(i, AMDGPU::AGPR0, AGPRPressureSets);
75   }
76 
77   // Determine the number of reg units for each pressure set.
78   std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0);
79   for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) {
80     const int *PSets = getRegUnitPressureSets(i);
81     for (unsigned j = 0; PSets[j] != -1; ++j) {
82       ++PressureSetRegUnits[PSets[j]];
83     }
84   }
85 
86   unsigned VGPRMax = 0, SGPRMax = 0, AGPRMax = 0;
87   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
88     if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) {
89       VGPRSetID = i;
90       VGPRMax = PressureSetRegUnits[i];
91       continue;
92     }
93     if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) {
94       SGPRSetID = i;
95       SGPRMax = PressureSetRegUnits[i];
96     }
97     if (isAGPRPressureSet(i) && PressureSetRegUnits[i] > AGPRMax) {
98       AGPRSetID = i;
99       AGPRMax = PressureSetRegUnits[i];
100       continue;
101     }
102   }
103 
104   assert(SGPRSetID < NumRegPressureSets &&
105          VGPRSetID < NumRegPressureSets &&
106          AGPRSetID < NumRegPressureSets);
107 }
108 
109 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
110   const MachineFunction &MF) const {
111   unsigned BaseIdx = alignDown(ST.getMaxNumSGPRs(MF), 4) - 4;
112   unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
113   return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SGPR_128RegClass);
114 }
115 
116 static unsigned findPrivateSegmentWaveByteOffsetRegIndex(unsigned RegCount) {
117   unsigned Reg;
118 
119   // Try to place it in a hole after PrivateSegmentBufferReg.
120   if (RegCount & 3) {
121     // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to
122     // alignment constraints, so we have a hole where can put the wave offset.
123     Reg = RegCount - 1;
124   } else {
125     // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the
126     // wave offset before it.
127     Reg = RegCount - 5;
128   }
129 
130   return Reg;
131 }
132 
133 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
134   const MachineFunction &MF) const {
135   unsigned Reg = findPrivateSegmentWaveByteOffsetRegIndex(ST.getMaxNumSGPRs(MF));
136   return AMDGPU::SGPR_32RegClass.getRegister(Reg);
137 }
138 
139 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
140   BitVector Reserved(getNumRegs());
141 
142   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
143   // this seems likely to result in bugs, so I'm marking them as reserved.
144   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
145   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
146 
147   // M0 has to be reserved so that llvm accepts it as a live-in into a block.
148   reserveRegisterTuples(Reserved, AMDGPU::M0);
149 
150   // Reserve src_vccz, src_execz, src_scc.
151   reserveRegisterTuples(Reserved, AMDGPU::SRC_VCCZ);
152   reserveRegisterTuples(Reserved, AMDGPU::SRC_EXECZ);
153   reserveRegisterTuples(Reserved, AMDGPU::SRC_SCC);
154 
155   // Reserve the memory aperture registers.
156   reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_BASE);
157   reserveRegisterTuples(Reserved, AMDGPU::SRC_SHARED_LIMIT);
158   reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_BASE);
159   reserveRegisterTuples(Reserved, AMDGPU::SRC_PRIVATE_LIMIT);
160 
161   // Reserve src_pops_exiting_wave_id - support is not implemented in Codegen.
162   reserveRegisterTuples(Reserved, AMDGPU::SRC_POPS_EXITING_WAVE_ID);
163 
164   // Reserve xnack_mask registers - support is not implemented in Codegen.
165   reserveRegisterTuples(Reserved, AMDGPU::XNACK_MASK);
166 
167   // Reserve lds_direct register - support is not implemented in Codegen.
168   reserveRegisterTuples(Reserved, AMDGPU::LDS_DIRECT);
169 
170   // Reserve Trap Handler registers - support is not implemented in Codegen.
171   reserveRegisterTuples(Reserved, AMDGPU::TBA);
172   reserveRegisterTuples(Reserved, AMDGPU::TMA);
173   reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1);
174   reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3);
175   reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5);
176   reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7);
177   reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9);
178   reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11);
179   reserveRegisterTuples(Reserved, AMDGPU::TTMP12_TTMP13);
180   reserveRegisterTuples(Reserved, AMDGPU::TTMP14_TTMP15);
181 
182   // Reserve null register - it shall never be allocated
183   reserveRegisterTuples(Reserved, AMDGPU::SGPR_NULL);
184 
185   // Disallow vcc_hi allocation in wave32. It may be allocated but most likely
186   // will result in bugs.
187   if (isWave32) {
188     Reserved.set(AMDGPU::VCC);
189     Reserved.set(AMDGPU::VCC_HI);
190   }
191 
192   unsigned MaxNumSGPRs = ST.getMaxNumSGPRs(MF);
193   unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
194   for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) {
195     unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
196     reserveRegisterTuples(Reserved, Reg);
197   }
198 
199   unsigned MaxNumVGPRs = ST.getMaxNumVGPRs(MF);
200   unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs();
201   for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) {
202     unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i);
203     reserveRegisterTuples(Reserved, Reg);
204     Reg = AMDGPU::AGPR_32RegClass.getRegister(i);
205     reserveRegisterTuples(Reserved, Reg);
206   }
207 
208   // Reserve all the rest AGPRs if there are no instructions to use it.
209   if (!ST.hasMAIInsts()) {
210     for (unsigned i = 0; i < MaxNumVGPRs; ++i) {
211       unsigned Reg = AMDGPU::AGPR_32RegClass.getRegister(i);
212       reserveRegisterTuples(Reserved, Reg);
213     }
214   }
215 
216   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
217 
218   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
219   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
220     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
221     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
222   }
223 
224   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
225   if (ScratchRSrcReg != AMDGPU::NoRegister) {
226     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
227     // to spill.
228     // TODO: May need to reserve a VGPR if doing LDS spilling.
229     reserveRegisterTuples(Reserved, ScratchRSrcReg);
230     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
231   }
232 
233   // We have to assume the SP is needed in case there are calls in the function,
234   // which is detected after the function is lowered. If we aren't really going
235   // to need SP, don't bother reserving it.
236   unsigned StackPtrReg = MFI->getStackPtrOffsetReg();
237 
238   if (StackPtrReg != AMDGPU::NoRegister) {
239     reserveRegisterTuples(Reserved, StackPtrReg);
240     assert(!isSubRegister(ScratchRSrcReg, StackPtrReg));
241   }
242 
243   unsigned FrameReg = MFI->getFrameOffsetReg();
244   if (FrameReg != AMDGPU::NoRegister) {
245     reserveRegisterTuples(Reserved, FrameReg);
246     assert(!isSubRegister(ScratchRSrcReg, FrameReg));
247   }
248 
249   for (unsigned Reg : MFI->WWMReservedRegs) {
250     reserveRegisterTuples(Reserved, Reg);
251   }
252 
253   // FIXME: Stop using reserved registers for this.
254   for (MCPhysReg Reg : MFI->getAGPRSpillVGPRs())
255     reserveRegisterTuples(Reserved, Reg);
256 
257   for (MCPhysReg Reg : MFI->getVGPRSpillAGPRs())
258     reserveRegisterTuples(Reserved, Reg);
259 
260   return Reserved;
261 }
262 
263 bool SIRegisterInfo::canRealignStack(const MachineFunction &MF) const {
264   const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>();
265   // On entry, the base address is 0, so it can't possibly need any more
266   // alignment.
267 
268   // FIXME: Should be able to specify the entry frame alignment per calling
269   // convention instead.
270   if (Info->isEntryFunction())
271     return false;
272 
273   return TargetRegisterInfo::canRealignStack(MF);
274 }
275 
276 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
277   const SIMachineFunctionInfo *Info = Fn.getInfo<SIMachineFunctionInfo>();
278   if (Info->isEntryFunction()) {
279     const MachineFrameInfo &MFI = Fn.getFrameInfo();
280     return MFI.hasStackObjects() || MFI.hasCalls();
281   }
282 
283   // May need scavenger for dealing with callee saved registers.
284   return true;
285 }
286 
287 bool SIRegisterInfo::requiresFrameIndexScavenging(
288   const MachineFunction &MF) const {
289   // Do not use frame virtual registers. They used to be used for SGPRs, but
290   // once we reach PrologEpilogInserter, we can no longer spill SGPRs. If the
291   // scavenger fails, we can increment/decrement the necessary SGPRs to avoid a
292   // spill.
293   return false;
294 }
295 
296 bool SIRegisterInfo::requiresFrameIndexReplacementScavenging(
297   const MachineFunction &MF) const {
298   const MachineFrameInfo &MFI = MF.getFrameInfo();
299   return MFI.hasStackObjects();
300 }
301 
302 bool SIRegisterInfo::requiresVirtualBaseRegisters(
303   const MachineFunction &) const {
304   // There are no special dedicated stack or frame pointers.
305   return true;
306 }
307 
308 int64_t SIRegisterInfo::getMUBUFInstrOffset(const MachineInstr *MI) const {
309   assert(SIInstrInfo::isMUBUF(*MI));
310 
311   int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
312                                           AMDGPU::OpName::offset);
313   return MI->getOperand(OffIdx).getImm();
314 }
315 
316 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI,
317                                                  int Idx) const {
318   if (!SIInstrInfo::isMUBUF(*MI))
319     return 0;
320 
321   assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
322                                            AMDGPU::OpName::vaddr) &&
323          "Should never see frame index on non-address operand");
324 
325   return getMUBUFInstrOffset(MI);
326 }
327 
328 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
329   if (!MI->mayLoadOrStore())
330     return false;
331 
332   int64_t FullOffset = Offset + getMUBUFInstrOffset(MI);
333 
334   return !isUInt<12>(FullOffset);
335 }
336 
337 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
338                                                   unsigned BaseReg,
339                                                   int FrameIdx,
340                                                   int64_t Offset) const {
341   MachineBasicBlock::iterator Ins = MBB->begin();
342   DebugLoc DL; // Defaults to "unknown"
343 
344   if (Ins != MBB->end())
345     DL = Ins->getDebugLoc();
346 
347   MachineFunction *MF = MBB->getParent();
348   const SIInstrInfo *TII = ST.getInstrInfo();
349 
350   if (Offset == 0) {
351     BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg)
352       .addFrameIndex(FrameIdx);
353     return;
354   }
355 
356   MachineRegisterInfo &MRI = MF->getRegInfo();
357   Register OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
358 
359   Register FIReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
360 
361   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
362     .addImm(Offset);
363   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), FIReg)
364     .addFrameIndex(FrameIdx);
365 
366   TII->getAddNoCarry(*MBB, Ins, DL, BaseReg)
367     .addReg(OffsetReg, RegState::Kill)
368     .addReg(FIReg)
369     .addImm(0); // clamp bit
370 }
371 
372 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
373                                        int64_t Offset) const {
374   const SIInstrInfo *TII = ST.getInstrInfo();
375 
376 #ifndef NDEBUG
377   // FIXME: Is it possible to be storing a frame index to itself?
378   bool SeenFI = false;
379   for (const MachineOperand &MO: MI.operands()) {
380     if (MO.isFI()) {
381       if (SeenFI)
382         llvm_unreachable("should not see multiple frame indices");
383 
384       SeenFI = true;
385     }
386   }
387 #endif
388 
389   MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr);
390 #ifndef NDEBUG
391   MachineBasicBlock *MBB = MI.getParent();
392   MachineFunction *MF = MBB->getParent();
393 #endif
394   assert(FIOp && FIOp->isFI() && "frame index must be address operand");
395   assert(TII->isMUBUF(MI));
396   assert(TII->getNamedOperand(MI, AMDGPU::OpName::soffset)->getReg() ==
397          MF->getInfo<SIMachineFunctionInfo>()->getStackPtrOffsetReg() &&
398          "should only be seeing stack pointer offset relative FrameIndex");
399 
400   MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset);
401   int64_t NewOffset = OffsetOp->getImm() + Offset;
402   assert(isUInt<12>(NewOffset) && "offset should be legal");
403 
404   FIOp->ChangeToRegister(BaseReg, false);
405   OffsetOp->setImm(NewOffset);
406 }
407 
408 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
409                                         unsigned BaseReg,
410                                         int64_t Offset) const {
411   if (!SIInstrInfo::isMUBUF(*MI))
412     return false;
413 
414   int64_t NewOffset = Offset + getMUBUFInstrOffset(MI);
415 
416   return isUInt<12>(NewOffset);
417 }
418 
419 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass(
420   const MachineFunction &MF, unsigned Kind) const {
421   // This is inaccurate. It depends on the instruction and address space. The
422   // only place where we should hit this is for dealing with frame indexes /
423   // private accesses, so this is correct in that case.
424   return &AMDGPU::VGPR_32RegClass;
425 }
426 
427 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
428 
429   switch (Op) {
430   case AMDGPU::SI_SPILL_S1024_SAVE:
431   case AMDGPU::SI_SPILL_S1024_RESTORE:
432   case AMDGPU::SI_SPILL_V1024_SAVE:
433   case AMDGPU::SI_SPILL_V1024_RESTORE:
434   case AMDGPU::SI_SPILL_A1024_SAVE:
435   case AMDGPU::SI_SPILL_A1024_RESTORE:
436     return 32;
437   case AMDGPU::SI_SPILL_S512_SAVE:
438   case AMDGPU::SI_SPILL_S512_RESTORE:
439   case AMDGPU::SI_SPILL_V512_SAVE:
440   case AMDGPU::SI_SPILL_V512_RESTORE:
441   case AMDGPU::SI_SPILL_A512_SAVE:
442   case AMDGPU::SI_SPILL_A512_RESTORE:
443     return 16;
444   case AMDGPU::SI_SPILL_S256_SAVE:
445   case AMDGPU::SI_SPILL_S256_RESTORE:
446   case AMDGPU::SI_SPILL_V256_SAVE:
447   case AMDGPU::SI_SPILL_V256_RESTORE:
448     return 8;
449   case AMDGPU::SI_SPILL_S160_SAVE:
450   case AMDGPU::SI_SPILL_S160_RESTORE:
451   case AMDGPU::SI_SPILL_V160_SAVE:
452   case AMDGPU::SI_SPILL_V160_RESTORE:
453     return 5;
454   case AMDGPU::SI_SPILL_S128_SAVE:
455   case AMDGPU::SI_SPILL_S128_RESTORE:
456   case AMDGPU::SI_SPILL_V128_SAVE:
457   case AMDGPU::SI_SPILL_V128_RESTORE:
458   case AMDGPU::SI_SPILL_A128_SAVE:
459   case AMDGPU::SI_SPILL_A128_RESTORE:
460     return 4;
461   case AMDGPU::SI_SPILL_S96_SAVE:
462   case AMDGPU::SI_SPILL_S96_RESTORE:
463   case AMDGPU::SI_SPILL_V96_SAVE:
464   case AMDGPU::SI_SPILL_V96_RESTORE:
465     return 3;
466   case AMDGPU::SI_SPILL_S64_SAVE:
467   case AMDGPU::SI_SPILL_S64_RESTORE:
468   case AMDGPU::SI_SPILL_V64_SAVE:
469   case AMDGPU::SI_SPILL_V64_RESTORE:
470   case AMDGPU::SI_SPILL_A64_SAVE:
471   case AMDGPU::SI_SPILL_A64_RESTORE:
472     return 2;
473   case AMDGPU::SI_SPILL_S32_SAVE:
474   case AMDGPU::SI_SPILL_S32_RESTORE:
475   case AMDGPU::SI_SPILL_V32_SAVE:
476   case AMDGPU::SI_SPILL_V32_RESTORE:
477   case AMDGPU::SI_SPILL_A32_SAVE:
478   case AMDGPU::SI_SPILL_A32_RESTORE:
479     return 1;
480   default: llvm_unreachable("Invalid spill opcode");
481   }
482 }
483 
484 static int getOffsetMUBUFStore(unsigned Opc) {
485   switch (Opc) {
486   case AMDGPU::BUFFER_STORE_DWORD_OFFEN:
487     return AMDGPU::BUFFER_STORE_DWORD_OFFSET;
488   case AMDGPU::BUFFER_STORE_BYTE_OFFEN:
489     return AMDGPU::BUFFER_STORE_BYTE_OFFSET;
490   case AMDGPU::BUFFER_STORE_SHORT_OFFEN:
491     return AMDGPU::BUFFER_STORE_SHORT_OFFSET;
492   case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN:
493     return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET;
494   case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN:
495     return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET;
496   case AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFEN:
497     return AMDGPU::BUFFER_STORE_SHORT_D16_HI_OFFSET;
498   case AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFEN:
499     return AMDGPU::BUFFER_STORE_BYTE_D16_HI_OFFSET;
500   default:
501     return -1;
502   }
503 }
504 
505 static int getOffsetMUBUFLoad(unsigned Opc) {
506   switch (Opc) {
507   case AMDGPU::BUFFER_LOAD_DWORD_OFFEN:
508     return AMDGPU::BUFFER_LOAD_DWORD_OFFSET;
509   case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN:
510     return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET;
511   case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN:
512     return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET;
513   case AMDGPU::BUFFER_LOAD_USHORT_OFFEN:
514     return AMDGPU::BUFFER_LOAD_USHORT_OFFSET;
515   case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN:
516     return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET;
517   case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN:
518     return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET;
519   case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN:
520     return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET;
521   case AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFEN:
522     return AMDGPU::BUFFER_LOAD_UBYTE_D16_OFFSET;
523   case AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFEN:
524     return AMDGPU::BUFFER_LOAD_UBYTE_D16_HI_OFFSET;
525   case AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFEN:
526     return AMDGPU::BUFFER_LOAD_SBYTE_D16_OFFSET;
527   case AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFEN:
528     return AMDGPU::BUFFER_LOAD_SBYTE_D16_HI_OFFSET;
529   case AMDGPU::BUFFER_LOAD_SHORT_D16_OFFEN:
530     return AMDGPU::BUFFER_LOAD_SHORT_D16_OFFSET;
531   case AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFEN:
532     return AMDGPU::BUFFER_LOAD_SHORT_D16_HI_OFFSET;
533   default:
534     return -1;
535   }
536 }
537 
538 static MachineInstrBuilder spillVGPRtoAGPR(const GCNSubtarget &ST,
539                                            MachineBasicBlock::iterator MI,
540                                            int Index,
541                                            unsigned Lane,
542                                            unsigned ValueReg,
543                                            bool IsKill) {
544   MachineBasicBlock *MBB = MI->getParent();
545   MachineFunction *MF = MI->getParent()->getParent();
546   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
547   const SIInstrInfo *TII = ST.getInstrInfo();
548 
549   MCPhysReg Reg = MFI->getVGPRToAGPRSpill(Index, Lane);
550 
551   if (Reg == AMDGPU::NoRegister)
552     return MachineInstrBuilder();
553 
554   bool IsStore = MI->mayStore();
555   MachineRegisterInfo &MRI = MF->getRegInfo();
556   auto *TRI = static_cast<const SIRegisterInfo*>(MRI.getTargetRegisterInfo());
557 
558   unsigned Dst = IsStore ? Reg : ValueReg;
559   unsigned Src = IsStore ? ValueReg : Reg;
560   unsigned Opc = (IsStore ^ TRI->isVGPR(MRI, Reg)) ? AMDGPU::V_ACCVGPR_WRITE_B32
561                                                    : AMDGPU::V_ACCVGPR_READ_B32;
562 
563   return BuildMI(*MBB, MI, MI->getDebugLoc(), TII->get(Opc), Dst)
564            .addReg(Src, getKillRegState(IsKill));
565 }
566 
567 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not
568 // need to handle the case where an SGPR may need to be spilled while spilling.
569 static bool buildMUBUFOffsetLoadStore(const GCNSubtarget &ST,
570                                       MachineFrameInfo &MFI,
571                                       MachineBasicBlock::iterator MI,
572                                       int Index,
573                                       int64_t Offset) {
574   const SIInstrInfo *TII = ST.getInstrInfo();
575   MachineBasicBlock *MBB = MI->getParent();
576   const DebugLoc &DL = MI->getDebugLoc();
577   bool IsStore = MI->mayStore();
578 
579   unsigned Opc = MI->getOpcode();
580   int LoadStoreOp = IsStore ?
581     getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc);
582   if (LoadStoreOp == -1)
583     return false;
584 
585   const MachineOperand *Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata);
586   if (spillVGPRtoAGPR(ST, MI, Index, 0, Reg->getReg(), false).getInstr())
587     return true;
588 
589   MachineInstrBuilder NewMI =
590       BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
591           .add(*Reg)
592           .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc))
593           .add(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset))
594           .addImm(Offset)
595           .addImm(0) // glc
596           .addImm(0) // slc
597           .addImm(0) // tfe
598           .addImm(0) // dlc
599           .addImm(0) // swz
600           .cloneMemRefs(*MI);
601 
602   const MachineOperand *VDataIn = TII->getNamedOperand(*MI,
603                                                        AMDGPU::OpName::vdata_in);
604   if (VDataIn)
605     NewMI.add(*VDataIn);
606   return true;
607 }
608 
609 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI,
610                                          unsigned LoadStoreOp,
611                                          int Index,
612                                          unsigned ValueReg,
613                                          bool IsKill,
614                                          unsigned ScratchRsrcReg,
615                                          unsigned ScratchOffsetReg,
616                                          int64_t InstOffset,
617                                          MachineMemOperand *MMO,
618                                          RegScavenger *RS) const {
619   MachineBasicBlock *MBB = MI->getParent();
620   MachineFunction *MF = MI->getParent()->getParent();
621   const SIInstrInfo *TII = ST.getInstrInfo();
622   const MachineFrameInfo &MFI = MF->getFrameInfo();
623 
624   const MCInstrDesc &Desc = TII->get(LoadStoreOp);
625   const DebugLoc &DL = MI->getDebugLoc();
626   bool IsStore = Desc.mayStore();
627 
628   bool Scavenged = false;
629   unsigned SOffset = ScratchOffsetReg;
630 
631   const unsigned EltSize = 4;
632   const TargetRegisterClass *RC = getRegClassForReg(MF->getRegInfo(), ValueReg);
633   unsigned NumSubRegs = AMDGPU::getRegBitWidth(RC->getID()) / (EltSize * CHAR_BIT);
634   unsigned Size = NumSubRegs * EltSize;
635   int64_t Offset = InstOffset + MFI.getObjectOffset(Index);
636   int64_t ScratchOffsetRegDelta = 0;
637 
638   unsigned Align = MFI.getObjectAlignment(Index);
639   const MachinePointerInfo &BasePtrInfo = MMO->getPointerInfo();
640 
641   Register TmpReg =
642     hasAGPRs(RC) ? TII->getNamedOperand(*MI, AMDGPU::OpName::tmp)->getReg()
643                  : Register();
644 
645   assert((Offset % EltSize) == 0 && "unexpected VGPR spill offset");
646 
647   if (!isUInt<12>(Offset + Size - EltSize)) {
648     SOffset = AMDGPU::NoRegister;
649 
650     // We currently only support spilling VGPRs to EltSize boundaries, meaning
651     // we can simplify the adjustment of Offset here to just scale with
652     // WavefrontSize.
653     Offset *= ST.getWavefrontSize();
654 
655     // We don't have access to the register scavenger if this function is called
656     // during  PEI::scavengeFrameVirtualRegs().
657     if (RS)
658       SOffset = RS->scavengeRegister(&AMDGPU::SGPR_32RegClass, MI, 0, false);
659 
660     if (SOffset == AMDGPU::NoRegister) {
661       // There are no free SGPRs, and since we are in the process of spilling
662       // VGPRs too.  Since we need a VGPR in order to spill SGPRs (this is true
663       // on SI/CI and on VI it is true until we implement spilling using scalar
664       // stores), we have no way to free up an SGPR.  Our solution here is to
665       // add the offset directly to the ScratchOffset register, and then
666       // subtract the offset after the spill to return ScratchOffset to it's
667       // original value.
668       SOffset = ScratchOffsetReg;
669       ScratchOffsetRegDelta = Offset;
670     } else {
671       Scavenged = true;
672     }
673 
674     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
675       .addReg(ScratchOffsetReg)
676       .addImm(Offset);
677 
678     Offset = 0;
679   }
680 
681   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += EltSize) {
682     Register SubReg = NumSubRegs == 1
683                           ? Register(ValueReg)
684                           : getSubReg(ValueReg, getSubRegFromChannel(i));
685 
686     unsigned SOffsetRegState = 0;
687     unsigned SrcDstRegState = getDefRegState(!IsStore);
688     if (i + 1 == e) {
689       SOffsetRegState |= getKillRegState(Scavenged);
690       // The last implicit use carries the "Kill" flag.
691       SrcDstRegState |= getKillRegState(IsKill);
692     }
693 
694     auto MIB = spillVGPRtoAGPR(ST, MI, Index, i, SubReg, IsKill);
695 
696     if (!MIB.getInstr()) {
697       unsigned FinalReg = SubReg;
698       if (TmpReg != AMDGPU::NoRegister) {
699         if (IsStore)
700           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ACCVGPR_READ_B32), TmpReg)
701             .addReg(SubReg, getKillRegState(IsKill));
702         SubReg = TmpReg;
703       }
704 
705       MachinePointerInfo PInfo = BasePtrInfo.getWithOffset(EltSize * i);
706       MachineMemOperand *NewMMO
707         = MF->getMachineMemOperand(PInfo, MMO->getFlags(),
708                                    EltSize, MinAlign(Align, EltSize * i));
709 
710       MIB = BuildMI(*MBB, MI, DL, Desc)
711         .addReg(SubReg, getDefRegState(!IsStore) | getKillRegState(IsKill))
712         .addReg(ScratchRsrcReg)
713         .addReg(SOffset, SOffsetRegState)
714         .addImm(Offset)
715         .addImm(0) // glc
716         .addImm(0) // slc
717         .addImm(0) // tfe
718         .addImm(0) // dlc
719         .addImm(0) // swz
720         .addMemOperand(NewMMO);
721 
722       if (!IsStore && TmpReg != AMDGPU::NoRegister)
723         MIB = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ACCVGPR_WRITE_B32),
724                       FinalReg)
725           .addReg(TmpReg, RegState::Kill);
726     }
727 
728     if (NumSubRegs > 1)
729       MIB.addReg(ValueReg, RegState::Implicit | SrcDstRegState);
730   }
731 
732   if (ScratchOffsetRegDelta != 0) {
733     // Subtract the offset we added to the ScratchOffset register.
734     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffsetReg)
735         .addReg(ScratchOffsetReg)
736         .addImm(ScratchOffsetRegDelta);
737   }
738 }
739 
740 bool SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI,
741                                int Index,
742                                RegScavenger *RS,
743                                bool OnlyToVGPR) const {
744   MachineBasicBlock *MBB = MI->getParent();
745   MachineFunction *MF = MBB->getParent();
746   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
747   DenseSet<unsigned> SGPRSpillVGPRDefinedSet;
748 
749   ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills
750     = MFI->getSGPRToVGPRSpills(Index);
751   bool SpillToVGPR = !VGPRSpills.empty();
752   if (OnlyToVGPR && !SpillToVGPR)
753     return false;
754 
755   const SIInstrInfo *TII = ST.getInstrInfo();
756 
757   Register SuperReg = MI->getOperand(0).getReg();
758   bool IsKill = MI->getOperand(0).isKill();
759   const DebugLoc &DL = MI->getDebugLoc();
760 
761   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
762 
763   assert(SpillToVGPR || (SuperReg != MFI->getStackPtrOffsetReg() &&
764                          SuperReg != MFI->getFrameOffsetReg() &&
765                          SuperReg != MFI->getScratchWaveOffsetReg()));
766 
767   assert(SuperReg != AMDGPU::M0 && "m0 should never spill");
768 
769   unsigned EltSize = 4;
770   const TargetRegisterClass *RC = getPhysRegClass(SuperReg);
771 
772   ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize);
773   unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size();
774 
775   // Scavenged temporary VGPR to use. It must be scavenged once for any number
776   // of spilled subregs.
777   Register TmpVGPR;
778 
779   // SubReg carries the "Kill" flag when SubReg == SuperReg.
780   unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill);
781   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
782     Register SubReg =
783         NumSubRegs == 1 ? SuperReg : getSubReg(SuperReg, SplitParts[i]);
784 
785     if (SpillToVGPR) {
786       SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i];
787 
788       // During SGPR spilling to VGPR, determine if the VGPR is defined. The
789       // only circumstance in which we say it is undefined is when it is the
790       // first spill to this VGPR in the first basic block.
791       bool VGPRDefined = true;
792       if (MBB == &MF->front())
793         VGPRDefined = !SGPRSpillVGPRDefinedSet.insert(Spill.VGPR).second;
794 
795       // Mark the "old value of vgpr" input undef only if this is the first sgpr
796       // spill to this specific vgpr in the first basic block.
797       BuildMI(*MBB, MI, DL,
798               TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
799               Spill.VGPR)
800         .addReg(SubReg, getKillRegState(IsKill))
801         .addImm(Spill.Lane)
802         .addReg(Spill.VGPR, VGPRDefined ? 0 : RegState::Undef);
803 
804       // FIXME: Since this spills to another register instead of an actual
805       // frame index, we should delete the frame index when all references to
806       // it are fixed.
807     } else {
808       // XXX - Can to VGPR spill fail for some subregisters but not others?
809       if (OnlyToVGPR)
810         return false;
811 
812       // Spill SGPR to a frame index.
813       if (!TmpVGPR.isValid())
814         TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0);
815 
816       MachineInstrBuilder Mov
817         = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpVGPR)
818         .addReg(SubReg, SubKillState);
819 
820       // There could be undef components of a spilled super register.
821       // TODO: Can we detect this and skip the spill?
822       if (NumSubRegs > 1) {
823         // The last implicit use of the SuperReg carries the "Kill" flag.
824         unsigned SuperKillState = 0;
825         if (i + 1 == e)
826           SuperKillState |= getKillRegState(IsKill);
827         Mov.addReg(SuperReg, RegState::Implicit | SuperKillState);
828       }
829 
830       unsigned Align = FrameInfo.getObjectAlignment(Index);
831       MachinePointerInfo PtrInfo
832         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
833       MachineMemOperand *MMO
834         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
835                                    EltSize, MinAlign(Align, EltSize * i));
836       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE))
837         .addReg(TmpVGPR, RegState::Kill)      // src
838         .addFrameIndex(Index)                 // vaddr
839         .addReg(MFI->getScratchRSrcReg())     // srrsrc
840         .addReg(MFI->getStackPtrOffsetReg())  // soffset
841         .addImm(i * 4)                        // offset
842         .addMemOperand(MMO);
843     }
844   }
845 
846   MI->eraseFromParent();
847   MFI->addToSpilledSGPRs(NumSubRegs);
848   return true;
849 }
850 
851 bool SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI,
852                                  int Index,
853                                  RegScavenger *RS,
854                                  bool OnlyToVGPR) const {
855   MachineFunction *MF = MI->getParent()->getParent();
856   MachineBasicBlock *MBB = MI->getParent();
857   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
858 
859   ArrayRef<SIMachineFunctionInfo::SpilledReg> VGPRSpills
860     = MFI->getSGPRToVGPRSpills(Index);
861   bool SpillToVGPR = !VGPRSpills.empty();
862   if (OnlyToVGPR && !SpillToVGPR)
863     return false;
864 
865   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
866   const SIInstrInfo *TII = ST.getInstrInfo();
867   const DebugLoc &DL = MI->getDebugLoc();
868 
869   Register SuperReg = MI->getOperand(0).getReg();
870 
871   assert(SuperReg != AMDGPU::M0 && "m0 should never spill");
872 
873   unsigned EltSize = 4;
874 
875   const TargetRegisterClass *RC = getPhysRegClass(SuperReg);
876 
877   ArrayRef<int16_t> SplitParts = getRegSplitParts(RC, EltSize);
878   unsigned NumSubRegs = SplitParts.empty() ? 1 : SplitParts.size();
879 
880   Register TmpVGPR;
881 
882   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
883     Register SubReg =
884         NumSubRegs == 1 ? SuperReg : getSubReg(SuperReg, SplitParts[i]);
885 
886     if (SpillToVGPR) {
887       SIMachineFunctionInfo::SpilledReg Spill = VGPRSpills[i];
888       auto MIB =
889         BuildMI(*MBB, MI, DL, TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
890                 SubReg)
891         .addReg(Spill.VGPR)
892         .addImm(Spill.Lane);
893 
894       if (NumSubRegs > 1 && i == 0)
895         MIB.addReg(SuperReg, RegState::ImplicitDefine);
896     } else {
897       if (OnlyToVGPR)
898         return false;
899 
900       // Restore SGPR from a stack slot.
901       // FIXME: We should use S_LOAD_DWORD here for VI.
902       if (!TmpVGPR.isValid())
903         TmpVGPR = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0);
904       unsigned Align = FrameInfo.getObjectAlignment(Index);
905 
906       MachinePointerInfo PtrInfo
907         = MachinePointerInfo::getFixedStack(*MF, Index, EltSize * i);
908 
909       MachineMemOperand *MMO = MF->getMachineMemOperand(PtrInfo,
910         MachineMemOperand::MOLoad, EltSize,
911         MinAlign(Align, EltSize * i));
912 
913       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpVGPR)
914         .addFrameIndex(Index)                 // vaddr
915         .addReg(MFI->getScratchRSrcReg())     // srsrc
916         .addReg(MFI->getStackPtrOffsetReg())  // soffset
917         .addImm(i * 4)                        // offset
918         .addMemOperand(MMO);
919 
920       auto MIB =
921         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg)
922         .addReg(TmpVGPR, RegState::Kill);
923 
924       if (NumSubRegs > 1)
925         MIB.addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
926     }
927   }
928 
929   MI->eraseFromParent();
930   return true;
931 }
932 
933 /// Special case of eliminateFrameIndex. Returns true if the SGPR was spilled to
934 /// a VGPR and the stack slot can be safely eliminated when all other users are
935 /// handled.
936 bool SIRegisterInfo::eliminateSGPRToVGPRSpillFrameIndex(
937   MachineBasicBlock::iterator MI,
938   int FI,
939   RegScavenger *RS) const {
940   switch (MI->getOpcode()) {
941   case AMDGPU::SI_SPILL_S1024_SAVE:
942   case AMDGPU::SI_SPILL_S512_SAVE:
943   case AMDGPU::SI_SPILL_S256_SAVE:
944   case AMDGPU::SI_SPILL_S160_SAVE:
945   case AMDGPU::SI_SPILL_S128_SAVE:
946   case AMDGPU::SI_SPILL_S96_SAVE:
947   case AMDGPU::SI_SPILL_S64_SAVE:
948   case AMDGPU::SI_SPILL_S32_SAVE:
949     return spillSGPR(MI, FI, RS, true);
950   case AMDGPU::SI_SPILL_S1024_RESTORE:
951   case AMDGPU::SI_SPILL_S512_RESTORE:
952   case AMDGPU::SI_SPILL_S256_RESTORE:
953   case AMDGPU::SI_SPILL_S160_RESTORE:
954   case AMDGPU::SI_SPILL_S128_RESTORE:
955   case AMDGPU::SI_SPILL_S96_RESTORE:
956   case AMDGPU::SI_SPILL_S64_RESTORE:
957   case AMDGPU::SI_SPILL_S32_RESTORE:
958     return restoreSGPR(MI, FI, RS, true);
959   default:
960     llvm_unreachable("not an SGPR spill instruction");
961   }
962 }
963 
964 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
965                                         int SPAdj, unsigned FIOperandNum,
966                                         RegScavenger *RS) const {
967   MachineFunction *MF = MI->getParent()->getParent();
968   MachineBasicBlock *MBB = MI->getParent();
969   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
970   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
971   const SIInstrInfo *TII = ST.getInstrInfo();
972   DebugLoc DL = MI->getDebugLoc();
973 
974   assert(SPAdj == 0 && "unhandled SP adjustment in call sequence?");
975 
976   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
977   int Index = MI->getOperand(FIOperandNum).getIndex();
978 
979   Register FrameReg = getFrameRegister(*MF);
980 
981   switch (MI->getOpcode()) {
982     // SGPR register spill
983     case AMDGPU::SI_SPILL_S1024_SAVE:
984     case AMDGPU::SI_SPILL_S512_SAVE:
985     case AMDGPU::SI_SPILL_S256_SAVE:
986     case AMDGPU::SI_SPILL_S160_SAVE:
987     case AMDGPU::SI_SPILL_S128_SAVE:
988     case AMDGPU::SI_SPILL_S96_SAVE:
989     case AMDGPU::SI_SPILL_S64_SAVE:
990     case AMDGPU::SI_SPILL_S32_SAVE: {
991       spillSGPR(MI, Index, RS);
992       break;
993     }
994 
995     // SGPR register restore
996     case AMDGPU::SI_SPILL_S1024_RESTORE:
997     case AMDGPU::SI_SPILL_S512_RESTORE:
998     case AMDGPU::SI_SPILL_S256_RESTORE:
999     case AMDGPU::SI_SPILL_S160_RESTORE:
1000     case AMDGPU::SI_SPILL_S128_RESTORE:
1001     case AMDGPU::SI_SPILL_S96_RESTORE:
1002     case AMDGPU::SI_SPILL_S64_RESTORE:
1003     case AMDGPU::SI_SPILL_S32_RESTORE: {
1004       restoreSGPR(MI, Index, RS);
1005       break;
1006     }
1007 
1008     // VGPR register spill
1009     case AMDGPU::SI_SPILL_V1024_SAVE:
1010     case AMDGPU::SI_SPILL_V512_SAVE:
1011     case AMDGPU::SI_SPILL_V256_SAVE:
1012     case AMDGPU::SI_SPILL_V160_SAVE:
1013     case AMDGPU::SI_SPILL_V128_SAVE:
1014     case AMDGPU::SI_SPILL_V96_SAVE:
1015     case AMDGPU::SI_SPILL_V64_SAVE:
1016     case AMDGPU::SI_SPILL_V32_SAVE:
1017     case AMDGPU::SI_SPILL_A1024_SAVE:
1018     case AMDGPU::SI_SPILL_A512_SAVE:
1019     case AMDGPU::SI_SPILL_A128_SAVE:
1020     case AMDGPU::SI_SPILL_A64_SAVE:
1021     case AMDGPU::SI_SPILL_A32_SAVE: {
1022       const MachineOperand *VData = TII->getNamedOperand(*MI,
1023                                                          AMDGPU::OpName::vdata);
1024       assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() ==
1025              MFI->getStackPtrOffsetReg());
1026 
1027       buildSpillLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
1028             Index,
1029             VData->getReg(), VData->isKill(),
1030             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
1031             FrameReg,
1032             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(),
1033             *MI->memoperands_begin(),
1034             RS);
1035       MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode()));
1036       MI->eraseFromParent();
1037       break;
1038     }
1039     case AMDGPU::SI_SPILL_V32_RESTORE:
1040     case AMDGPU::SI_SPILL_V64_RESTORE:
1041     case AMDGPU::SI_SPILL_V96_RESTORE:
1042     case AMDGPU::SI_SPILL_V128_RESTORE:
1043     case AMDGPU::SI_SPILL_V160_RESTORE:
1044     case AMDGPU::SI_SPILL_V256_RESTORE:
1045     case AMDGPU::SI_SPILL_V512_RESTORE:
1046     case AMDGPU::SI_SPILL_V1024_RESTORE:
1047     case AMDGPU::SI_SPILL_A32_RESTORE:
1048     case AMDGPU::SI_SPILL_A64_RESTORE:
1049     case AMDGPU::SI_SPILL_A128_RESTORE:
1050     case AMDGPU::SI_SPILL_A512_RESTORE:
1051     case AMDGPU::SI_SPILL_A1024_RESTORE: {
1052       const MachineOperand *VData = TII->getNamedOperand(*MI,
1053                                                          AMDGPU::OpName::vdata);
1054       assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() ==
1055              MFI->getStackPtrOffsetReg());
1056 
1057       buildSpillLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
1058             Index,
1059             VData->getReg(), VData->isKill(),
1060             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
1061             FrameReg,
1062             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(),
1063             *MI->memoperands_begin(),
1064             RS);
1065       MI->eraseFromParent();
1066       break;
1067     }
1068 
1069     default: {
1070       const DebugLoc &DL = MI->getDebugLoc();
1071       bool IsMUBUF = TII->isMUBUF(*MI);
1072 
1073       if (!IsMUBUF && !MFI->isEntryFunction()) {
1074         // Convert to an absolute stack address by finding the offset from the
1075         // scratch wave base and scaling by the wave size.
1076         //
1077         // In an entry function/kernel the offset is already the absolute
1078         // address relative to the frame register.
1079 
1080         Register TmpDiffReg =
1081           RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, false);
1082 
1083         // If there's no free SGPR, in-place modify the FP
1084         Register DiffReg = TmpDiffReg.isValid() ? TmpDiffReg : FrameReg;
1085 
1086         bool IsCopy = MI->getOpcode() == AMDGPU::V_MOV_B32_e32;
1087         Register ResultReg = IsCopy ?
1088           MI->getOperand(0).getReg() :
1089           RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0);
1090 
1091         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), DiffReg)
1092           .addReg(FrameReg)
1093           .addReg(MFI->getScratchWaveOffsetReg());
1094 
1095         int64_t Offset = FrameInfo.getObjectOffset(Index);
1096         if (Offset == 0) {
1097           // XXX - This never happens because of emergency scavenging slot at 0?
1098           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64), ResultReg)
1099             .addImm(ST.getWavefrontSizeLog2())
1100             .addReg(DiffReg);
1101         } else {
1102           if (auto MIB = TII->getAddNoCarry(*MBB, MI, DL, ResultReg, *RS)) {
1103             Register ScaledReg =
1104               RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MIB, 0);
1105 
1106             BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::V_LSHRREV_B32_e64),
1107                     ScaledReg)
1108               .addImm(ST.getWavefrontSizeLog2())
1109               .addReg(DiffReg, RegState::Kill);
1110 
1111             const bool IsVOP2 = MIB->getOpcode() == AMDGPU::V_ADD_U32_e32;
1112 
1113             // TODO: Fold if use instruction is another add of a constant.
1114             if (IsVOP2 || AMDGPU::isInlinableLiteral32(Offset, ST.hasInv2PiInlineImm())) {
1115               // FIXME: This can fail
1116               MIB.addImm(Offset);
1117               MIB.addReg(ScaledReg, RegState::Kill);
1118               if (!IsVOP2)
1119                 MIB.addImm(0); // clamp bit
1120             } else {
1121               assert(MIB->getOpcode() == AMDGPU::V_ADD_I32_e64 &&
1122                      "Need to reuse carry out register");
1123 
1124               // Use scavenged unused carry out as offset register.
1125               Register ConstOffsetReg;
1126               if (!isWave32)
1127                 ConstOffsetReg = getSubReg(MIB.getReg(1), AMDGPU::sub0);
1128               else
1129                 ConstOffsetReg = MIB.getReg(1);
1130 
1131               BuildMI(*MBB, *MIB, DL, TII->get(AMDGPU::S_MOV_B32), ConstOffsetReg)
1132                 .addImm(Offset);
1133               MIB.addReg(ConstOffsetReg, RegState::Kill);
1134               MIB.addReg(ScaledReg, RegState::Kill);
1135               MIB.addImm(0); // clamp bit
1136             }
1137           } else {
1138             // We have to produce a carry out, and there isn't a free SGPR pair
1139             // for it. We can keep the whole computation on the SALU to avoid
1140             // clobbering an additional register at the cost of an extra mov.
1141 
1142             // We may have 1 free scratch SGPR even though a carry out is
1143             // unavailable. Only one additional mov is needed.
1144             Register TmpScaledReg =
1145                 RS->scavengeRegister(&AMDGPU::SReg_32_XM0RegClass, MI, 0, false);
1146             Register ScaledReg = TmpScaledReg.isValid() ? TmpScaledReg : DiffReg;
1147 
1148             BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHR_B32), ScaledReg)
1149               .addReg(DiffReg, RegState::Kill)
1150               .addImm(ST.getWavefrontSizeLog2());
1151             BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), ScaledReg)
1152               .addReg(ScaledReg, RegState::Kill)
1153               .addImm(Offset);
1154             BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), ResultReg)
1155               .addReg(ScaledReg, RegState::Kill);
1156 
1157             // If there were truly no free SGPRs, we need to undo everything.
1158             if (!TmpScaledReg.isValid()) {
1159               BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScaledReg)
1160                 .addReg(ScaledReg, RegState::Kill)
1161                 .addImm(Offset);
1162               BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_LSHL_B32), ScaledReg)
1163                 .addReg(DiffReg, RegState::Kill)
1164                 .addImm(ST.getWavefrontSizeLog2());
1165             }
1166           }
1167         }
1168 
1169         if (!TmpDiffReg.isValid()) {
1170           // Restore the FP.
1171           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), FrameReg)
1172             .addReg(FrameReg)
1173             .addReg(MFI->getScratchWaveOffsetReg());
1174         }
1175 
1176         // Don't introduce an extra copy if we're just materializing in a mov.
1177         if (IsCopy)
1178           MI->eraseFromParent();
1179         else
1180           FIOp.ChangeToRegister(ResultReg, false, false, true);
1181         return;
1182       }
1183 
1184       if (IsMUBUF) {
1185         // Disable offen so we don't need a 0 vgpr base.
1186         assert(static_cast<int>(FIOperandNum) ==
1187                AMDGPU::getNamedOperandIdx(MI->getOpcode(),
1188                                           AMDGPU::OpName::vaddr));
1189 
1190         assert(TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg() ==
1191                MFI->getStackPtrOffsetReg());
1192 
1193         TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->setReg(FrameReg);
1194 
1195         int64_t Offset = FrameInfo.getObjectOffset(Index);
1196         int64_t OldImm
1197           = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm();
1198         int64_t NewOffset = OldImm + Offset;
1199 
1200         if (isUInt<12>(NewOffset) &&
1201             buildMUBUFOffsetLoadStore(ST, FrameInfo, MI, Index, NewOffset)) {
1202           MI->eraseFromParent();
1203           return;
1204         }
1205       }
1206 
1207       // If the offset is simply too big, don't convert to a scratch wave offset
1208       // relative index.
1209 
1210       int64_t Offset = FrameInfo.getObjectOffset(Index);
1211       FIOp.ChangeToImmediate(Offset);
1212       if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) {
1213         Register TmpReg = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, 0);
1214         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
1215           .addImm(Offset);
1216         FIOp.ChangeToRegister(TmpReg, false, false, true);
1217       }
1218     }
1219   }
1220 }
1221 
1222 StringRef SIRegisterInfo::getRegAsmName(unsigned Reg) const {
1223   return AMDGPUInstPrinter::getRegisterName(Reg);
1224 }
1225 
1226 // FIXME: This is very slow. It might be worth creating a map from physreg to
1227 // register class.
1228 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
1229   assert(!Register::isVirtualRegister(Reg));
1230 
1231   static const TargetRegisterClass *const BaseClasses[] = {
1232     &AMDGPU::VGPR_32RegClass,
1233     &AMDGPU::SReg_32RegClass,
1234     &AMDGPU::AGPR_32RegClass,
1235     &AMDGPU::VReg_64RegClass,
1236     &AMDGPU::SReg_64RegClass,
1237     &AMDGPU::AReg_64RegClass,
1238     &AMDGPU::VReg_96RegClass,
1239     &AMDGPU::SReg_96RegClass,
1240     &AMDGPU::VReg_128RegClass,
1241     &AMDGPU::SReg_128RegClass,
1242     &AMDGPU::AReg_128RegClass,
1243     &AMDGPU::VReg_160RegClass,
1244     &AMDGPU::SReg_160RegClass,
1245     &AMDGPU::VReg_256RegClass,
1246     &AMDGPU::SReg_256RegClass,
1247     &AMDGPU::VReg_512RegClass,
1248     &AMDGPU::SReg_512RegClass,
1249     &AMDGPU::AReg_512RegClass,
1250     &AMDGPU::SReg_1024RegClass,
1251     &AMDGPU::VReg_1024RegClass,
1252     &AMDGPU::AReg_1024RegClass,
1253     &AMDGPU::SCC_CLASSRegClass,
1254     &AMDGPU::Pseudo_SReg_32RegClass,
1255     &AMDGPU::Pseudo_SReg_128RegClass,
1256   };
1257 
1258   for (const TargetRegisterClass *BaseClass : BaseClasses) {
1259     if (BaseClass->contains(Reg)) {
1260       return BaseClass;
1261     }
1262   }
1263   return nullptr;
1264 }
1265 
1266 // TODO: It might be helpful to have some target specific flags in
1267 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
1268 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
1269   unsigned Size = getRegSizeInBits(*RC);
1270   switch (Size) {
1271   case 32:
1272     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
1273   case 64:
1274     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
1275   case 96:
1276     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
1277   case 128:
1278     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
1279   case 160:
1280     return getCommonSubClass(&AMDGPU::VReg_160RegClass, RC) != nullptr;
1281   case 256:
1282     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
1283   case 512:
1284     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
1285   case 1024:
1286     return getCommonSubClass(&AMDGPU::VReg_1024RegClass, RC) != nullptr;
1287   case 1:
1288     return getCommonSubClass(&AMDGPU::VReg_1RegClass, RC) != nullptr;
1289   default:
1290     assert(Size < 32 && "Invalid register class size");
1291     return false;
1292   }
1293 }
1294 
1295 bool SIRegisterInfo::hasAGPRs(const TargetRegisterClass *RC) const {
1296   unsigned Size = getRegSizeInBits(*RC);
1297   if (Size < 32)
1298     return false;
1299   switch (Size) {
1300   case 32:
1301     return getCommonSubClass(&AMDGPU::AGPR_32RegClass, RC) != nullptr;
1302   case 64:
1303     return getCommonSubClass(&AMDGPU::AReg_64RegClass, RC) != nullptr;
1304   case 96:
1305     return false;
1306   case 128:
1307     return getCommonSubClass(&AMDGPU::AReg_128RegClass, RC) != nullptr;
1308   case 160:
1309   case 256:
1310     return false;
1311   case 512:
1312     return getCommonSubClass(&AMDGPU::AReg_512RegClass, RC) != nullptr;
1313   case 1024:
1314     return getCommonSubClass(&AMDGPU::AReg_1024RegClass, RC) != nullptr;
1315   default:
1316     llvm_unreachable("Invalid register class size");
1317   }
1318 }
1319 
1320 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
1321                                          const TargetRegisterClass *SRC) const {
1322   switch (getRegSizeInBits(*SRC)) {
1323   case 32:
1324     return &AMDGPU::VGPR_32RegClass;
1325   case 64:
1326     return &AMDGPU::VReg_64RegClass;
1327   case 96:
1328     return &AMDGPU::VReg_96RegClass;
1329   case 128:
1330     return &AMDGPU::VReg_128RegClass;
1331   case 160:
1332     return &AMDGPU::VReg_160RegClass;
1333   case 256:
1334     return &AMDGPU::VReg_256RegClass;
1335   case 512:
1336     return &AMDGPU::VReg_512RegClass;
1337   case 1024:
1338     return &AMDGPU::VReg_1024RegClass;
1339   case 1:
1340     return &AMDGPU::VReg_1RegClass;
1341   default:
1342     llvm_unreachable("Invalid register class size");
1343   }
1344 }
1345 
1346 const TargetRegisterClass *SIRegisterInfo::getEquivalentAGPRClass(
1347                                          const TargetRegisterClass *SRC) const {
1348   switch (getRegSizeInBits(*SRC)) {
1349   case 32:
1350     return &AMDGPU::AGPR_32RegClass;
1351   case 64:
1352     return &AMDGPU::AReg_64RegClass;
1353   case 128:
1354     return &AMDGPU::AReg_128RegClass;
1355   case 512:
1356     return &AMDGPU::AReg_512RegClass;
1357   case 1024:
1358     return &AMDGPU::AReg_1024RegClass;
1359   default:
1360     llvm_unreachable("Invalid register class size");
1361   }
1362 }
1363 
1364 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass(
1365                                          const TargetRegisterClass *VRC) const {
1366   switch (getRegSizeInBits(*VRC)) {
1367   case 32:
1368     return &AMDGPU::SGPR_32RegClass;
1369   case 64:
1370     return &AMDGPU::SReg_64RegClass;
1371   case 96:
1372     return &AMDGPU::SReg_96RegClass;
1373   case 128:
1374     return &AMDGPU::SGPR_128RegClass;
1375   case 160:
1376     return &AMDGPU::SReg_160RegClass;
1377   case 256:
1378     return &AMDGPU::SReg_256RegClass;
1379   case 512:
1380     return &AMDGPU::SReg_512RegClass;
1381   case 1024:
1382     return &AMDGPU::SReg_1024RegClass;
1383   default:
1384     llvm_unreachable("Invalid register class size");
1385   }
1386 }
1387 
1388 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
1389                          const TargetRegisterClass *RC, unsigned SubIdx) const {
1390   if (SubIdx == AMDGPU::NoSubRegister)
1391     return RC;
1392 
1393   // We can assume that each lane corresponds to one 32-bit register.
1394   unsigned Count = getSubRegIndexLaneMask(SubIdx).getNumLanes();
1395   if (isSGPRClass(RC)) {
1396     switch (Count) {
1397     case 1:
1398       return &AMDGPU::SGPR_32RegClass;
1399     case 2:
1400       return &AMDGPU::SReg_64RegClass;
1401     case 3:
1402       return &AMDGPU::SReg_96RegClass;
1403     case 4:
1404       return &AMDGPU::SGPR_128RegClass;
1405     case 5:
1406       return &AMDGPU::SReg_160RegClass;
1407     case 8:
1408       return &AMDGPU::SReg_256RegClass;
1409     case 16:
1410       return &AMDGPU::SReg_512RegClass;
1411     case 32: /* fall-through */
1412     default:
1413       llvm_unreachable("Invalid sub-register class size");
1414     }
1415   } else if (hasAGPRs(RC)) {
1416     switch (Count) {
1417     case 1:
1418       return &AMDGPU::AGPR_32RegClass;
1419     case 2:
1420       return &AMDGPU::AReg_64RegClass;
1421     case 4:
1422       return &AMDGPU::AReg_128RegClass;
1423     case 16:
1424       return &AMDGPU::AReg_512RegClass;
1425     case 32: /* fall-through */
1426     default:
1427       llvm_unreachable("Invalid sub-register class size");
1428     }
1429   } else {
1430     switch (Count) {
1431     case 1:
1432       return &AMDGPU::VGPR_32RegClass;
1433     case 2:
1434       return &AMDGPU::VReg_64RegClass;
1435     case 3:
1436       return &AMDGPU::VReg_96RegClass;
1437     case 4:
1438       return &AMDGPU::VReg_128RegClass;
1439     case 5:
1440       return &AMDGPU::VReg_160RegClass;
1441     case 8:
1442       return &AMDGPU::VReg_256RegClass;
1443     case 16:
1444       return &AMDGPU::VReg_512RegClass;
1445     case 32: /* fall-through */
1446     default:
1447       llvm_unreachable("Invalid sub-register class size");
1448     }
1449   }
1450 }
1451 
1452 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const {
1453   if (OpType >= AMDGPU::OPERAND_REG_INLINE_AC_FIRST &&
1454       OpType <= AMDGPU::OPERAND_REG_INLINE_AC_LAST)
1455     return !ST.hasMFMAInlineLiteralBug();
1456 
1457   return OpType >= AMDGPU::OPERAND_SRC_FIRST &&
1458          OpType <= AMDGPU::OPERAND_SRC_LAST;
1459 }
1460 
1461 bool SIRegisterInfo::shouldRewriteCopySrc(
1462   const TargetRegisterClass *DefRC,
1463   unsigned DefSubReg,
1464   const TargetRegisterClass *SrcRC,
1465   unsigned SrcSubReg) const {
1466   // We want to prefer the smallest register class possible, so we don't want to
1467   // stop and rewrite on anything that looks like a subregister
1468   // extract. Operations mostly don't care about the super register class, so we
1469   // only want to stop on the most basic of copies between the same register
1470   // class.
1471   //
1472   // e.g. if we have something like
1473   // %0 = ...
1474   // %1 = ...
1475   // %2 = REG_SEQUENCE %0, sub0, %1, sub1, %2, sub2
1476   // %3 = COPY %2, sub0
1477   //
1478   // We want to look through the COPY to find:
1479   //  => %3 = COPY %0
1480 
1481   // Plain copy.
1482   return getCommonSubClass(DefRC, SrcRC) != nullptr;
1483 }
1484 
1485 /// Returns a register that is not used at any point in the function.
1486 ///        If all registers are used, then this function will return
1487 //         AMDGPU::NoRegister.
1488 unsigned
1489 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
1490                                    const TargetRegisterClass *RC,
1491                                    const MachineFunction &MF) const {
1492 
1493   for (unsigned Reg : *RC)
1494     if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg))
1495       return Reg;
1496   return AMDGPU::NoRegister;
1497 }
1498 
1499 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC,
1500                                                    unsigned EltSize) const {
1501   if (EltSize == 4) {
1502     static const int16_t Sub0_31[] = {
1503       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1504       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1505       AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11,
1506       AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15,
1507       AMDGPU::sub16, AMDGPU::sub17, AMDGPU::sub18, AMDGPU::sub19,
1508       AMDGPU::sub20, AMDGPU::sub21, AMDGPU::sub22, AMDGPU::sub23,
1509       AMDGPU::sub24, AMDGPU::sub25, AMDGPU::sub26, AMDGPU::sub27,
1510       AMDGPU::sub28, AMDGPU::sub29, AMDGPU::sub30, AMDGPU::sub31,
1511     };
1512 
1513     static const int16_t Sub0_15[] = {
1514       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1515       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1516       AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11,
1517       AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15,
1518     };
1519 
1520     static const int16_t Sub0_7[] = {
1521       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1522       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1523     };
1524 
1525     static const int16_t Sub0_4[] = {
1526       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3, AMDGPU::sub4,
1527     };
1528 
1529     static const int16_t Sub0_3[] = {
1530       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1531     };
1532 
1533     static const int16_t Sub0_2[] = {
1534       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2,
1535     };
1536 
1537     static const int16_t Sub0_1[] = {
1538       AMDGPU::sub0, AMDGPU::sub1,
1539     };
1540 
1541     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1542     case 32:
1543       return {};
1544     case 64:
1545       return makeArrayRef(Sub0_1);
1546     case 96:
1547       return makeArrayRef(Sub0_2);
1548     case 128:
1549       return makeArrayRef(Sub0_3);
1550     case 160:
1551       return makeArrayRef(Sub0_4);
1552     case 256:
1553       return makeArrayRef(Sub0_7);
1554     case 512:
1555       return makeArrayRef(Sub0_15);
1556     case 1024:
1557       return makeArrayRef(Sub0_31);
1558     default:
1559       llvm_unreachable("unhandled register size");
1560     }
1561   }
1562 
1563   if (EltSize == 8) {
1564     static const int16_t Sub0_31_64[] = {
1565       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1566       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7,
1567       AMDGPU::sub8_sub9, AMDGPU::sub10_sub11,
1568       AMDGPU::sub12_sub13, AMDGPU::sub14_sub15,
1569       AMDGPU::sub16_sub17, AMDGPU::sub18_sub19,
1570       AMDGPU::sub20_sub21, AMDGPU::sub22_sub23,
1571       AMDGPU::sub24_sub25, AMDGPU::sub26_sub27,
1572       AMDGPU::sub28_sub29, AMDGPU::sub30_sub31
1573     };
1574 
1575     static const int16_t Sub0_15_64[] = {
1576       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1577       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7,
1578       AMDGPU::sub8_sub9, AMDGPU::sub10_sub11,
1579       AMDGPU::sub12_sub13, AMDGPU::sub14_sub15
1580     };
1581 
1582     static const int16_t Sub0_7_64[] = {
1583       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1584       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7
1585     };
1586 
1587 
1588     static const int16_t Sub0_3_64[] = {
1589       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3
1590     };
1591 
1592     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1593     case 64:
1594       return {};
1595     case 128:
1596       return makeArrayRef(Sub0_3_64);
1597     case 256:
1598       return makeArrayRef(Sub0_7_64);
1599     case 512:
1600       return makeArrayRef(Sub0_15_64);
1601     case 1024:
1602       return makeArrayRef(Sub0_31_64);
1603     default:
1604       llvm_unreachable("unhandled register size");
1605     }
1606   }
1607 
1608   if (EltSize == 16) {
1609 
1610     static const int16_t Sub0_31_128[] = {
1611       AMDGPU::sub0_sub1_sub2_sub3,
1612       AMDGPU::sub4_sub5_sub6_sub7,
1613       AMDGPU::sub8_sub9_sub10_sub11,
1614       AMDGPU::sub12_sub13_sub14_sub15,
1615       AMDGPU::sub16_sub17_sub18_sub19,
1616       AMDGPU::sub20_sub21_sub22_sub23,
1617       AMDGPU::sub24_sub25_sub26_sub27,
1618       AMDGPU::sub28_sub29_sub30_sub31
1619     };
1620 
1621     static const int16_t Sub0_15_128[] = {
1622       AMDGPU::sub0_sub1_sub2_sub3,
1623       AMDGPU::sub4_sub5_sub6_sub7,
1624       AMDGPU::sub8_sub9_sub10_sub11,
1625       AMDGPU::sub12_sub13_sub14_sub15
1626     };
1627 
1628     static const int16_t Sub0_7_128[] = {
1629       AMDGPU::sub0_sub1_sub2_sub3,
1630       AMDGPU::sub4_sub5_sub6_sub7
1631     };
1632 
1633     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1634     case 128:
1635       return {};
1636     case 256:
1637       return makeArrayRef(Sub0_7_128);
1638     case 512:
1639       return makeArrayRef(Sub0_15_128);
1640     case 1024:
1641       return makeArrayRef(Sub0_31_128);
1642     default:
1643       llvm_unreachable("unhandled register size");
1644     }
1645   }
1646 
1647   assert(EltSize == 32 && "unhandled elt size");
1648 
1649   static const int16_t Sub0_31_256[] = {
1650     AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7,
1651     AMDGPU::sub8_sub9_sub10_sub11_sub12_sub13_sub14_sub15,
1652     AMDGPU::sub16_sub17_sub18_sub19_sub20_sub21_sub22_sub23,
1653     AMDGPU::sub24_sub25_sub26_sub27_sub28_sub29_sub30_sub31
1654   };
1655 
1656   static const int16_t Sub0_15_256[] = {
1657     AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7,
1658     AMDGPU::sub8_sub9_sub10_sub11_sub12_sub13_sub14_sub15
1659   };
1660 
1661   switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1662   case 256:
1663     return {};
1664   case 512:
1665     return makeArrayRef(Sub0_15_256);
1666   case 1024:
1667     return makeArrayRef(Sub0_31_256);
1668   default:
1669     llvm_unreachable("unhandled register size");
1670   }
1671 }
1672 
1673 const TargetRegisterClass*
1674 SIRegisterInfo::getRegClassForReg(const MachineRegisterInfo &MRI,
1675                                   unsigned Reg) const {
1676   if (Register::isVirtualRegister(Reg))
1677     return  MRI.getRegClass(Reg);
1678 
1679   return getPhysRegClass(Reg);
1680 }
1681 
1682 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI,
1683                             unsigned Reg) const {
1684   const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg);
1685   assert(RC && "Register class for the reg not found");
1686   return hasVGPRs(RC);
1687 }
1688 
1689 bool SIRegisterInfo::isAGPR(const MachineRegisterInfo &MRI,
1690                             unsigned Reg) const {
1691   const TargetRegisterClass * RC = getRegClassForReg(MRI, Reg);
1692   assert(RC && "Register class for the reg not found");
1693   return hasAGPRs(RC);
1694 }
1695 
1696 bool SIRegisterInfo::shouldCoalesce(MachineInstr *MI,
1697                                     const TargetRegisterClass *SrcRC,
1698                                     unsigned SubReg,
1699                                     const TargetRegisterClass *DstRC,
1700                                     unsigned DstSubReg,
1701                                     const TargetRegisterClass *NewRC,
1702                                     LiveIntervals &LIS) const {
1703   unsigned SrcSize = getRegSizeInBits(*SrcRC);
1704   unsigned DstSize = getRegSizeInBits(*DstRC);
1705   unsigned NewSize = getRegSizeInBits(*NewRC);
1706 
1707   // Do not increase size of registers beyond dword, we would need to allocate
1708   // adjacent registers and constraint regalloc more than needed.
1709 
1710   // Always allow dword coalescing.
1711   if (SrcSize <= 32 || DstSize <= 32)
1712     return true;
1713 
1714   return NewSize <= DstSize || NewSize <= SrcSize;
1715 }
1716 
1717 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
1718                                              MachineFunction &MF) const {
1719   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
1720 
1721   unsigned Occupancy = ST.getOccupancyWithLocalMemSize(MFI->getLDSSize(),
1722                                                        MF.getFunction());
1723   switch (RC->getID()) {
1724   default:
1725     return AMDGPURegisterInfo::getRegPressureLimit(RC, MF);
1726   case AMDGPU::VGPR_32RegClassID:
1727     return std::min(ST.getMaxNumVGPRs(Occupancy), ST.getMaxNumVGPRs(MF));
1728   case AMDGPU::SGPR_32RegClassID:
1729     return std::min(ST.getMaxNumSGPRs(Occupancy, true), ST.getMaxNumSGPRs(MF));
1730   }
1731 }
1732 
1733 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF,
1734                                                 unsigned Idx) const {
1735   if (Idx == getVGPRPressureSet() || Idx == getAGPRPressureSet())
1736     return getRegPressureLimit(&AMDGPU::VGPR_32RegClass,
1737                                const_cast<MachineFunction &>(MF));
1738 
1739   if (Idx == getSGPRPressureSet())
1740     return getRegPressureLimit(&AMDGPU::SGPR_32RegClass,
1741                                const_cast<MachineFunction &>(MF));
1742 
1743   return AMDGPURegisterInfo::getRegPressureSetLimit(MF, Idx);
1744 }
1745 
1746 const int *SIRegisterInfo::getRegUnitPressureSets(unsigned RegUnit) const {
1747   static const int Empty[] = { -1 };
1748 
1749   if (hasRegUnit(AMDGPU::M0, RegUnit))
1750     return Empty;
1751   return AMDGPURegisterInfo::getRegUnitPressureSets(RegUnit);
1752 }
1753 
1754 unsigned SIRegisterInfo::getReturnAddressReg(const MachineFunction &MF) const {
1755   // Not a callee saved register.
1756   return AMDGPU::SGPR30_SGPR31;
1757 }
1758 
1759 const TargetRegisterClass *
1760 SIRegisterInfo::getRegClassForSizeOnBank(unsigned Size,
1761                                          const RegisterBank &RB,
1762                                          const MachineRegisterInfo &MRI) const {
1763   switch (Size) {
1764   case 1: {
1765     switch (RB.getID()) {
1766     case AMDGPU::VGPRRegBankID:
1767       return &AMDGPU::VGPR_32RegClass;
1768     case AMDGPU::VCCRegBankID:
1769       return isWave32 ?
1770         &AMDGPU::SReg_32_XM0_XEXECRegClass : &AMDGPU::SReg_64_XEXECRegClass;
1771     case AMDGPU::SGPRRegBankID:
1772       return &AMDGPU::SReg_32RegClass;
1773     default:
1774       llvm_unreachable("unknown register bank");
1775     }
1776   }
1777   case 32:
1778     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass :
1779                                                  &AMDGPU::SReg_32RegClass;
1780   case 64:
1781     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_64RegClass :
1782                                                  &AMDGPU::SReg_64RegClass;
1783   case 96:
1784     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_96RegClass :
1785                                                  &AMDGPU::SReg_96RegClass;
1786   case 128:
1787     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_128RegClass :
1788                                                  &AMDGPU::SGPR_128RegClass;
1789   case 160:
1790     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_160RegClass :
1791                                                  &AMDGPU::SReg_160RegClass;
1792   case 256:
1793     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_256RegClass :
1794                                                  &AMDGPU::SReg_256RegClass;
1795   case 512:
1796     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_512RegClass :
1797                                                  &AMDGPU::SReg_512RegClass;
1798   case 1024:
1799     return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VReg_1024RegClass :
1800                                                  &AMDGPU::SReg_1024RegClass;
1801   default:
1802     if (Size < 32)
1803       return RB.getID() == AMDGPU::VGPRRegBankID ? &AMDGPU::VGPR_32RegClass :
1804                                                    &AMDGPU::SReg_32RegClass;
1805     return nullptr;
1806   }
1807 }
1808 
1809 const TargetRegisterClass *
1810 SIRegisterInfo::getConstrainedRegClassForOperand(const MachineOperand &MO,
1811                                          const MachineRegisterInfo &MRI) const {
1812   const RegClassOrRegBank &RCOrRB = MRI.getRegClassOrRegBank(MO.getReg());
1813   if (const RegisterBank *RB = RCOrRB.dyn_cast<const RegisterBank*>())
1814     return getRegClassForTypeOnBank(MRI.getType(MO.getReg()), *RB, MRI);
1815 
1816   const TargetRegisterClass *RC = RCOrRB.get<const TargetRegisterClass*>();
1817   return getAllocatableClass(RC);
1818 }
1819 
1820 unsigned SIRegisterInfo::getVCC() const {
1821   return isWave32 ? AMDGPU::VCC_LO : AMDGPU::VCC;
1822 }
1823 
1824 const TargetRegisterClass *
1825 SIRegisterInfo::getRegClass(unsigned RCID) const {
1826   switch ((int)RCID) {
1827   case AMDGPU::SReg_1RegClassID:
1828     return getBoolRC();
1829   case AMDGPU::SReg_1_XEXECRegClassID:
1830     return isWave32 ? &AMDGPU::SReg_32_XM0_XEXECRegClass
1831       : &AMDGPU::SReg_64_XEXECRegClass;
1832   case -1:
1833     return nullptr;
1834   default:
1835     return AMDGPURegisterInfo::getRegClass(RCID);
1836   }
1837 }
1838 
1839 // Find reaching register definition
1840 MachineInstr *SIRegisterInfo::findReachingDef(unsigned Reg, unsigned SubReg,
1841                                               MachineInstr &Use,
1842                                               MachineRegisterInfo &MRI,
1843                                               LiveIntervals *LIS) const {
1844   auto &MDT = LIS->getAnalysis<MachineDominatorTree>();
1845   SlotIndex UseIdx = LIS->getInstructionIndex(Use);
1846   SlotIndex DefIdx;
1847 
1848   if (Register::isVirtualRegister(Reg)) {
1849     if (!LIS->hasInterval(Reg))
1850       return nullptr;
1851     LiveInterval &LI = LIS->getInterval(Reg);
1852     LaneBitmask SubLanes = SubReg ? getSubRegIndexLaneMask(SubReg)
1853                                   : MRI.getMaxLaneMaskForVReg(Reg);
1854     VNInfo *V = nullptr;
1855     if (LI.hasSubRanges()) {
1856       for (auto &S : LI.subranges()) {
1857         if ((S.LaneMask & SubLanes) == SubLanes) {
1858           V = S.getVNInfoAt(UseIdx);
1859           break;
1860         }
1861       }
1862     } else {
1863       V = LI.getVNInfoAt(UseIdx);
1864     }
1865     if (!V)
1866       return nullptr;
1867     DefIdx = V->def;
1868   } else {
1869     // Find last def.
1870     for (MCRegUnitIterator Units(Reg, this); Units.isValid(); ++Units) {
1871       LiveRange &LR = LIS->getRegUnit(*Units);
1872       if (VNInfo *V = LR.getVNInfoAt(UseIdx)) {
1873         if (!DefIdx.isValid() ||
1874             MDT.dominates(LIS->getInstructionFromIndex(DefIdx),
1875                           LIS->getInstructionFromIndex(V->def)))
1876           DefIdx = V->def;
1877       } else {
1878         return nullptr;
1879       }
1880     }
1881   }
1882 
1883   MachineInstr *Def = LIS->getInstructionFromIndex(DefIdx);
1884 
1885   if (!Def || !MDT.dominates(Def, &Use))
1886     return nullptr;
1887 
1888   assert(Def->modifiesRegister(Reg, this));
1889 
1890   return Def;
1891 }
1892