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