OSDN Git Service

63cd49dc0448563fa0829fa74f069f2acc319554
[android-x86/external-llvm.git] / lib / Target / AMDGPU / SIRegisterInfo.cpp
1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file
11 /// \brief SI implementation of the TargetRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "SIRegisterInfo.h"
16 #include "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 cl::opt<bool> EnableSpillSGPRToSMEM(
28   "amdgpu-spill-sgpr-to-smem",
29   cl::desc("Use scalar stores to spill SGPRs if supported by subtarget"),
30   cl::init(true));
31
32
33 static bool hasPressureSet(const int *PSets, unsigned PSetID) {
34   for (unsigned i = 0; PSets[i] != -1; ++i) {
35     if (PSets[i] == (int)PSetID)
36       return true;
37   }
38   return false;
39 }
40
41 void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg,
42                                          BitVector &PressureSets) const {
43   for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) {
44     const int *PSets = getRegUnitPressureSets(*U);
45     if (hasPressureSet(PSets, PSetID)) {
46       PressureSets.set(PSetID);
47       break;
48     }
49   }
50 }
51
52 SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo(),
53                                    SGPRPressureSets(getNumRegPressureSets()),
54                                    VGPRPressureSets(getNumRegPressureSets()) {
55   unsigned NumRegPressureSets = getNumRegPressureSets();
56
57   SGPRSetID = NumRegPressureSets;
58   VGPRSetID = NumRegPressureSets;
59
60   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
61     classifyPressureSet(i, AMDGPU::SGPR0, SGPRPressureSets);
62     classifyPressureSet(i, AMDGPU::VGPR0, VGPRPressureSets);
63   }
64
65   // Determine the number of reg units for each pressure set.
66   std::vector<unsigned> PressureSetRegUnits(NumRegPressureSets, 0);
67   for (unsigned i = 0, e = getNumRegUnits(); i != e; ++i) {
68     const int *PSets = getRegUnitPressureSets(i);
69     for (unsigned j = 0; PSets[j] != -1; ++j) {
70       ++PressureSetRegUnits[PSets[j]];
71     }
72   }
73
74   unsigned VGPRMax = 0, SGPRMax = 0;
75   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
76     if (isVGPRPressureSet(i) && PressureSetRegUnits[i] > VGPRMax) {
77       VGPRSetID = i;
78       VGPRMax = PressureSetRegUnits[i];
79       continue;
80     }
81     if (isSGPRPressureSet(i) && PressureSetRegUnits[i] > SGPRMax) {
82       SGPRSetID = i;
83       SGPRMax = PressureSetRegUnits[i];
84     }
85   }
86
87   assert(SGPRSetID < NumRegPressureSets &&
88          VGPRSetID < NumRegPressureSets);
89 }
90
91 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const {
92   MCRegAliasIterator R(Reg, this, true);
93
94   for (; R.isValid(); ++R)
95     Reserved.set(*R);
96 }
97
98 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
99   const MachineFunction &MF) const {
100   unsigned BaseIdx = alignDown(getMaxNumSGPRs(MF), 4) - 4;
101   unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
102   return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass);
103 }
104
105 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
106   const MachineFunction &MF) const {
107   unsigned RegCount = getMaxNumSGPRs(MF);
108   unsigned Reg;
109
110   // Try to place it in a hole after PrivateSegmentbufferReg.
111   if (RegCount & 3) {
112     // We cannot put the segment buffer in (Idx - 4) ... (Idx - 1) due to
113     // alignment constraints, so we have a hole where can put the wave offset.
114     Reg = RegCount - 1;
115   } else {
116     // We can put the segment buffer in (Idx - 4) ... (Idx - 1) and put the
117     // wave offset before it.
118     Reg = RegCount - 5;
119   }
120   return AMDGPU::SGPR_32RegClass.getRegister(Reg);
121 }
122
123 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
124   BitVector Reserved(getNumRegs());
125   Reserved.set(AMDGPU::INDIRECT_BASE_ADDR);
126
127   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
128   // this seems likely to result in bugs, so I'm marking them as reserved.
129   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
130   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
131
132   // Reserve Trap Handler registers - support is not implemented in Codegen.
133   reserveRegisterTuples(Reserved, AMDGPU::TBA);
134   reserveRegisterTuples(Reserved, AMDGPU::TMA);
135   reserveRegisterTuples(Reserved, AMDGPU::TTMP0_TTMP1);
136   reserveRegisterTuples(Reserved, AMDGPU::TTMP2_TTMP3);
137   reserveRegisterTuples(Reserved, AMDGPU::TTMP4_TTMP5);
138   reserveRegisterTuples(Reserved, AMDGPU::TTMP6_TTMP7);
139   reserveRegisterTuples(Reserved, AMDGPU::TTMP8_TTMP9);
140   reserveRegisterTuples(Reserved, AMDGPU::TTMP10_TTMP11);
141
142   unsigned MaxNumSGPRs = getMaxNumSGPRs(MF);
143   unsigned TotalNumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
144   for (unsigned i = MaxNumSGPRs; i < TotalNumSGPRs; ++i) {
145     unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
146     reserveRegisterTuples(Reserved, Reg);
147   }
148
149   unsigned MaxNumVGPRs = getMaxNumVGPRs(MF);
150   unsigned TotalNumVGPRs = AMDGPU::VGPR_32RegClass.getNumRegs();
151   for (unsigned i = MaxNumVGPRs; i < TotalNumVGPRs; ++i) {
152     unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i);
153     reserveRegisterTuples(Reserved, Reg);
154   }
155
156   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
157
158   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
159   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
160     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
161     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
162   }
163
164   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
165   if (ScratchRSrcReg != AMDGPU::NoRegister) {
166     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
167     // to spill.
168     // TODO: May need to reserve a VGPR if doing LDS spilling.
169     reserveRegisterTuples(Reserved, ScratchRSrcReg);
170     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
171   }
172
173   return Reserved;
174 }
175
176 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
177   return Fn.getFrameInfo().hasStackObjects();
178 }
179
180 bool
181 SIRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
182   return MF.getFrameInfo().hasStackObjects();
183 }
184
185 bool SIRegisterInfo::requiresVirtualBaseRegisters(
186   const MachineFunction &) const {
187   // There are no special dedicated stack or frame pointers.
188   return true;
189 }
190
191 bool SIRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) const {
192   // This helps catch bugs as verifier errors.
193   return true;
194 }
195
196 int64_t SIRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI,
197                                                  int Idx) const {
198   if (!SIInstrInfo::isMUBUF(*MI))
199     return 0;
200
201   assert(Idx == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
202                                            AMDGPU::OpName::vaddr) &&
203          "Should never see frame index on non-address operand");
204
205   int OffIdx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
206                                           AMDGPU::OpName::offset);
207   return MI->getOperand(OffIdx).getImm();
208 }
209
210 bool SIRegisterInfo::needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const {
211   return MI->mayLoadOrStore();
212 }
213
214 void SIRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
215                                                   unsigned BaseReg,
216                                                   int FrameIdx,
217                                                   int64_t Offset) const {
218   MachineBasicBlock::iterator Ins = MBB->begin();
219   DebugLoc DL; // Defaults to "unknown"
220
221   if (Ins != MBB->end())
222     DL = Ins->getDebugLoc();
223
224   MachineFunction *MF = MBB->getParent();
225   const SISubtarget &Subtarget = MF->getSubtarget<SISubtarget>();
226   const SIInstrInfo *TII = Subtarget.getInstrInfo();
227
228   if (Offset == 0) {
229     BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_MOV_B32_e32), BaseReg)
230       .addFrameIndex(FrameIdx);
231     return;
232   }
233
234   MachineRegisterInfo &MRI = MF->getRegInfo();
235   unsigned UnusedCarry = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
236   unsigned OffsetReg = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
237
238   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
239     .addImm(Offset);
240   BuildMI(*MBB, Ins, DL, TII->get(AMDGPU::V_ADD_I32_e64), BaseReg)
241     .addReg(UnusedCarry, RegState::Define | RegState::Dead)
242     .addReg(OffsetReg, RegState::Kill)
243     .addFrameIndex(FrameIdx);
244 }
245
246 void SIRegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
247                                        int64_t Offset) const {
248
249   MachineBasicBlock *MBB = MI.getParent();
250   MachineFunction *MF = MBB->getParent();
251   const SISubtarget &Subtarget = MF->getSubtarget<SISubtarget>();
252   const SIInstrInfo *TII = Subtarget.getInstrInfo();
253
254 #ifndef NDEBUG
255   // FIXME: Is it possible to be storing a frame index to itself?
256   bool SeenFI = false;
257   for (const MachineOperand &MO: MI.operands()) {
258     if (MO.isFI()) {
259       if (SeenFI)
260         llvm_unreachable("should not see multiple frame indices");
261
262       SeenFI = true;
263     }
264   }
265 #endif
266
267   MachineOperand *FIOp = TII->getNamedOperand(MI, AMDGPU::OpName::vaddr);
268   assert(FIOp && FIOp->isFI() && "frame index must be address operand");
269
270   assert(TII->isMUBUF(MI));
271
272   MachineOperand *OffsetOp = TII->getNamedOperand(MI, AMDGPU::OpName::offset);
273   int64_t NewOffset = OffsetOp->getImm() + Offset;
274   assert(isUInt<12>(NewOffset) && "offset should be legal");
275
276   FIOp->ChangeToRegister(BaseReg, false);
277   OffsetOp->setImm(NewOffset);
278 }
279
280 bool SIRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
281                                         unsigned BaseReg,
282                                         int64_t Offset) const {
283   return SIInstrInfo::isMUBUF(*MI) && isUInt<12>(Offset);
284 }
285
286 const TargetRegisterClass *SIRegisterInfo::getPointerRegClass(
287   const MachineFunction &MF, unsigned Kind) const {
288   // This is inaccurate. It depends on the instruction and address space. The
289   // only place where we should hit this is for dealing with frame indexes /
290   // private accesses, so this is correct in that case.
291   return &AMDGPU::VGPR_32RegClass;
292 }
293
294 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
295
296   switch (Op) {
297   case AMDGPU::SI_SPILL_S512_SAVE:
298   case AMDGPU::SI_SPILL_S512_RESTORE:
299   case AMDGPU::SI_SPILL_V512_SAVE:
300   case AMDGPU::SI_SPILL_V512_RESTORE:
301     return 16;
302   case AMDGPU::SI_SPILL_S256_SAVE:
303   case AMDGPU::SI_SPILL_S256_RESTORE:
304   case AMDGPU::SI_SPILL_V256_SAVE:
305   case AMDGPU::SI_SPILL_V256_RESTORE:
306     return 8;
307   case AMDGPU::SI_SPILL_S128_SAVE:
308   case AMDGPU::SI_SPILL_S128_RESTORE:
309   case AMDGPU::SI_SPILL_V128_SAVE:
310   case AMDGPU::SI_SPILL_V128_RESTORE:
311     return 4;
312   case AMDGPU::SI_SPILL_V96_SAVE:
313   case AMDGPU::SI_SPILL_V96_RESTORE:
314     return 3;
315   case AMDGPU::SI_SPILL_S64_SAVE:
316   case AMDGPU::SI_SPILL_S64_RESTORE:
317   case AMDGPU::SI_SPILL_V64_SAVE:
318   case AMDGPU::SI_SPILL_V64_RESTORE:
319     return 2;
320   case AMDGPU::SI_SPILL_S32_SAVE:
321   case AMDGPU::SI_SPILL_S32_RESTORE:
322   case AMDGPU::SI_SPILL_V32_SAVE:
323   case AMDGPU::SI_SPILL_V32_RESTORE:
324     return 1;
325   default: llvm_unreachable("Invalid spill opcode");
326   }
327 }
328
329 static int getOffsetMUBUFStore(unsigned Opc) {
330   switch (Opc) {
331   case AMDGPU::BUFFER_STORE_DWORD_OFFEN:
332     return AMDGPU::BUFFER_STORE_DWORD_OFFSET;
333   case AMDGPU::BUFFER_STORE_BYTE_OFFEN:
334     return AMDGPU::BUFFER_STORE_BYTE_OFFSET;
335   case AMDGPU::BUFFER_STORE_SHORT_OFFEN:
336     return AMDGPU::BUFFER_STORE_SHORT_OFFSET;
337   case AMDGPU::BUFFER_STORE_DWORDX2_OFFEN:
338     return AMDGPU::BUFFER_STORE_DWORDX2_OFFSET;
339   case AMDGPU::BUFFER_STORE_DWORDX4_OFFEN:
340     return AMDGPU::BUFFER_STORE_DWORDX4_OFFSET;
341   default:
342     return -1;
343   }
344 }
345
346 static int getOffsetMUBUFLoad(unsigned Opc) {
347   switch (Opc) {
348   case AMDGPU::BUFFER_LOAD_DWORD_OFFEN:
349     return AMDGPU::BUFFER_LOAD_DWORD_OFFSET;
350   case AMDGPU::BUFFER_LOAD_UBYTE_OFFEN:
351     return AMDGPU::BUFFER_LOAD_UBYTE_OFFSET;
352   case AMDGPU::BUFFER_LOAD_SBYTE_OFFEN:
353     return AMDGPU::BUFFER_LOAD_SBYTE_OFFSET;
354   case AMDGPU::BUFFER_LOAD_USHORT_OFFEN:
355     return AMDGPU::BUFFER_LOAD_USHORT_OFFSET;
356   case AMDGPU::BUFFER_LOAD_SSHORT_OFFEN:
357     return AMDGPU::BUFFER_LOAD_SSHORT_OFFSET;
358   case AMDGPU::BUFFER_LOAD_DWORDX2_OFFEN:
359     return AMDGPU::BUFFER_LOAD_DWORDX2_OFFSET;
360   case AMDGPU::BUFFER_LOAD_DWORDX4_OFFEN:
361     return AMDGPU::BUFFER_LOAD_DWORDX4_OFFSET;
362   default:
363     return -1;
364   }
365 }
366
367 // This differs from buildSpillLoadStore by only scavenging a VGPR. It does not
368 // need to handle the case where an SGPR may need to be spilled while spilling.
369 static bool buildMUBUFOffsetLoadStore(const SIInstrInfo *TII,
370                                       MachineFrameInfo &MFI,
371                                       MachineBasicBlock::iterator MI,
372                                       int Index,
373                                       int64_t Offset) {
374   MachineBasicBlock *MBB = MI->getParent();
375   const DebugLoc &DL = MI->getDebugLoc();
376   bool IsStore = MI->mayStore();
377
378   unsigned Opc = MI->getOpcode();
379   int LoadStoreOp = IsStore ?
380     getOffsetMUBUFStore(Opc) : getOffsetMUBUFLoad(Opc);
381   if (LoadStoreOp == -1)
382     return false;
383
384   unsigned Reg = TII->getNamedOperand(*MI, AMDGPU::OpName::vdata)->getReg();
385
386   BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
387     .addReg(Reg, getDefRegState(!IsStore))
388     .addOperand(*TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc))
389     .addOperand(*TII->getNamedOperand(*MI, AMDGPU::OpName::soffset))
390     .addImm(Offset)
391     .addImm(0) // glc
392     .addImm(0) // slc
393     .addImm(0) // tfe
394     .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
395   return true;
396 }
397
398 void SIRegisterInfo::buildSpillLoadStore(MachineBasicBlock::iterator MI,
399                                          unsigned LoadStoreOp,
400                                          const MachineOperand *SrcDst,
401                                          unsigned ScratchRsrcReg,
402                                          unsigned ScratchOffset,
403                                          int64_t Offset,
404                                          RegScavenger *RS) const {
405   unsigned Value = SrcDst->getReg();
406   bool IsKill = SrcDst->isKill();
407   MachineBasicBlock *MBB = MI->getParent();
408   MachineFunction *MF = MI->getParent()->getParent();
409   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
410   const SIInstrInfo *TII = ST.getInstrInfo();
411
412   DebugLoc DL = MI->getDebugLoc();
413   bool IsStore = MI->mayStore();
414
415   bool RanOutOfSGPRs = false;
416   bool Scavenged = false;
417   unsigned SOffset = ScratchOffset;
418   unsigned OriginalImmOffset = Offset;
419
420   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
421   unsigned Size = NumSubRegs * 4;
422
423   if (!isUInt<12>(Offset + Size)) {
424     SOffset = AMDGPU::NoRegister;
425
426     // We don't have access to the register scavenger if this function is called
427     // during  PEI::scavengeFrameVirtualRegs().
428     if (RS)
429       SOffset = RS->FindUnusedReg(&AMDGPU::SGPR_32RegClass);
430
431     if (SOffset == AMDGPU::NoRegister) {
432       // There are no free SGPRs, and since we are in the process of spilling
433       // VGPRs too.  Since we need a VGPR in order to spill SGPRs (this is true
434       // on SI/CI and on VI it is true until we implement spilling using scalar
435       // stores), we have no way to free up an SGPR.  Our solution here is to
436       // add the offset directly to the ScratchOffset register, and then
437       // subtract the offset after the spill to return ScratchOffset to it's
438       // original value.
439       RanOutOfSGPRs = true;
440       SOffset = ScratchOffset;
441     } else {
442       Scavenged = true;
443     }
444     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
445             .addReg(ScratchOffset)
446             .addImm(Offset);
447     Offset = 0;
448   }
449
450   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += 4) {
451     unsigned SubReg = NumSubRegs == 1 ?
452       Value : getSubReg(Value, getSubRegFromChannel(i));
453
454     unsigned SOffsetRegState = 0;
455     unsigned SrcDstRegState = getDefRegState(!IsStore);
456     if (i + 1 == e) {
457       SOffsetRegState |= getKillRegState(Scavenged);
458       // The last implicit use carries the "Kill" flag.
459       SrcDstRegState |= getKillRegState(IsKill);
460     }
461
462     BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
463       .addReg(SubReg, getDefRegState(!IsStore))
464       .addReg(ScratchRsrcReg)
465       .addReg(SOffset, SOffsetRegState)
466       .addImm(Offset)
467       .addImm(0) // glc
468       .addImm(0) // slc
469       .addImm(0) // tfe
470       .addReg(Value, RegState::Implicit | SrcDstRegState)
471       .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
472   }
473   if (RanOutOfSGPRs) {
474     // Subtract the offset we added to the ScratchOffset register.
475     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_SUB_U32), ScratchOffset)
476             .addReg(ScratchOffset)
477             .addImm(OriginalImmOffset);
478   }
479 }
480
481 void SIRegisterInfo::spillSGPR(MachineBasicBlock::iterator MI,
482                                int Index,
483                                RegScavenger *RS) const {
484   MachineBasicBlock *MBB = MI->getParent();
485   MachineFunction *MF = MBB->getParent();
486   MachineRegisterInfo &MRI = MF->getRegInfo();
487   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
488   const SIInstrInfo *TII = ST.getInstrInfo();
489
490   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
491   unsigned SuperReg = MI->getOperand(0).getReg();
492   bool IsKill = MI->getOperand(0).isKill();
493   const DebugLoc &DL = MI->getDebugLoc();
494
495   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
496   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
497
498   bool SpillToSMEM = ST.hasScalarStores() && EnableSpillSGPRToSMEM;
499
500   // SubReg carries the "Kill" flag when SubReg == SuperReg.
501   unsigned SubKillState = getKillRegState((NumSubRegs == 1) && IsKill);
502   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
503     unsigned SubReg = NumSubRegs == 1 ?
504       SuperReg : getSubReg(SuperReg, getSubRegFromChannel(i));
505
506     if (SpillToSMEM) {
507       if (SuperReg == AMDGPU::M0) {
508         assert(NumSubRegs == 1);
509         unsigned CopyM0
510           = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
511
512         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::COPY), CopyM0)
513           .addReg(AMDGPU::M0, getKillRegState(IsKill));
514
515         // The real spill now kills the temp copy.
516         SubReg = SuperReg = CopyM0;
517         IsKill = true;
518       }
519
520       int64_t FrOffset = FrameInfo.getObjectOffset(Index);
521       unsigned Size = FrameInfo.getObjectSize(Index);
522       unsigned Align = FrameInfo.getObjectAlignment(Index);
523       MachinePointerInfo PtrInfo
524         = MachinePointerInfo::getFixedStack(*MF, Index);
525       MachineMemOperand *MMO
526         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
527                                    Size, Align);
528
529       unsigned OffsetReg = AMDGPU::M0;
530       // Add i * 4 wave offset.
531       //
532       // SMEM instructions only support a single offset, so increment the wave
533       // offset.
534
535       int64_t Offset = ST.getWavefrontSize() * (FrOffset + 4 * i);
536       if (Offset != 0) {
537         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg)
538           .addReg(MFI->getScratchWaveOffsetReg())
539           .addImm(Offset);
540       } else {
541         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
542           .addReg(MFI->getScratchWaveOffsetReg());
543       }
544
545       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_BUFFER_STORE_DWORD_SGPR))
546         .addReg(SubReg, getKillRegState(IsKill)) // sdata
547         .addReg(MFI->getScratchRSrcReg())        // sbase
548         .addReg(OffsetReg)                       // soff
549         .addImm(0)                               // glc
550         .addMemOperand(MMO);
551
552       continue;
553     }
554
555     struct SIMachineFunctionInfo::SpilledReg Spill =
556       MFI->getSpilledReg(MF, Index, i);
557     if (Spill.hasReg()) {
558       if (SuperReg == AMDGPU::M0) {
559         assert(NumSubRegs == 1);
560         unsigned CopyM0
561           = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
562         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), CopyM0)
563           .addReg(SuperReg, getKillRegState(IsKill));
564
565         // The real spill now kills the temp copy.
566         SubReg = SuperReg = CopyM0;
567         IsKill = true;
568       }
569
570       BuildMI(*MBB, MI, DL,
571               TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
572               Spill.VGPR)
573         .addReg(SubReg, getKillRegState(IsKill))
574         .addImm(Spill.Lane);
575
576       // FIXME: Since this spills to another register instead of an actual
577       // frame index, we should delete the frame index when all references to
578       // it are fixed.
579     } else {
580       // Spill SGPR to a frame index.
581       // TODO: Should VI try to spill to VGPR and then spill to SMEM?
582       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
583       // TODO: Should VI try to spill to VGPR and then spill to SMEM?
584
585       MachineInstrBuilder Mov
586         = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
587         .addReg(SubReg, SubKillState);
588
589
590       // There could be undef components of a spilled super register.
591       // TODO: Can we detect this and skip the spill?
592       if (NumSubRegs > 1) {
593         // The last implicit use of the SuperReg carries the "Kill" flag.
594         unsigned SuperKillState = 0;
595         if (i + 1 == e)
596           SuperKillState |= getKillRegState(IsKill);
597         Mov.addReg(SuperReg, RegState::Implicit | SuperKillState);
598       }
599
600       unsigned Size = FrameInfo.getObjectSize(Index);
601       unsigned Align = FrameInfo.getObjectAlignment(Index);
602       MachinePointerInfo PtrInfo
603         = MachinePointerInfo::getFixedStack(*MF, Index);
604       MachineMemOperand *MMO
605         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOStore,
606                                    Size, Align);
607       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_SAVE))
608         .addReg(TmpReg, RegState::Kill)         // src
609         .addFrameIndex(Index)                   // vaddr
610         .addReg(MFI->getScratchRSrcReg())       // srrsrc
611         .addReg(MFI->getScratchWaveOffsetReg()) // soffset
612         .addImm(i * 4)                          // offset
613         .addMemOperand(MMO);
614     }
615   }
616
617   MI->eraseFromParent();
618   MFI->addToSpilledSGPRs(NumSubRegs);
619 }
620
621 void SIRegisterInfo::restoreSGPR(MachineBasicBlock::iterator MI,
622                                  int Index,
623                                  RegScavenger *RS) const {
624   MachineFunction *MF = MI->getParent()->getParent();
625   MachineRegisterInfo &MRI = MF->getRegInfo();
626   MachineBasicBlock *MBB = MI->getParent();
627   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
628   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
629   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
630   const SIInstrInfo *TII = ST.getInstrInfo();
631   const DebugLoc &DL = MI->getDebugLoc();
632
633   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
634   unsigned SuperReg = MI->getOperand(0).getReg();
635   bool SpillToSMEM = ST.hasScalarStores() && EnableSpillSGPRToSMEM;
636
637   // m0 is not allowed as with readlane/writelane, so a temporary SGPR and
638   // extra copy is needed.
639   bool IsM0 = (SuperReg == AMDGPU::M0);
640   if (IsM0) {
641     assert(NumSubRegs == 1);
642     SuperReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
643   }
644
645   int64_t FrOffset = FrameInfo.getObjectOffset(Index);
646
647   for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
648     unsigned SubReg = NumSubRegs == 1 ?
649       SuperReg : getSubReg(SuperReg, getSubRegFromChannel(i));
650
651     if (SpillToSMEM) {
652       unsigned Size = FrameInfo.getObjectSize(Index);
653       unsigned Align = FrameInfo.getObjectAlignment(Index);
654       MachinePointerInfo PtrInfo
655         = MachinePointerInfo::getFixedStack(*MF, Index);
656       MachineMemOperand *MMO
657         = MF->getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
658                                    Size, Align);
659
660       unsigned OffsetReg = AMDGPU::M0;
661
662       // Add i * 4 offset
663       int64_t Offset = ST.getWavefrontSize() * (FrOffset + 4 * i);
664       if (Offset != 0) {
665         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), OffsetReg)
666           .addReg(MFI->getScratchWaveOffsetReg())
667           .addImm(Offset);
668       } else {
669         BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), OffsetReg)
670           .addReg(MFI->getScratchWaveOffsetReg());
671       }
672
673       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_BUFFER_LOAD_DWORD_SGPR), SubReg)
674         .addReg(MFI->getScratchRSrcReg()) // sbase
675         .addReg(OffsetReg)                // soff
676         .addImm(0)                        // glc
677         .addMemOperand(MMO)
678         .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
679
680       continue;
681     }
682
683     SIMachineFunctionInfo::SpilledReg Spill
684       = MFI->getSpilledReg(MF, Index, i);
685
686     if (Spill.hasReg()) {
687       BuildMI(*MBB, MI, DL,
688               TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
689               SubReg)
690         .addReg(Spill.VGPR)
691         .addImm(Spill.Lane)
692         .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
693     } else {
694       // Restore SGPR from a stack slot.
695       // FIXME: We should use S_LOAD_DWORD here for VI.
696
697       unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
698       unsigned Align = FrameInfo.getObjectAlignment(Index);
699       unsigned Size = FrameInfo.getObjectSize(Index);
700
701       MachinePointerInfo PtrInfo
702         = MachinePointerInfo::getFixedStack(*MF, Index);
703
704       MachineMemOperand *MMO = MF->getMachineMemOperand(
705         PtrInfo, MachineMemOperand::MOLoad, Size, Align);
706
707       BuildMI(*MBB, MI, DL, TII->get(AMDGPU::SI_SPILL_V32_RESTORE), TmpReg)
708         .addFrameIndex(Index)                   // vaddr
709         .addReg(MFI->getScratchRSrcReg())       // srsrc
710         .addReg(MFI->getScratchWaveOffsetReg()) // soffset
711         .addImm(i * 4)                          // offset
712         .addMemOperand(MMO);
713       BuildMI(*MBB, MI, DL,
714               TII->get(AMDGPU::V_READFIRSTLANE_B32), SubReg)
715         .addReg(TmpReg, RegState::Kill)
716         .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
717     }
718   }
719
720   if (IsM0 && SuperReg != AMDGPU::M0) {
721     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_MOV_B32), AMDGPU::M0)
722       .addReg(SuperReg);
723   }
724
725   MI->eraseFromParent();
726 }
727
728 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
729                                         int SPAdj, unsigned FIOperandNum,
730                                         RegScavenger *RS) const {
731   MachineFunction *MF = MI->getParent()->getParent();
732   MachineRegisterInfo &MRI = MF->getRegInfo();
733   MachineBasicBlock *MBB = MI->getParent();
734   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
735   MachineFrameInfo &FrameInfo = MF->getFrameInfo();
736   const SISubtarget &ST =  MF->getSubtarget<SISubtarget>();
737   const SIInstrInfo *TII = ST.getInstrInfo();
738   DebugLoc DL = MI->getDebugLoc();
739
740   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
741   int Index = MI->getOperand(FIOperandNum).getIndex();
742
743   switch (MI->getOpcode()) {
744     // SGPR register spill
745     case AMDGPU::SI_SPILL_S512_SAVE:
746     case AMDGPU::SI_SPILL_S256_SAVE:
747     case AMDGPU::SI_SPILL_S128_SAVE:
748     case AMDGPU::SI_SPILL_S64_SAVE:
749     case AMDGPU::SI_SPILL_S32_SAVE: {
750       spillSGPR(MI, Index, RS);
751       break;
752     }
753
754     // SGPR register restore
755     case AMDGPU::SI_SPILL_S512_RESTORE:
756     case AMDGPU::SI_SPILL_S256_RESTORE:
757     case AMDGPU::SI_SPILL_S128_RESTORE:
758     case AMDGPU::SI_SPILL_S64_RESTORE:
759     case AMDGPU::SI_SPILL_S32_RESTORE: {
760       restoreSGPR(MI, Index, RS);
761       break;
762     }
763
764     // VGPR register spill
765     case AMDGPU::SI_SPILL_V512_SAVE:
766     case AMDGPU::SI_SPILL_V256_SAVE:
767     case AMDGPU::SI_SPILL_V128_SAVE:
768     case AMDGPU::SI_SPILL_V96_SAVE:
769     case AMDGPU::SI_SPILL_V64_SAVE:
770     case AMDGPU::SI_SPILL_V32_SAVE:
771       buildSpillLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
772             TII->getNamedOperand(*MI, AMDGPU::OpName::vdata),
773             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
774             TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(),
775             FrameInfo.getObjectOffset(Index) +
776             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS);
777       MFI->addToSpilledVGPRs(getNumSubRegsForSpillOp(MI->getOpcode()));
778       MI->eraseFromParent();
779       break;
780     case AMDGPU::SI_SPILL_V32_RESTORE:
781     case AMDGPU::SI_SPILL_V64_RESTORE:
782     case AMDGPU::SI_SPILL_V96_RESTORE:
783     case AMDGPU::SI_SPILL_V128_RESTORE:
784     case AMDGPU::SI_SPILL_V256_RESTORE:
785     case AMDGPU::SI_SPILL_V512_RESTORE: {
786       buildSpillLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
787             TII->getNamedOperand(*MI, AMDGPU::OpName::vdata),
788             TII->getNamedOperand(*MI, AMDGPU::OpName::srsrc)->getReg(),
789             TII->getNamedOperand(*MI, AMDGPU::OpName::soffset)->getReg(),
790             FrameInfo.getObjectOffset(Index) +
791             TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm(), RS);
792       MI->eraseFromParent();
793       break;
794     }
795
796     default: {
797       if (TII->isMUBUF(*MI)) {
798         // Disable offen so we don't need a 0 vgpr base.
799         assert(static_cast<int>(FIOperandNum) ==
800                AMDGPU::getNamedOperandIdx(MI->getOpcode(),
801                                           AMDGPU::OpName::vaddr));
802
803         int64_t Offset = FrameInfo.getObjectOffset(Index);
804         int64_t OldImm
805           = TII->getNamedOperand(*MI, AMDGPU::OpName::offset)->getImm();
806         int64_t NewOffset = OldImm + Offset;
807
808         if (isUInt<12>(NewOffset) &&
809             buildMUBUFOffsetLoadStore(TII, FrameInfo, MI, Index, NewOffset)) {
810           MI->eraseFromParent();
811           break;
812         }
813       }
814
815       int64_t Offset = FrameInfo.getObjectOffset(Index);
816       FIOp.ChangeToImmediate(Offset);
817       if (!TII->isImmOperandLegal(*MI, FIOperandNum, FIOp)) {
818         unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
819         BuildMI(*MBB, MI, MI->getDebugLoc(),
820                 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
821                 .addImm(Offset);
822         FIOp.ChangeToRegister(TmpReg, false, false, true);
823       }
824     }
825   }
826 }
827
828 // FIXME: This is very slow. It might be worth creating a map from physreg to
829 // register class.
830 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
831   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
832
833   static const TargetRegisterClass *const BaseClasses[] = {
834     &AMDGPU::VGPR_32RegClass,
835     &AMDGPU::SReg_32RegClass,
836     &AMDGPU::VReg_64RegClass,
837     &AMDGPU::SReg_64RegClass,
838     &AMDGPU::VReg_96RegClass,
839     &AMDGPU::VReg_128RegClass,
840     &AMDGPU::SReg_128RegClass,
841     &AMDGPU::VReg_256RegClass,
842     &AMDGPU::SReg_256RegClass,
843     &AMDGPU::VReg_512RegClass,
844     &AMDGPU::SReg_512RegClass,
845     &AMDGPU::SCC_CLASSRegClass,
846   };
847
848   for (const TargetRegisterClass *BaseClass : BaseClasses) {
849     if (BaseClass->contains(Reg)) {
850       return BaseClass;
851     }
852   }
853   return nullptr;
854 }
855
856 // TODO: It might be helpful to have some target specific flags in
857 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
858 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
859   switch (RC->getSize()) {
860   case 0: return false;
861   case 1: return false;
862   case 4:
863     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
864   case 8:
865     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
866   case 12:
867     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
868   case 16:
869     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
870   case 32:
871     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
872   case 64:
873     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
874   default:
875     llvm_unreachable("Invalid register class size");
876   }
877 }
878
879 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
880                                          const TargetRegisterClass *SRC) const {
881   switch (SRC->getSize()) {
882   case 4:
883     return &AMDGPU::VGPR_32RegClass;
884   case 8:
885     return &AMDGPU::VReg_64RegClass;
886   case 12:
887     return &AMDGPU::VReg_96RegClass;
888   case 16:
889     return &AMDGPU::VReg_128RegClass;
890   case 32:
891     return &AMDGPU::VReg_256RegClass;
892   case 64:
893     return &AMDGPU::VReg_512RegClass;
894   default:
895     llvm_unreachable("Invalid register class size");
896   }
897 }
898
899 const TargetRegisterClass *SIRegisterInfo::getEquivalentSGPRClass(
900                                          const TargetRegisterClass *VRC) const {
901   switch (VRC->getSize()) {
902   case 4:
903     return &AMDGPU::SGPR_32RegClass;
904   case 8:
905     return &AMDGPU::SReg_64RegClass;
906   case 16:
907     return &AMDGPU::SReg_128RegClass;
908   case 32:
909     return &AMDGPU::SReg_256RegClass;
910   case 64:
911     return &AMDGPU::SReg_512RegClass;
912   default:
913     llvm_unreachable("Invalid register class size");
914   }
915 }
916
917 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
918                          const TargetRegisterClass *RC, unsigned SubIdx) const {
919   if (SubIdx == AMDGPU::NoSubRegister)
920     return RC;
921
922   // We can assume that each lane corresponds to one 32-bit register.
923   unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx));
924   if (isSGPRClass(RC)) {
925     switch (Count) {
926     case 1:
927       return &AMDGPU::SGPR_32RegClass;
928     case 2:
929       return &AMDGPU::SReg_64RegClass;
930     case 4:
931       return &AMDGPU::SReg_128RegClass;
932     case 8:
933       return &AMDGPU::SReg_256RegClass;
934     case 16: /* fall-through */
935     default:
936       llvm_unreachable("Invalid sub-register class size");
937     }
938   } else {
939     switch (Count) {
940     case 1:
941       return &AMDGPU::VGPR_32RegClass;
942     case 2:
943       return &AMDGPU::VReg_64RegClass;
944     case 3:
945       return &AMDGPU::VReg_96RegClass;
946     case 4:
947       return &AMDGPU::VReg_128RegClass;
948     case 8:
949       return &AMDGPU::VReg_256RegClass;
950     case 16: /* fall-through */
951     default:
952       llvm_unreachable("Invalid sub-register class size");
953     }
954   }
955 }
956
957 bool SIRegisterInfo::shouldRewriteCopySrc(
958   const TargetRegisterClass *DefRC,
959   unsigned DefSubReg,
960   const TargetRegisterClass *SrcRC,
961   unsigned SrcSubReg) const {
962   // We want to prefer the smallest register class possible, so we don't want to
963   // stop and rewrite on anything that looks like a subregister
964   // extract. Operations mostly don't care about the super register class, so we
965   // only want to stop on the most basic of copies between the same register
966   // class.
967   //
968   // e.g. if we have something like
969   // vreg0 = ...
970   // vreg1 = ...
971   // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2
972   // vreg3 = COPY vreg2, sub0
973   //
974   // We want to look through the COPY to find:
975   //  => vreg3 = COPY vreg0
976
977   // Plain copy.
978   return getCommonSubClass(DefRC, SrcRC) != nullptr;
979 }
980
981 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const {
982   return OpType == AMDGPU::OPERAND_REG_IMM32_INT ||
983          OpType == AMDGPU::OPERAND_REG_IMM32_FP;
984 }
985
986 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const {
987   if (opCanUseLiteralConstant(OpType))
988     return true;
989
990   return OpType == AMDGPU::OPERAND_REG_INLINE_C_INT ||
991          OpType == AMDGPU::OPERAND_REG_INLINE_C_FP;
992 }
993
994 // FIXME: Most of these are flexible with HSA and we don't need to reserve them
995 // as input registers if unused. Whether the dispatch ptr is necessary should be
996 // easy to detect from used intrinsics. Scratch setup is harder to know.
997 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF,
998                                            enum PreloadedValue Value) const {
999
1000   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
1001   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
1002   (void)ST;
1003   switch (Value) {
1004   case SIRegisterInfo::WORKGROUP_ID_X:
1005     assert(MFI->hasWorkGroupIDX());
1006     return MFI->WorkGroupIDXSystemSGPR;
1007   case SIRegisterInfo::WORKGROUP_ID_Y:
1008     assert(MFI->hasWorkGroupIDY());
1009     return MFI->WorkGroupIDYSystemSGPR;
1010   case SIRegisterInfo::WORKGROUP_ID_Z:
1011     assert(MFI->hasWorkGroupIDZ());
1012     return MFI->WorkGroupIDZSystemSGPR;
1013   case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:
1014     return MFI->PrivateSegmentWaveByteOffsetSystemSGPR;
1015   case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER:
1016     assert(ST.isAmdCodeObjectV2() &&
1017            "Non-CodeObjectV2 ABI currently uses relocations");
1018     assert(MFI->hasPrivateSegmentBuffer());
1019     return MFI->PrivateSegmentBufferUserSGPR;
1020   case SIRegisterInfo::KERNARG_SEGMENT_PTR:
1021     assert(MFI->hasKernargSegmentPtr());
1022     return MFI->KernargSegmentPtrUserSGPR;
1023   case SIRegisterInfo::DISPATCH_ID:
1024     assert(MFI->hasDispatchID());
1025     return MFI->DispatchIDUserSGPR;
1026   case SIRegisterInfo::FLAT_SCRATCH_INIT:
1027     assert(MFI->hasFlatScratchInit());
1028     return MFI->FlatScratchInitUserSGPR;
1029   case SIRegisterInfo::DISPATCH_PTR:
1030     assert(MFI->hasDispatchPtr());
1031     return MFI->DispatchPtrUserSGPR;
1032   case SIRegisterInfo::QUEUE_PTR:
1033     assert(MFI->hasQueuePtr());
1034     return MFI->QueuePtrUserSGPR;
1035   case SIRegisterInfo::WORKITEM_ID_X:
1036     assert(MFI->hasWorkItemIDX());
1037     return AMDGPU::VGPR0;
1038   case SIRegisterInfo::WORKITEM_ID_Y:
1039     assert(MFI->hasWorkItemIDY());
1040     return AMDGPU::VGPR1;
1041   case SIRegisterInfo::WORKITEM_ID_Z:
1042     assert(MFI->hasWorkItemIDZ());
1043     return AMDGPU::VGPR2;
1044   }
1045   llvm_unreachable("unexpected preloaded value type");
1046 }
1047
1048 /// \brief Returns a register that is not used at any point in the function.
1049 ///        If all registers are used, then this function will return
1050 //         AMDGPU::NoRegister.
1051 unsigned
1052 SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
1053                                    const TargetRegisterClass *RC,
1054                                    const MachineFunction &MF) const {
1055
1056   for (unsigned Reg : *RC)
1057     if (MRI.isAllocatable(Reg) && !MRI.isPhysRegUsed(Reg))
1058       return Reg;
1059   return AMDGPU::NoRegister;
1060 }
1061
1062 bool SIRegisterInfo::isVGPR(const MachineRegisterInfo &MRI,
1063                             unsigned Reg) const {
1064   const TargetRegisterClass *RC;
1065   if (TargetRegisterInfo::isVirtualRegister(Reg))
1066     RC = MRI.getRegClass(Reg);
1067   else
1068     RC = getPhysRegClass(Reg);
1069
1070   return hasVGPRs(RC);
1071 }
1072
1073 unsigned SIRegisterInfo::getTotalNumSGPRs(const SISubtarget &ST) const {
1074   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
1075     return 800;
1076   return 512;
1077 }
1078
1079 unsigned SIRegisterInfo::getNumAddressableSGPRs(const SISubtarget &ST) const {
1080   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
1081     return 102;
1082   return 104;
1083 }
1084
1085 unsigned SIRegisterInfo::getNumReservedSGPRs(const SISubtarget &ST) const {
1086   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS)
1087     return 6; // VCC, FLAT_SCRATCH, XNACK.
1088   return 2; // VCC.
1089 }
1090
1091 unsigned SIRegisterInfo::getMinNumSGPRs(const SISubtarget &ST,
1092                                         unsigned WavesPerEU) const {
1093   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
1094     switch (WavesPerEU) {
1095       case 0:  return 0;
1096       case 10: return 0;
1097       case 9:  return 0;
1098       case 8:  return 81;
1099       default: return 97;
1100     }
1101   } else {
1102     switch (WavesPerEU) {
1103       case 0:  return 0;
1104       case 10: return 0;
1105       case 9:  return 49;
1106       case 8:  return 57;
1107       case 7:  return 65;
1108       case 6:  return 73;
1109       case 5:  return 81;
1110       default: return 97;
1111     }
1112   }
1113 }
1114
1115 unsigned SIRegisterInfo::getMaxNumSGPRs(const SISubtarget &ST,
1116                                         unsigned WavesPerEU) const {
1117   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
1118     switch (WavesPerEU) {
1119       case 0:  return 80;
1120       case 10: return 80;
1121       case 9:  return 80;
1122       case 8:  return 96;
1123       default: return getNumAddressableSGPRs(ST);
1124     }
1125   } else {
1126     switch (WavesPerEU) {
1127       case 0:  return 48;
1128       case 10: return 48;
1129       case 9:  return 56;
1130       case 8:  return 64;
1131       case 7:  return 72;
1132       case 6:  return 80;
1133       case 5:  return 96;
1134       default: return getNumAddressableSGPRs(ST);
1135     }
1136   }
1137 }
1138
1139 unsigned SIRegisterInfo::getMaxNumSGPRs(const MachineFunction &MF) const {
1140   const Function &F = *MF.getFunction();
1141
1142   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
1143   const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
1144
1145   // Compute maximum number of SGPRs function can use using default/requested
1146   // minimum number of waves per execution unit.
1147   std::pair<unsigned, unsigned> WavesPerEU = MFI.getWavesPerEU();
1148   unsigned MaxNumSGPRs = getMaxNumSGPRs(ST, WavesPerEU.first);
1149
1150   // Check if maximum number of SGPRs was explicitly requested using
1151   // "amdgpu-num-sgpr" attribute.
1152   if (F.hasFnAttribute("amdgpu-num-sgpr")) {
1153     unsigned Requested = AMDGPU::getIntegerAttribute(
1154       F, "amdgpu-num-sgpr", MaxNumSGPRs);
1155
1156     // Make sure requested value does not violate subtarget's specifications.
1157     if (Requested && (Requested <= getNumReservedSGPRs(ST)))
1158       Requested = 0;
1159
1160     // If more SGPRs are required to support the input user/system SGPRs,
1161     // increase to accomodate them.
1162     //
1163     // FIXME: This really ends up using the requested number of SGPRs + number
1164     // of reserved special registers in total. Theoretically you could re-use
1165     // the last input registers for these special registers, but this would
1166     // require a lot of complexity to deal with the weird aliasing.
1167     unsigned NumInputSGPRs = MFI.getNumPreloadedSGPRs();
1168     if (Requested && Requested < NumInputSGPRs)
1169       Requested = NumInputSGPRs;
1170
1171     // Make sure requested value is compatible with values implied by
1172     // default/requested minimum/maximum number of waves per execution unit.
1173     if (Requested && Requested > getMaxNumSGPRs(ST, WavesPerEU.first))
1174       Requested = 0;
1175     if (WavesPerEU.second &&
1176         Requested && Requested < getMinNumSGPRs(ST, WavesPerEU.second))
1177       Requested = 0;
1178
1179     if (Requested)
1180       MaxNumSGPRs = Requested;
1181   }
1182
1183   if (ST.hasSGPRInitBug())
1184     MaxNumSGPRs = SISubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG;
1185
1186   return MaxNumSGPRs - getNumReservedSGPRs(ST);
1187 }
1188
1189 unsigned SIRegisterInfo::getNumDebuggerReservedVGPRs(
1190   const SISubtarget &ST) const {
1191   if (ST.debuggerReserveRegs())
1192     return 4;
1193   return 0;
1194 }
1195
1196 unsigned SIRegisterInfo::getMinNumVGPRs(unsigned WavesPerEU) const {
1197   switch (WavesPerEU) {
1198     case 0:  return 0;
1199     case 10: return 0;
1200     case 9:  return 25;
1201     case 8:  return 29;
1202     case 7:  return 33;
1203     case 6:  return 37;
1204     case 5:  return 41;
1205     case 4:  return 49;
1206     case 3:  return 65;
1207     case 2:  return 85;
1208     default: return 129;
1209   }
1210 }
1211
1212 unsigned SIRegisterInfo::getMaxNumVGPRs(unsigned WavesPerEU) const {
1213   switch (WavesPerEU) {
1214     case 0:  return 24;
1215     case 10: return 24;
1216     case 9:  return 28;
1217     case 8:  return 32;
1218     case 7:  return 36;
1219     case 6:  return 40;
1220     case 5:  return 48;
1221     case 4:  return 64;
1222     case 3:  return 84;
1223     case 2:  return 128;
1224     default: return getTotalNumVGPRs();
1225   }
1226 }
1227
1228 unsigned SIRegisterInfo::getMaxNumVGPRs(const MachineFunction &MF) const {
1229   const Function &F = *MF.getFunction();
1230
1231   const SISubtarget &ST = MF.getSubtarget<SISubtarget>();
1232   const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
1233
1234   // Compute maximum number of VGPRs function can use using default/requested
1235   // minimum number of waves per execution unit.
1236   std::pair<unsigned, unsigned> WavesPerEU = MFI.getWavesPerEU();
1237   unsigned MaxNumVGPRs = getMaxNumVGPRs(WavesPerEU.first);
1238
1239   // Check if maximum number of VGPRs was explicitly requested using
1240   // "amdgpu-num-vgpr" attribute.
1241   if (F.hasFnAttribute("amdgpu-num-vgpr")) {
1242     unsigned Requested = AMDGPU::getIntegerAttribute(
1243       F, "amdgpu-num-vgpr", MaxNumVGPRs);
1244
1245     // Make sure requested value does not violate subtarget's specifications.
1246     if (Requested && Requested <= getNumDebuggerReservedVGPRs(ST))
1247       Requested = 0;
1248
1249     // Make sure requested value is compatible with values implied by
1250     // default/requested minimum/maximum number of waves per execution unit.
1251     if (Requested && Requested > getMaxNumVGPRs(WavesPerEU.first))
1252       Requested = 0;
1253     if (WavesPerEU.second &&
1254         Requested && Requested < getMinNumVGPRs(WavesPerEU.second))
1255       Requested = 0;
1256
1257     if (Requested)
1258       MaxNumVGPRs = Requested;
1259   }
1260
1261   return MaxNumVGPRs - getNumDebuggerReservedVGPRs(ST);
1262 }
1263
1264 ArrayRef<int16_t> SIRegisterInfo::getRegSplitParts(const TargetRegisterClass *RC,
1265                                                    unsigned EltSize) const {
1266   if (EltSize == 4) {
1267     static const int16_t Sub0_15[] = {
1268       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1269       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1270       AMDGPU::sub8, AMDGPU::sub9, AMDGPU::sub10, AMDGPU::sub11,
1271       AMDGPU::sub12, AMDGPU::sub13, AMDGPU::sub14, AMDGPU::sub15,
1272     };
1273
1274     static const int16_t Sub0_7[] = {
1275       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1276       AMDGPU::sub4, AMDGPU::sub5, AMDGPU::sub6, AMDGPU::sub7,
1277     };
1278
1279     static const int16_t Sub0_3[] = {
1280       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2, AMDGPU::sub3,
1281     };
1282
1283     static const int16_t Sub0_2[] = {
1284       AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub2,
1285     };
1286
1287     static const int16_t Sub0_1[] = {
1288       AMDGPU::sub0, AMDGPU::sub1,
1289     };
1290
1291     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1292     case 32:
1293       return {};
1294     case 64:
1295       return makeArrayRef(Sub0_1);
1296     case 96:
1297       return makeArrayRef(Sub0_2);
1298     case 128:
1299       return makeArrayRef(Sub0_3);
1300     case 256:
1301       return makeArrayRef(Sub0_7);
1302     case 512:
1303       return makeArrayRef(Sub0_15);
1304     default:
1305       llvm_unreachable("unhandled register size");
1306     }
1307   }
1308
1309   if (EltSize == 8) {
1310     static const int16_t Sub0_15_64[] = {
1311       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1312       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7,
1313       AMDGPU::sub8_sub9, AMDGPU::sub10_sub11,
1314       AMDGPU::sub12_sub13, AMDGPU::sub14_sub15
1315     };
1316
1317     static const int16_t Sub0_7_64[] = {
1318       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3,
1319       AMDGPU::sub4_sub5, AMDGPU::sub6_sub7
1320     };
1321
1322
1323     static const int16_t Sub0_3_64[] = {
1324       AMDGPU::sub0_sub1, AMDGPU::sub2_sub3
1325     };
1326
1327     switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1328     case 64:
1329       return {};
1330     case 128:
1331       return makeArrayRef(Sub0_3_64);
1332     case 256:
1333       return makeArrayRef(Sub0_7_64);
1334     case 512:
1335       return makeArrayRef(Sub0_15_64);
1336     default:
1337       llvm_unreachable("unhandled register size");
1338     }
1339   }
1340
1341   assert(EltSize == 16 && "unhandled register spill split size");
1342
1343   static const int16_t Sub0_15_128[] = {
1344     AMDGPU::sub0_sub1_sub2_sub3,
1345     AMDGPU::sub4_sub5_sub6_sub7,
1346     AMDGPU::sub8_sub9_sub10_sub11,
1347     AMDGPU::sub12_sub13_sub14_sub15
1348   };
1349
1350   static const int16_t Sub0_7_128[] = {
1351     AMDGPU::sub0_sub1_sub2_sub3,
1352     AMDGPU::sub4_sub5_sub6_sub7
1353   };
1354
1355   switch (AMDGPU::getRegBitWidth(*RC->MC)) {
1356   case 128:
1357     return {};
1358   case 256:
1359     return makeArrayRef(Sub0_7_128);
1360   case 512:
1361     return makeArrayRef(Sub0_15_128);
1362   default:
1363     llvm_unreachable("unhandled register size");
1364   }
1365 }