1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// \brief SI implementation of the TargetRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "SIRegisterInfo.h"
16 #include "SIInstrInfo.h"
17 #include "SIMachineFunctionInfo.h"
18 #include "AMDGPUSubtarget.h"
19 #include "llvm/CodeGen/MachineFrameInfo.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/RegisterScavenging.h"
22 #include "llvm/IR/Function.h"
23 #include "llvm/IR/LLVMContext.h"
24 
25 using namespace llvm;
26 
27 static bool hasPressureSet(const int *PSets, unsigned PSetID) {
28   for (unsigned i = 0; PSets[i] != -1; ++i) {
29     if (PSets[i] == (int)PSetID)
30       return true;
31   }
32   return false;
33 }
34 
35 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg,
36                                          BitVector &PressureSets) const {
37   for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) {
38     const int *PSets = getRegUnitPressureSets(*U);
39     if (hasPressureSet(PSets, PSetID)) {
40       PressureSets.set(PSetID);
41       break;
42     }
43   }
44 }
45 
46 SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo(),
47                                    SGPRPressureSets(getNumRegPressureSets()),
48                                    VGPRPressureSets(getNumRegPressureSets()) {
49   unsigned NumRegPressureSets = getNumRegPressureSets();
50 
51   SGPRSetID = NumRegPressureSets;
52   VGPRSetID = NumRegPressureSets;
53 
54   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
55     classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets);
56     classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets);
57   }
58 
59   // Determine the number of reg units for each pressure set.
60   std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0);
61   for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) {
62     const int *PSets = getRegUnitPressureSets(i);
63     for (unsigned j = 0; PSets[j] != -1; ++j) {
64       ++PressureSetRegUnits[PSets[j]];
65     }
66   }
67 
68   unsigned VGPRMax = 0, SGPRMax = 0;
69   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
70     if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) {
71       VGPRSetID = i;
72       VGPRMax = PressureSetRegUnits[i];
73       continue;
74     }
75     if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) {
76       SGPRSetID = i;
77       SGPRMax = PressureSetRegUnits[i];
78     }
79   }
80 
81   assert(SGPRSetID < NumRegPressureSets &&
82          VGPRSetID < NumRegPressureSets);
83 }
84 
85 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const {
86   MCRegAliasIterator R(Reg, this, true);
87 
88   for (; R.isValid(); ++R)
89     Reserved.set(*R);
90 }
91 
92 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
93   const MachineFunction &MF) const {
94   unsigned BaseIdx = alignDown(getMaxNumSGPRs(MF), 4) - 4;
95   unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
96   return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass);
97 }
98 
99 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
100   const MachineFunction &MF) const {
101   unsigned RegCount = getMaxNumSGPRs(MF);
102   unsigned Reg;
103 
104   // Try to place it in a hole after PrivateSegmentbufferReg.
105   if (RegCount & 3) {
106     // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to
107     // alignment constraints, so we have a hole where can put the wave offset.
108     Reg = RegCount - 1;
109   } else {
110     // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the
111     // wave offset before it.
112     Reg = RegCount - 5;
113   }
114   return AMDGPU::SGPR_32RegClass.getRegister(Reg);
115 }
116 
117 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
118   BitVector Reserved(getNumRegs());
119   Reserved.set(AMDGPU::INDIRECT_BASE_ADDR);
120 
121   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
122   // this seems likely to result in bugs, so I'm marking them as reserved.
123   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
124   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
125 
126   // Reserve Trap Handler registers - support is not implemented in Codegen.
127   reserveRegisterTuples(Reserved, AMDGPU::TBA);
128   reserveRegisterTuples(Reserved, AMDGPU::TMA);
129   reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1);
130   reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3);
131   reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5);
132   reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7);
133   reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9);
134   reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11);
135 
136   unsigned MaxNumSGPRs = getMaxNumSGPRs(MF);
137   unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
138   for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) {
139     unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
140     reserveRegisterTuples(Reserved, Reg);
141   }
142 
143   unsigned MaxNumVGPRs = getMaxNumVGPRs(MF);
144   unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs();
145   for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) {
146     unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i);
147     reserveRegisterTuples(Reserved, Reg);
148   }
149 
150   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
151 
152   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
153   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
154     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
155     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
156   }
157 
158   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
159   if (ScratchRSrcReg != AMDGPU::NoRegister) {
160     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
161     // to spill.
162     // TODO: May need to reserve a VGPR if doing LDS spilling.
163     reserveRegisterTuples(Reserved, ScratchRSrcReg);
164     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
165   }
166 
167   return Reserved;
168 }
169 
170 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
171   return Fn.getFrameInfo().hasStackObjects();
172 }
173 
174 bool
175 SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
176   return MF.getFrameInfo().hasStackObjects();
177 }
178 
179 bool SIRegisterInfo::requiresVirtualBaseRegisters(
180   const MachineFunction &) const {
181   // There are no special dedicated stack or frame pointers.
182   return true;
183 }
184 
185 bool SIRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
186   // This helps catch bugs as verifier errors.
187   return true;
188 }
189 
190 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI,
191                                                  int Idx) const {
192   if (!SIInstrInfo::isMUBUF(*MI))
193     return 0;
194 
195   assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
196                                            AMDGPU::OpName::vaddr) &&
197          "Should never see frame index on non-address operand");
198 
199   int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
200                                           AMDGPU::OpName::offset);
201   return MI->getOperand(OffIdx).getImm();
202 }
203 
204 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
205   return MI->mayLoadOrStore();
206 }
207 
208 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
209                                                   unsigned BaseReg,
210                                                   int FrameIdx,
211                                                   int64_t Offset) const {
212   MachineBasicBlock::iterator Ins = MBB->begin();
213   DebugLoc DL; // Defaults to "unknown"
214 
215   if (Ins != MBB->end())
216     DL = Ins->getDebugLoc();
217 
218   MachineFunction *MF = MBB->getParent();
219   const SISubtarget &Subtarget = MF->getSubtarget<SISubtarget>();
220   const SIInstrInfo *TII = Subtarget.getInstrInfo();
221 
222   if (Offset == 0) {
223     BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg)
224       .addFrameIndex(FrameIdx);
225     return;
226   }
227 
228   MachineRegisterInfo &MRI = MF->getRegInfo();
229   unsigned UnusedCarry = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
230   unsigned OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
231 
232   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
233     .addImm(Offset);
234   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_ADD_I32_e64), BaseReg)
235     .addReg(UnusedCarry, RegState::Define | RegState::Dead)
236     .addReg(OffsetReg, RegState::Kill)
237     .addFrameIndex(FrameIdx);
238 }
239 
240 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
241                                        int64_t Offset) const {
242 
243   MachineBasicBlock *MBB = MI.getParent();
244   MachineFunction *MF = MBB->getParent();
245   const SISubtarget &Subtarget = MF->getSubtarget<SISubtarget>();
246   const SIInstrInfo *TII = Subtarget.getInstrInfo();
247 
248 #ifndef NDEBUG
249   // FIXME: Is it possible to be storing a frame index to itself?
250   bool SeenFI = false;
251   for (const MachineOperand &MO: MI.operands()) {
252     if (MO.isFI()) {
253       if (SeenFI)
254         llvm_unreachable("should not see multiple frame indices");
255 
256       SeenFI = true;
257     }
258   }
259 #endif
260 
261   MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr);
262   assert(FIOp && FIOp->isFI() && "frame index must be address operand");
263 
264   assert(TII->isMUBUF(MI));
265 
266   MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset);
267   int64_t NewOffset = OffsetOp->getImm() + Offset;
268   if (isUInt<12>(NewOffset)) {
269     // If we have a legal offset, fold it directly into the instruction.
270     FIOp->ChangeToRegister(BaseReg, false);
271     OffsetOp->setImm(NewOffset);
272     return;
273   }
274 
275   // The offset is not legal, so we must insert an add of the offset.
276   MachineRegisterInfo &MRI = MF->getRegInfo();
277   unsigned NewReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
278   DebugLoc DL = MI.getDebugLoc();
279 
280   assert(Offset != 0 && "Non-zero offset expected");
281 
282   unsigned UnusedCarry = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
283   unsigned OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
284 
285   // In the case the instruction already had an immediate offset, here only
286   // the requested new offset is added because we are leaving the original
287   // immediate in place.
288   BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
289     .addImm(Offset);
290   BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_ADD_I32_e64), NewReg)
291     .addReg(UnusedCarry, RegState::Define | RegState::Dead)
292     .addReg(OffsetReg, RegState::Kill)
293     .addReg(BaseReg);
294 
295   FIOp->ChangeToRegister(NewReg, false);
296 }
297 
298 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
299                                         unsigned BaseReg,
300                                         int64_t Offset) const {
301   return SIInstrInfo::isMUBUF(*MI) && isUInt<12>(Offset);
302 }
303 
304 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass(
305   const MachineFunction &MF, unsigned Kind) const {
306   // This is inaccurate. It depends on the instruction and address space. The
307   // only place where we should hit this is for dealing with frame indexes /
308   // private accesses, so this is correct in that case.
309   return &AMDGPU::VGPR_32RegClass;
310 }
311 
312 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
313 
314   switch (Op) {
315   case AMDGPU::SI_SPILL_S512_SAVE:
316   case AMDGPU::SI_SPILL_S512_RESTORE:
317   case AMDGPU::SI_SPILL_V512_SAVE:
318   case AMDGPU::SI_SPILL_V512_RESTORE:
319     return 16;
320   case AMDGPU::SI_SPILL_S256_SAVE:
321   case AMDGPU::SI_SPILL_S256_RESTORE:
322   case AMDGPU::SI_SPILL_V256_SAVE:
323   case AMDGPU::SI_SPILL_V256_RESTORE:
324     return 8;
325   case AMDGPU::SI_SPILL_S128_SAVE:
326   case AMDGPU::SI_SPILL_S128_RESTORE:
327   case AMDGPU::SI_SPILL_V128_SAVE:
328   case AMDGPU::SI_SPILL_V128_RESTORE:
329     return 4;
330   case AMDGPU::SI_SPILL_V96_SAVE:
331   case AMDGPU::SI_SPILL_V96_RESTORE:
332     return 3;
333   case AMDGPU::SI_SPILL_S64_SAVE:
334   case AMDGPU::SI_SPILL_S64_RESTORE:
335   case AMDGPU::SI_SPILL_V64_SAVE:
336   case AMDGPU::SI_SPILL_V64_RESTORE:
337     return 2;
338   case AMDGPU::SI_SPILL_S32_SAVE:
339   case AMDGPU::SI_SPILL_S32_RESTORE:
340   case AMDGPU::SI_SPILL_V32_SAVE:
341   case AMDGPU::SI_SPILL_V32_RESTORE:
342     return 1;
343   default: llvm_unreachable("Invalid spill opcode");
344   }
345 }
346 
347 void SIRegisterInfo::buildScratchLoadStore(MachineBasicBlock::iterator MI,
348                                            unsigned LoadStoreOp,
349                                            const MachineOperand *SrcDst,
350                                            unsigned ScratchRsrcReg,
351                                            unsigned ScratchOffset,
352                                            int64_t Offset,
353                                            RegScavenger *RS) const {
354 
355   unsigned Value = SrcDst->getReg();
356   bool IsKill = SrcDst->isKill();
357   MachineBasicBlock *MBB = MI->getParent();
358   MachineFunction *MF = MI->getParent()->getParent();
359   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
360   const SIInstrInfo *TII = ST.getInstrInfo();
361 
362   DebugLoc DL = MI->getDebugLoc();
363   bool IsStore = MI->mayStore();
364 
365   bool RanOutOfSGPRs = false;
366   bool Scavenged = false;
367   unsigned SOffset = ScratchOffset;
368   unsigned OriginalImmOffset = Offset;
369 
370   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
371   unsigned Size = NumSubRegs * 4;
372 
373   if (!isUInt<12>(Offset + Size)) {
374     SOffset = AMDGPU::NoRegister;
375 
376     // We don't have access to the register scavenger if this function is called
377     // during  PEI::scavengeFrameVirtualRegs().
378     if (RS)
379       SOffset = RS->FindUnusedReg(&AMDGPU::SGPR_32RegClass);
380 
381     if (SOffset == AMDGPU::NoRegister) {
382       // There are no free SGPRs, and since we are in the process of spilling
383       // VGPRs too.  Since we need a VGPR in order to spill SGPRs (this is true
384       // on SI/CI and on VI it is true until we implement spilling using scalar
385       // stores), we have no way to free up an SGPR.  Our solution here is to
386       // add the offset directly to the ScratchOffset register, and then
387       // subtract the offset after the spill to return ScratchOffset to it's
388       // original value.
389       RanOutOfSGPRs = true;
390       SOffset = ScratchOffset;
391     } else {
392       Scavenged = true;
393     }
394     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
395             .addReg(ScratchOffset)
396             .addImm(Offset);
397     Offset = 0;
398   }
399 
400   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += 4) {
401     unsigned SubReg = NumSubRegs == 1 ?
402       Value : getSubReg(Value, getSubRegFromChannel(i));
403 
404     unsigned SOffsetRegState = 0;
405     unsigned SrcDstRegState = getDefRegState(!IsStore);
406     if (i + 1 == e) {
407       SOffsetRegState |= getKillRegState(Scavenged);
408       // The last implicit use carries the "Kill" flag.
409       SrcDstRegState |= getKillRegState(IsKill);
410     }
411 
412     BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
413       .addReg(SubReg, getDefRegState(!IsStore))
414       .addReg(ScratchRsrcReg)
415       .addReg(SOffset, SOffsetRegState)
416       .addImm(Offset)
417       .addImm(0) // glc
418       .addImm(0) // slc
419       .addImm(0) // tfe
420       .addReg(Value, RegState::Implicit | SrcDstRegState)
421       .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
422   }
423   if (RanOutOfSGPRs) {
424     // Subtract the offset we added to the ScratchOffset register.
425     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffset)
426             .addReg(ScratchOffset)
427             .addImm(OriginalImmOffset);
428   }
429 }
430 
431 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
432                                         int SPAdj, unsigned FIOperandNum,
433                                         RegScavenger *RS) const {
434   MachineFunction *MF = MI->getParent()->getParent();
435   MachineRegisterInfo &MRI = MF->getRegInfo();
436   MachineBasicBlock *MBB = MI->getParent();
437   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
438   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
439   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
440   const SIInstrInfo *TII = ST.getInstrInfo();
441   DebugLoc DL = MI->getDebugLoc();
442 
443   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
444   int Index = MI->getOperand(FIOperandNum).getIndex();
445 
446   switch (MI->getOpcode()) {
447     // SGPR register spill
448     case AMDGPU::SI_SPILL_S512_SAVE:
449     case AMDGPU::SI_SPILL_S256_SAVE:
450     case AMDGPU::SI_SPILL_S128_SAVE:
451     case AMDGPU::SI_SPILL_S64_SAVE:
452     case AMDGPU::SI_SPILL_S32_SAVE: {
453       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
454       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
455       unsigned SuperReg = MI->getOperand(0).getReg();
456       bool IsKill = MI->getOperand(0).isKill();
457 
458       // SubReg carries the "Kill" flag when SubReg == SuperReg.
459       unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill);
460       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
461         unsigned SubReg = NumSubRegs == 1 ?
462           SuperReg : getSubReg(SuperReg, getSubRegFromChannel(i));
463 
464         struct SIMachineFunctionInfo::SpilledReg Spill =
465             MFI->getSpilledReg(MF, Index, i);
466         if (Spill.hasReg()) {
467           if (SuperReg == AMDGPU::M0) {
468             assert(NumSubRegs == 1);
469             unsigned CopyM0
470               = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
471             BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), CopyM0)
472               .addReg(SuperReg, getKillRegState(IsKill));
473 
474             // The real spill now kills the temp copy.
475             SubReg = SuperReg = CopyM0;
476             IsKill = true;
477           }
478 
479           BuildMI(*MBB, MI, DL,
480                   TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
481                   Spill.VGPR)
482                   .addReg(SubReg, getKillRegState(IsKill))
483                   .addImm(Spill.Lane);
484 
485           // FIXME: Since this spills to another register instead of an actual
486           // frame index, we should delete the frame index when all references to
487           // it are fixed.
488         } else {
489           // Spill SGPR to a frame index.
490           // FIXME we should use S_STORE_DWORD here for VI.
491           MachineInstrBuilder Mov
492             = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
493             .addReg(SubReg, SubKillState);
494 
495 
496           // There could be undef components of a spilled super register.
497           // TODO: Can we detect this and skip the spill?
498           if (NumSubRegs > 1) {
499             // The last implicit use of the SuperReg carries the "Kill" flag.
500             unsigned SuperKillState = 0;
501             if (i + 1 == e)
502               SuperKillState |= getKillRegState(IsKill);
503             Mov.addReg(SuperReg, RegState::Implicit | SuperKillState);
504           }
505 
506           unsigned Size = FrameInfo.getObjectSize(Index);
507           unsigned Align = FrameInfo.getObjectAlignment(Index);
508           MachinePointerInfo PtrInfo
509               = MachinePointerInfo::getFixedStack(*MF, Index);
510           MachineMemOperand *MMO
511               = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
512                                          Size, Align);
513           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE))
514                   .addReg(TmpReg, RegState::Kill)         // src
515                   .addFrameIndex(Index)                   // frame_idx
516                   .addReg(MFI->getScratchRSrcReg())       // scratch_rsrc
517                   .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset
518                   .addImm(i * 4)                          // offset
519                   .addMemOperand(MMO);
520         }
521       }
522       MI->eraseFromParent();
523       MFI->addToSpilledSGPRs(NumSubRegs);
524       break;
525     }
526 
527     // SGPR register restore
528     case AMDGPU::SI_SPILL_S512_RESTORE:
529     case AMDGPU::SI_SPILL_S256_RESTORE:
530     case AMDGPU::SI_SPILL_S128_RESTORE:
531     case AMDGPU::SI_SPILL_S64_RESTORE:
532     case AMDGPU::SI_SPILL_S32_RESTORE: {
533       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
534       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
535       unsigned SuperReg = MI->getOperand(0).getReg();
536 
537       // m0 is not allowed as with readlane/writelane, so a temporary SGPR and
538       // extra copy is needed.
539       bool IsM0 = (SuperReg == AMDGPU::M0);
540       if (IsM0) {
541         assert(NumSubRegs == 1);
542         SuperReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
543       }
544 
545       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
546         unsigned SubReg = NumSubRegs == 1 ?
547           SuperReg : getSubReg(SuperReg, getSubRegFromChannel(i));
548 
549         SIMachineFunctionInfo::SpilledReg Spill
550           = MFI->getSpilledReg(MF, Index, i);
551 
552         if (Spill.hasReg()) {
553           BuildMI(*MBB, MI, DL,
554                   TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
555                   SubReg)
556                   .addReg(Spill.VGPR)
557                   .addImm(Spill.Lane)
558                   .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
559         } else {
560           // Restore SGPR from a stack slot.
561           // FIXME: We should use S_LOAD_DWORD here for VI.
562 
563           unsigned Align = FrameInfo.getObjectAlignment(Index);
564           unsigned Size = FrameInfo.getObjectSize(Index);
565 
566           MachinePointerInfo PtrInfo
567               = MachinePointerInfo::getFixedStack(*MF, Index);
568 
569           MachineMemOperand *MMO = MF->getMachineMemOperand(
570               PtrInfo, MachineMemOperand::MOLoad, Size, Align);
571 
572           BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg)
573                   .addFrameIndex(Index)                   // frame_idx
574                   .addReg(MFI->getScratchRSrcReg())       // scratch_rsrc
575                   .addReg(MFI->getScratchWaveOffsetReg()) // scratch_offset
576                   .addImm(i * 4)                          // offset
577                   .addMemOperand(MMO);
578           BuildMI(*MBB, MI, DL,
579                   TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg)
580                   .addReg(TmpReg, RegState::Kill)
581                   .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
582         }
583       }
584 
585       if (IsM0 && SuperReg != AMDGPU::M0) {
586         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), AMDGPU::M0)
587           .addReg(SuperReg);
588       }
589 
590       MI->eraseFromParent();
591       break;
592     }
593 
594     // VGPR register spill
595     case AMDGPU::SI_SPILL_V512_SAVE:
596     case AMDGPU::SI_SPILL_V256_SAVE:
597     case AMDGPU::SI_SPILL_V128_SAVE:
598     case AMDGPU::SI_SPILL_V96_SAVE:
599     case AMDGPU::SI_SPILL_V64_SAVE:
600     case AMDGPU::SI_SPILL_V32_SAVE:
601       buildScratchLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
602             TII->getNamedOperand(*MI, AMDGPU::OpName::src),
603             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
604             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
605             FrameInfo.getObjectOffset(Index) +
606             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS);
607       MI->eraseFromParent();
608       MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode()));
609       break;
610     case AMDGPU::SI_SPILL_V32_RESTORE:
611     case AMDGPU::SI_SPILL_V64_RESTORE:
612     case AMDGPU::SI_SPILL_V96_RESTORE:
613     case AMDGPU::SI_SPILL_V128_RESTORE:
614     case AMDGPU::SI_SPILL_V256_RESTORE:
615     case AMDGPU::SI_SPILL_V512_RESTORE: {
616       buildScratchLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
617             TII->getNamedOperand(*MI, AMDGPU::OpName::dst),
618             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
619             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
620             FrameInfo.getObjectOffset(Index) +
621             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS);
622       MI->eraseFromParent();
623       break;
624     }
625 
626     default: {
627       int64_t Offset = FrameInfo.getObjectOffset(Index);
628       FIOp.ChangeToImmediate(Offset);
629       if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) {
630         unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
631         BuildMI(*MBB, MI, MI->getDebugLoc(),
632                 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
633                 .addImm(Offset);
634         FIOp.ChangeToRegister(TmpReg, false, false, true);
635       }
636     }
637   }
638 }
639 
640 // FIXME: This is very slow. It might be worth creating a map from physreg to
641 // register class.
642 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
643   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
644 
645   static const TargetRegisterClass *const BaseClasses[] = {
646     &AMDGPU::VGPR_32RegClass,
647     &AMDGPU::SReg_32RegClass,
648     &AMDGPU::VReg_64RegClass,
649     &AMDGPU::SReg_64RegClass,
650     &AMDGPU::VReg_96RegClass,
651     &AMDGPU::VReg_128RegClass,
652     &AMDGPU::SReg_128RegClass,
653     &AMDGPU::VReg_256RegClass,
654     &AMDGPU::SReg_256RegClass,
655     &AMDGPU::VReg_512RegClass,
656     &AMDGPU::SReg_512RegClass,
657     &AMDGPU::SCC_CLASSRegClass,
658   };
659 
660   for (const TargetRegisterClass *BaseClass : BaseClasses) {
661     if (BaseClass->contains(Reg)) {
662       return BaseClass;
663     }
664   }
665   return nullptr;
666 }
667 
668 // TODO: It might be helpful to have some target specific flags in
669 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
670 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
671   switch (RC->getSize()) {
672   case 0: return false;
673   case 1: return false;
674   case 4:
675     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
676   case 8:
677     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
678   case 12:
679     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
680   case 16:
681     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
682   case 32:
683     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
684   case 64:
685     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
686   default:
687     llvm_unreachable("Invalid register class size");
688   }
689 }
690 
691 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
692                                          const TargetRegisterClass *SRC) const {
693   switch (SRC->getSize()) {
694   case 4:
695     return &AMDGPU::VGPR_32RegClass;
696   case 8:
697     return &AMDGPU::VReg_64RegClass;
698   case 12:
699     return &AMDGPU::VReg_96RegClass;
700   case 16:
701     return &AMDGPU::VReg_128RegClass;
702   case 32:
703     return &AMDGPU::VReg_256RegClass;
704   case 64:
705     return &AMDGPU::VReg_512RegClass;
706   default:
707     llvm_unreachable("Invalid register class size");
708   }
709 }
710 
711 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass(
712                                          const TargetRegisterClass *VRC) const {
713   switch (VRC->getSize()) {
714   case 4:
715     return &AMDGPU::SGPR_32RegClass;
716   case 8:
717     return &AMDGPU::SReg_64RegClass;
718   case 16:
719     return &AMDGPU::SReg_128RegClass;
720   case 32:
721     return &AMDGPU::SReg_256RegClass;
722   case 64:
723     return &AMDGPU::SReg_512RegClass;
724   default:
725     llvm_unreachable("Invalid register class size");
726   }
727 }
728 
729 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
730                          const TargetRegisterClass *RC, unsigned SubIdx) const {
731   if (SubIdx == AMDGPU::NoSubRegister)
732     return RC;
733 
734   // We can assume that each lane corresponds to one 32-bit register.
735   unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx));
736   if (isSGPRClass(RC)) {
737     switch (Count) {
738     case 1:
739       return &AMDGPU::SGPR_32RegClass;
740     case 2:
741       return &AMDGPU::SReg_64RegClass;
742     case 4:
743       return &AMDGPU::SReg_128RegClass;
744     case 8:
745       return &AMDGPU::SReg_256RegClass;
746     case 16: /* fall-through */
747     default:
748       llvm_unreachable("Invalid sub-register class size");
749     }
750   } else {
751     switch (Count) {
752     case 1:
753       return &AMDGPU::VGPR_32RegClass;
754     case 2:
755       return &AMDGPU::VReg_64RegClass;
756     case 3:
757       return &AMDGPU::VReg_96RegClass;
758     case 4:
759       return &AMDGPU::VReg_128RegClass;
760     case 8:
761       return &AMDGPU::VReg_256RegClass;
762     case 16: /* fall-through */
763     default:
764       llvm_unreachable("Invalid sub-register class size");
765     }
766   }
767 }
768 
769 bool SIRegisterInfo::shouldRewriteCopySrc(
770   const TargetRegisterClass *DefRC,
771   unsigned DefSubReg,
772   const TargetRegisterClass *SrcRC,
773   unsigned SrcSubReg) const {
774   // We want to prefer the smallest register class possible, so we don't want to
775   // stop and rewrite on anything that looks like a subregister
776   // extract. Operations mostly don't care about the super register class, so we
777   // only want to stop on the most basic of copies between the smae register
778   // class.
779   //
780   // e.g. if we have something like
781   // vreg0 = ...
782   // vreg1 = ...
783   // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2
784   // vreg3 = COPY vreg2, sub0
785   //
786   // We want to look through the COPY to find:
787   //  => vreg3 = COPY vreg0
788 
789   // Plain copy.
790   return getCommonSubClass(DefRC, SrcRC) != nullptr;
791 }
792 
793 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const {
794   return OpType == AMDGPU::OPERAND_REG_IMM32_INT ||
795          OpType == AMDGPU::OPERAND_REG_IMM32_FP;
796 }
797 
798 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const {
799   if (opCanUseLiteralConstant(OpType))
800     return true;
801 
802   return OpType == AMDGPU::OPERAND_REG_INLINE_C_INT ||
803          OpType == AMDGPU::OPERAND_REG_INLINE_C_FP;
804 }
805 
806 // FIXME: Most of these are flexible with HSA and we don't need to reserve them
807 // as input registers if unused. Whether the dispatch ptr is necessary should be
808 // easy to detect from used intrinsics. Scratch setup is harder to know.
809 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF,
810                                            enum PreloadedValue Value) const {
811 
812   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
813   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
814   (void)ST;
815   switch (Value) {
816   case SIRegisterInfo::WORKGROUP_ID_X:
817     assert(MFI->hasWorkGroupIDX());
818     return MFI->WorkGroupIDXSystemSGPR;
819   case SIRegisterInfo::WORKGROUP_ID_Y:
820     assert(MFI->hasWorkGroupIDY());
821     return MFI->WorkGroupIDYSystemSGPR;
822   case SIRegisterInfo::WORKGROUP_ID_Z:
823     assert(MFI->hasWorkGroupIDZ());
824     return MFI->WorkGroupIDZSystemSGPR;
825   case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:
826     return MFI->PrivateSegmentWaveByteOffsetSystemSGPR;
827   case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER:
828     assert(ST.isAmdHsaOS() && "Non-HSA ABI currently uses relocations");
829     assert(MFI->hasPrivateSegmentBuffer());
830     return MFI->PrivateSegmentBufferUserSGPR;
831   case SIRegisterInfo::KERNARG_SEGMENT_PTR:
832     assert(MFI->hasKernargSegmentPtr());
833     return MFI->KernargSegmentPtrUserSGPR;
834   case SIRegisterInfo::DISPATCH_ID:
835     assert(MFI->hasDispatchID());
836     return MFI->DispatchIDUserSGPR;
837   case SIRegisterInfo::FLAT_SCRATCH_INIT:
838     assert(MFI->hasFlatScratchInit());
839     return MFI->FlatScratchInitUserSGPR;
840   case SIRegisterInfo::DISPATCH_PTR:
841     assert(MFI->hasDispatchPtr());
842     return MFI->DispatchPtrUserSGPR;
843   case SIRegisterInfo::QUEUE_PTR:
844     assert(MFI->hasQueuePtr());
845     return MFI->QueuePtrUserSGPR;
846   case SIRegisterInfo::WORKITEM_ID_X:
847     assert(MFI->hasWorkItemIDX());
848     return AMDGPU::VGPR0;
849   case SIRegisterInfo::WORKITEM_ID_Y:
850     assert(MFI->hasWorkItemIDY());
851     return AMDGPU::VGPR1;
852   case SIRegisterInfo::WORKITEM_ID_Z:
853     assert(MFI->hasWorkItemIDZ());
854     return AMDGPU::VGPR2;
855   }
856   llvm_unreachable("unexpected preloaded value type");
857 }
858 
859 /// \brief Returns a register that is not used at any point in the function.
860 ///        If all registers are used, then this function will return
861 //         AMDGPU::NoRegister.
862 unsigned
863 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
864                                    const TargetRegisterClass *RC,
865                                    const MachineFunction &MF) const {
866 
867   for (unsigned Reg : *RC)
868     if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg))
869       return Reg;
870   return AMDGPU::NoRegister;
871 }
872 
873 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI,
874                             unsigned Reg) const {
875   const TargetRegisterClass *RC;
876   if (TargetRegisterInfo::isVirtualRegister(Reg))
877     RC = MRI.getRegClass(Reg);
878   else
879     RC = getPhysRegClass(Reg);
880 
881   return hasVGPRs(RC);
882 }
883 
884 unsigned SIRegisterInfo::getTotalNumSGPRs(const SISubtarget &ST) const {
885   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
886     return 800;
887   return 512;
888 }
889 
890 unsigned SIRegisterInfo::getNumAddressableSGPRs(const SISubtarget &ST) const {
891   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
892     return 102;
893   return 104;
894 }
895 
896 unsigned SIRegisterInfo::getNumReservedSGPRs(const SISubtarget &ST) const {
897   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
898     return 6; // VCC, FLAT_SCRATCH, XNACK.
899   return 2; // VCC.
900 }
901 
902 unsigned SIRegisterInfo::getMinNumSGPRs(const SISubtarget &ST,
903                                         unsigned WavesPerEU) const {
904   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
905     switch (WavesPerEU) {
906       case 0:  return 0;
907       case 10: return 0;
908       case 9:  return 0;
909       case 8:  return 81;
910       default: return 97;
911     }
912   } else {
913     switch (WavesPerEU) {
914       case 0:  return 0;
915       case 10: return 0;
916       case 9:  return 49;
917       case 8:  return 57;
918       case 7:  return 65;
919       case 6:  return 73;
920       case 5:  return 81;
921       default: return 97;
922     }
923   }
924 }
925 
926 unsigned SIRegisterInfo::getMaxNumSGPRs(const SISubtarget &ST,
927                                         unsigned WavesPerEU) const {
928   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
929     switch (WavesPerEU) {
930       case 0:  return 80;
931       case 10: return 80;
932       case 9:  return 80;
933       case 8:  return 96;
934       default: return getNumAddressableSGPRs(ST);
935     }
936   } else {
937     switch (WavesPerEU) {
938       case 0:  return 48;
939       case 10: return 48;
940       case 9:  return 56;
941       case 8:  return 64;
942       case 7:  return 72;
943       case 6:  return 80;
944       case 5:  return 96;
945       default: return getNumAddressableSGPRs(ST);
946     }
947   }
948 }
949 
950 unsigned SIRegisterInfo::getMaxNumSGPRs(const MachineFunction &MF) const {
951   const Function &F = *MF.getFunction();
952 
953   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
954   const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
955 
956   // Compute maximum number of SGPRs function can use using default/requested
957   // minimum number of waves per execution unit.
958   std::pair<unsigned, unsigned> WavesPerEU = MFI.getWavesPerEU();
959   unsigned MaxNumSGPRs = getMaxNumSGPRs(ST, WavesPerEU.first);
960 
961   // Check if maximum number of SGPRs was explicitly requested using
962   // "amdgpu-num-sgpr" attribute.
963   if (F.hasFnAttribute("amdgpu-num-sgpr")) {
964     unsigned Requested = AMDGPU::getIntegerAttribute(
965       F, "amdgpu-num-sgpr", MaxNumSGPRs);
966 
967     // Make sure requested value does not violate subtarget's specifications.
968     if (Requested && Requested <= getNumReservedSGPRs(ST))
969       Requested = 0;
970 
971     // Make sure requested value is compatible with values implied by
972     // default/requested minimum/maximum number of waves per execution unit.
973     if (Requested && Requested > getMaxNumSGPRs(ST, WavesPerEU.first))
974       Requested = 0;
975     if (WavesPerEU.second &&
976         Requested && Requested < getMinNumSGPRs(ST, WavesPerEU.second))
977       Requested = 0;
978 
979     if (Requested)
980       MaxNumSGPRs = Requested;
981   }
982 
983   if (ST.hasSGPRInitBug())
984     MaxNumSGPRs = SISubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG;
985 
986   return MaxNumSGPRs - getNumReservedSGPRs(ST);
987 }
988 
989 unsigned SIRegisterInfo::getNumDebuggerReservedVGPRs(
990   const SISubtarget &ST) const {
991   if (ST.debuggerReserveRegs())
992     return 4;
993   return 0;
994 }
995 
996 unsigned SIRegisterInfo::getMinNumVGPRs(unsigned WavesPerEU) const {
997   switch (WavesPerEU) {
998     case 0:  return 0;
999     case 10: return 0;
1000     case 9:  return 25;
1001     case 8:  return 29;
1002     case 7:  return 33;
1003     case 6:  return 37;
1004     case 5:  return 41;
1005     case 4:  return 49;
1006     case 3:  return 65;
1007     case 2:  return 85;
1008     default: return 129;
1009   }
1010 }
1011 
1012 unsigned SIRegisterInfo::getMaxNumVGPRs(unsigned WavesPerEU) const {
1013   switch (WavesPerEU) {
1014     case 0:  return 24;
1015     case 10: return 24;
1016     case 9:  return 28;
1017     case 8:  return 32;
1018     case 7:  return 36;
1019     case 6:  return 40;
1020     case 5:  return 48;
1021     case 4:  return 64;
1022     case 3:  return 84;
1023     case 2:  return 128;
1024     default: return getTotalNumVGPRs();
1025   }
1026 }
1027 
1028 unsigned SIRegisterInfo::getMaxNumVGPRs(const MachineFunction &MF) const {
1029   const Function &F = *MF.getFunction();
1030 
1031   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
1032   const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
1033 
1034   // Compute maximum number of VGPRs function can use using default/requested
1035   // minimum number of waves per execution unit.
1036   std::pair<unsigned, unsigned> WavesPerEU = MFI.getWavesPerEU();
1037   unsigned MaxNumVGPRs = getMaxNumVGPRs(WavesPerEU.first);
1038 
1039   // Check if maximum number of VGPRs was explicitly requested using
1040   // "amdgpu-num-vgpr" attribute.
1041   if (F.hasFnAttribute("amdgpu-num-vgpr")) {
1042     unsigned Requested = AMDGPU::getIntegerAttribute(
1043       F, "amdgpu-num-vgpr", MaxNumVGPRs);
1044 
1045     // Make sure requested value does not violate subtarget's specifications.
1046     if (Requested && Requested <= getNumDebuggerReservedVGPRs(ST))
1047       Requested = 0;
1048 
1049     // Make sure requested value is compatible with values implied by
1050     // default/requested minimum/maximum number of waves per execution unit.
1051     if (Requested && Requested > getMaxNumVGPRs(WavesPerEU.first))
1052       Requested = 0;
1053     if (WavesPerEU.second &&
1054         Requested && Requested < getMinNumVGPRs(WavesPerEU.second))
1055       Requested = 0;
1056 
1057     if (Requested)
1058       MaxNumVGPRs = Requested;
1059   }
1060 
1061   return MaxNumVGPRs - getNumDebuggerReservedVGPRs(ST);
1062 }
1063