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