Merging r260427:
[oota-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 "llvm/CodeGen/MachineFrameInfo.h"
19 #include "llvm/CodeGen/MachineInstrBuilder.h"
20 #include "llvm/CodeGen/RegisterScavenging.h"
21 #include "llvm/IR/Function.h"
22 #include "llvm/IR/LLVMContext.h"
23
24 using namespace llvm;
25
26 SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo() {
27   unsigned NumRegPressureSets = getNumRegPressureSets();
28
29   SGPR32SetID = NumRegPressureSets;
30   VGPR32SetID = NumRegPressureSets;
31   for (unsigned i = 0; i < NumRegPressureSets; ++i) {
32     if (strncmp("SGPR_32", getRegPressureSetName(i), 7) == 0)
33       SGPR32SetID = i;
34     else if (strncmp("VGPR_32", getRegPressureSetName(i), 7) == 0)
35       VGPR32SetID = i;
36   }
37   assert(SGPR32SetID < NumRegPressureSets &&
38          VGPR32SetID < NumRegPressureSets);
39 }
40
41 void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const {
42   MCRegAliasIterator R(Reg, this, true);
43
44   for (; R.isValid(); ++R)
45     Reserved.set(*R);
46 }
47
48 unsigned SIRegisterInfo::reservedPrivateSegmentBufferReg(
49   const MachineFunction &MF) const {
50   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
51   if (ST.hasSGPRInitBug()) {
52     // Leave space for flat_scr, xnack_mask, vcc, and alignment
53     unsigned BaseIdx = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 8 - 4;
54     unsigned BaseReg(AMDGPU::SGPR_32RegClass.getRegister(BaseIdx));
55     return getMatchingSuperReg(BaseReg, AMDGPU::sub0, &AMDGPU::SReg_128RegClass);
56   }
57
58   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
59     // 96/97 need to be reserved for flat_scr, 98/99 for xnack_mask, and
60     // 100/101 for vcc. This is the next sgpr128 down.
61     return AMDGPU::SGPR92_SGPR93_SGPR94_SGPR95;
62   }
63
64   return AMDGPU::SGPR96_SGPR97_SGPR98_SGPR99;
65 }
66
67 unsigned SIRegisterInfo::reservedPrivateSegmentWaveByteOffsetReg(
68   const MachineFunction &MF) const {
69   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
70   if (ST.hasSGPRInitBug()) {
71     unsigned Idx = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 6 - 1;
72     return AMDGPU::SGPR_32RegClass.getRegister(Idx);
73   }
74
75   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
76     // Next register before reservations for flat_scr, xnack_mask, vcc,
77     // and scratch resource.
78     return AMDGPU::SGPR91;
79   }
80
81   return AMDGPU::SGPR95;
82 }
83
84 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
85   BitVector Reserved(getNumRegs());
86   Reserved.set(AMDGPU::INDIRECT_BASE_ADDR);
87
88   // EXEC_LO and EXEC_HI could be allocated and used as regular register, but
89   // this seems likely to result in bugs, so I'm marking them as reserved.
90   reserveRegisterTuples(Reserved, AMDGPU::EXEC);
91   reserveRegisterTuples(Reserved, AMDGPU::FLAT_SCR);
92
93   // Reserve the last 2 registers so we will always have at least 2 more that
94   // will physically contain VCC.
95   reserveRegisterTuples(Reserved, AMDGPU::SGPR102_SGPR103);
96
97   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
98
99   if (ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
100     // SI/CI have 104 SGPRs. VI has 102. We need to shift down the reservation
101     // for VCC/XNACK_MASK/FLAT_SCR.
102     //
103     // TODO The SGPRs that alias to XNACK_MASK could be used as general purpose
104     // SGPRs when the XNACK feature is not used. This is currently not done
105     // because the code that counts SGPRs cannot account for such holes.
106     reserveRegisterTuples(Reserved, AMDGPU::SGPR96_SGPR97);
107     reserveRegisterTuples(Reserved, AMDGPU::SGPR98_SGPR99);
108     reserveRegisterTuples(Reserved, AMDGPU::SGPR100_SGPR101);
109   }
110
111   // Tonga and Iceland can only allocate a fixed number of SGPRs due
112   // to a hw bug.
113   if (ST.hasSGPRInitBug()) {
114     unsigned NumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
115     // Reserve some SGPRs for FLAT_SCRATCH, XNACK_MASK, and VCC (6 SGPRs).
116     unsigned Limit = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 6;
117
118     for (unsigned i = Limit; i < NumSGPRs; ++i) {
119       unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
120       reserveRegisterTuples(Reserved, Reg);
121     }
122   }
123
124   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
125
126   unsigned ScratchWaveOffsetReg = MFI->getScratchWaveOffsetReg();
127   if (ScratchWaveOffsetReg != AMDGPU::NoRegister) {
128     // Reserve 1 SGPR for scratch wave offset in case we need to spill.
129     reserveRegisterTuples(Reserved, ScratchWaveOffsetReg);
130   }
131
132   unsigned ScratchRSrcReg = MFI->getScratchRSrcReg();
133   if (ScratchRSrcReg != AMDGPU::NoRegister) {
134     // Reserve 4 SGPRs for the scratch buffer resource descriptor in case we need
135     // to spill.
136     // TODO: May need to reserve a VGPR if doing LDS spilling.
137     reserveRegisterTuples(Reserved, ScratchRSrcReg);
138     assert(!isSubRegister(ScratchRSrcReg, ScratchWaveOffsetReg));
139   }
140
141   return Reserved;
142 }
143
144 unsigned SIRegisterInfo::getRegPressureSetLimit(const MachineFunction &MF,
145                                                 unsigned Idx) const {
146   const AMDGPUSubtarget &STI = MF.getSubtarget<AMDGPUSubtarget>();
147   // FIXME: We should adjust the max number of waves based on LDS size.
148   unsigned SGPRLimit = getNumSGPRsAllowed(STI.getGeneration(),
149                                           STI.getMaxWavesPerCU());
150   unsigned VGPRLimit = getNumVGPRsAllowed(STI.getMaxWavesPerCU());
151
152   unsigned VSLimit = SGPRLimit + VGPRLimit;
153
154   for (regclass_iterator I = regclass_begin(), E = regclass_end();
155        I != E; ++I) {
156     const TargetRegisterClass *RC = *I;
157
158     unsigned NumSubRegs = std::max((int)RC->getSize() / 4, 1);
159     unsigned Limit;
160
161     if (isPseudoRegClass(RC)) {
162       // FIXME: This is a hack. We should never be considering the pressure of
163       // these since no virtual register should ever have this class.
164       Limit = VSLimit;
165     } else if (isSGPRClass(RC)) {
166       Limit = SGPRLimit / NumSubRegs;
167     } else {
168       Limit = VGPRLimit / NumSubRegs;
169     }
170
171     const int *Sets = getRegClassPressureSets(RC);
172     assert(Sets);
173     for (unsigned i = 0; Sets[i] != -1; ++i) {
174       if (Sets[i] == (int)Idx)
175         return Limit;
176     }
177   }
178   return 256;
179 }
180
181 bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {
182   return Fn.getFrameInfo()->hasStackObjects();
183 }
184
185 static unsigned getNumSubRegsForSpillOp(unsigned Op) {
186
187   switch (Op) {
188   case AMDGPU::SI_SPILL_S512_SAVE:
189   case AMDGPU::SI_SPILL_S512_RESTORE:
190   case AMDGPU::SI_SPILL_V512_SAVE:
191   case AMDGPU::SI_SPILL_V512_RESTORE:
192     return 16;
193   case AMDGPU::SI_SPILL_S256_SAVE:
194   case AMDGPU::SI_SPILL_S256_RESTORE:
195   case AMDGPU::SI_SPILL_V256_SAVE:
196   case AMDGPU::SI_SPILL_V256_RESTORE:
197     return 8;
198   case AMDGPU::SI_SPILL_S128_SAVE:
199   case AMDGPU::SI_SPILL_S128_RESTORE:
200   case AMDGPU::SI_SPILL_V128_SAVE:
201   case AMDGPU::SI_SPILL_V128_RESTORE:
202     return 4;
203   case AMDGPU::SI_SPILL_V96_SAVE:
204   case AMDGPU::SI_SPILL_V96_RESTORE:
205     return 3;
206   case AMDGPU::SI_SPILL_S64_SAVE:
207   case AMDGPU::SI_SPILL_S64_RESTORE:
208   case AMDGPU::SI_SPILL_V64_SAVE:
209   case AMDGPU::SI_SPILL_V64_RESTORE:
210     return 2;
211   case AMDGPU::SI_SPILL_S32_SAVE:
212   case AMDGPU::SI_SPILL_S32_RESTORE:
213   case AMDGPU::SI_SPILL_V32_SAVE:
214   case AMDGPU::SI_SPILL_V32_RESTORE:
215     return 1;
216   default: llvm_unreachable("Invalid spill opcode");
217   }
218 }
219
220 void SIRegisterInfo::buildScratchLoadStore(MachineBasicBlock::iterator MI,
221                                            unsigned LoadStoreOp,
222                                            unsigned Value,
223                                            unsigned ScratchRsrcReg,
224                                            unsigned ScratchOffset,
225                                            int64_t Offset,
226                                            RegScavenger *RS) const {
227
228   MachineBasicBlock *MBB = MI->getParent();
229   const MachineFunction *MF = MI->getParent()->getParent();
230   const SIInstrInfo *TII =
231       static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo());
232   LLVMContext &Ctx = MF->getFunction()->getContext();
233   DebugLoc DL = MI->getDebugLoc();
234   bool IsLoad = TII->get(LoadStoreOp).mayLoad();
235
236   bool RanOutOfSGPRs = false;
237   bool Scavenged = false;
238   unsigned SOffset = ScratchOffset;
239
240   unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
241   unsigned Size = NumSubRegs * 4;
242
243   if (!isUInt<12>(Offset + Size)) {
244     SOffset = RS->scavengeRegister(&AMDGPU::SGPR_32RegClass, MI, 0);
245     if (SOffset == AMDGPU::NoRegister) {
246       RanOutOfSGPRs = true;
247       SOffset = AMDGPU::SGPR0;
248     } else {
249       Scavenged = true;
250     }
251     BuildMI(*MBB, MI, DL, TII->get(AMDGPU::S_ADD_U32), SOffset)
252             .addReg(ScratchOffset)
253             .addImm(Offset);
254     Offset = 0;
255   }
256
257   if (RanOutOfSGPRs)
258     Ctx.emitError("Ran out of SGPRs for spilling VGPRS");
259
260   for (unsigned i = 0, e = NumSubRegs; i != e; ++i, Offset += 4) {
261     unsigned SubReg = NumSubRegs > 1 ?
262         getPhysRegSubReg(Value, &AMDGPU::VGPR_32RegClass, i) :
263         Value;
264
265     unsigned SOffsetRegState = 0;
266     if (i + 1 == e && Scavenged)
267       SOffsetRegState |= RegState::Kill;
268
269     BuildMI(*MBB, MI, DL, TII->get(LoadStoreOp))
270       .addReg(SubReg, getDefRegState(IsLoad))
271       .addReg(ScratchRsrcReg)
272       .addReg(SOffset, SOffsetRegState)
273       .addImm(Offset)
274       .addImm(0) // glc
275       .addImm(0) // slc
276       .addImm(0) // tfe
277       .addReg(Value, RegState::Implicit | getDefRegState(IsLoad))
278       .setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
279   }
280 }
281
282 void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
283                                         int SPAdj, unsigned FIOperandNum,
284                                         RegScavenger *RS) const {
285   MachineFunction *MF = MI->getParent()->getParent();
286   MachineBasicBlock *MBB = MI->getParent();
287   SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>();
288   MachineFrameInfo *FrameInfo = MF->getFrameInfo();
289   const SIInstrInfo *TII =
290       static_cast<const SIInstrInfo *>(MF->getSubtarget().getInstrInfo());
291   DebugLoc DL = MI->getDebugLoc();
292
293   MachineOperand &FIOp = MI->getOperand(FIOperandNum);
294   int Index = MI->getOperand(FIOperandNum).getIndex();
295
296   switch (MI->getOpcode()) {
297     // SGPR register spill
298     case AMDGPU::SI_SPILL_S512_SAVE:
299     case AMDGPU::SI_SPILL_S256_SAVE:
300     case AMDGPU::SI_SPILL_S128_SAVE:
301     case AMDGPU::SI_SPILL_S64_SAVE:
302     case AMDGPU::SI_SPILL_S32_SAVE: {
303       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
304
305       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
306         unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(),
307                                            &AMDGPU::SGPR_32RegClass, i);
308         struct SIMachineFunctionInfo::SpilledReg Spill =
309             MFI->getSpilledReg(MF, Index, i);
310
311         BuildMI(*MBB, MI, DL,
312                 TII->getMCOpcodeFromPseudo(AMDGPU::V_WRITELANE_B32),
313                 Spill.VGPR)
314                 .addReg(SubReg)
315                 .addImm(Spill.Lane);
316
317         // FIXME: Since this spills to another register instead of an actual
318         // frame index, we should delete the frame index when all references to
319         // it are fixed.
320       }
321       MI->eraseFromParent();
322       break;
323     }
324
325     // SGPR register restore
326     case AMDGPU::SI_SPILL_S512_RESTORE:
327     case AMDGPU::SI_SPILL_S256_RESTORE:
328     case AMDGPU::SI_SPILL_S128_RESTORE:
329     case AMDGPU::SI_SPILL_S64_RESTORE:
330     case AMDGPU::SI_SPILL_S32_RESTORE: {
331       unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode());
332
333       for (unsigned i = 0, e = NumSubRegs; i < e; ++i) {
334         unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(),
335                                            &AMDGPU::SGPR_32RegClass, i);
336         struct SIMachineFunctionInfo::SpilledReg Spill =
337             MFI->getSpilledReg(MF, Index, i);
338
339         BuildMI(*MBB, MI, DL,
340                 TII->getMCOpcodeFromPseudo(AMDGPU::V_READLANE_B32),
341                 SubReg)
342                 .addReg(Spill.VGPR)
343                 .addImm(Spill.Lane)
344                 .addReg(MI->getOperand(0).getReg(), RegState::ImplicitDefine);
345       }
346
347       // TODO: only do this when it is needed
348       switch (MF->getSubtarget<AMDGPUSubtarget>().getGeneration()) {
349       case AMDGPUSubtarget::SOUTHERN_ISLANDS:
350         // "VALU writes SGPR" -> "SMRD reads that SGPR" needs 4 wait states
351         // ("S_NOP 3") on SI
352         TII->insertWaitStates(MI, 4);
353         break;
354       case AMDGPUSubtarget::SEA_ISLANDS:
355         break;
356       default: // VOLCANIC_ISLANDS and later
357         // "VALU writes SGPR -> VMEM reads that SGPR" needs 5 wait states
358         // ("S_NOP 4") on VI and later. This also applies to VALUs which write
359         // VCC, but we're unlikely to see VMEM use VCC.
360         TII->insertWaitStates(MI, 5);
361       }
362
363       MI->eraseFromParent();
364       break;
365     }
366
367     // VGPR register spill
368     case AMDGPU::SI_SPILL_V512_SAVE:
369     case AMDGPU::SI_SPILL_V256_SAVE:
370     case AMDGPU::SI_SPILL_V128_SAVE:
371     case AMDGPU::SI_SPILL_V96_SAVE:
372     case AMDGPU::SI_SPILL_V64_SAVE:
373     case AMDGPU::SI_SPILL_V32_SAVE:
374       buildScratchLoadStore(MI, AMDGPU::BUFFER_STORE_DWORD_OFFSET,
375             TII->getNamedOperand(*MI, AMDGPU::OpName::src)->getReg(),
376             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
377             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
378              FrameInfo->getObjectOffset(Index), RS);
379       MI->eraseFromParent();
380       break;
381     case AMDGPU::SI_SPILL_V32_RESTORE:
382     case AMDGPU::SI_SPILL_V64_RESTORE:
383     case AMDGPU::SI_SPILL_V96_RESTORE:
384     case AMDGPU::SI_SPILL_V128_RESTORE:
385     case AMDGPU::SI_SPILL_V256_RESTORE:
386     case AMDGPU::SI_SPILL_V512_RESTORE: {
387       buildScratchLoadStore(MI, AMDGPU::BUFFER_LOAD_DWORD_OFFSET,
388             TII->getNamedOperand(*MI, AMDGPU::OpName::dst)->getReg(),
389             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_rsrc)->getReg(),
390             TII->getNamedOperand(*MI, AMDGPU::OpName::scratch_offset)->getReg(),
391             FrameInfo->getObjectOffset(Index), RS);
392       MI->eraseFromParent();
393       break;
394     }
395
396     default: {
397       int64_t Offset = FrameInfo->getObjectOffset(Index);
398       FIOp.ChangeToImmediate(Offset);
399       if (!TII->isImmOperandLegal(MI, FIOperandNum, FIOp)) {
400         unsigned TmpReg = RS->scavengeRegister(&AMDGPU::VGPR_32RegClass, MI, SPAdj);
401         BuildMI(*MBB, MI, MI->getDebugLoc(),
402                 TII->get(AMDGPU::V_MOV_B32_e32), TmpReg)
403                 .addImm(Offset);
404         FIOp.ChangeToRegister(TmpReg, false, false, true);
405       }
406     }
407   }
408 }
409
410 unsigned SIRegisterInfo::getHWRegIndex(unsigned Reg) const {
411   return getEncodingValue(Reg) & 0xff;
412 }
413
414 // FIXME: This is very slow. It might be worth creating a map from physreg to
415 // register class.
416 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
417   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
418
419   static const TargetRegisterClass *const BaseClasses[] = {
420     &AMDGPU::VGPR_32RegClass,
421     &AMDGPU::SReg_32RegClass,
422     &AMDGPU::VReg_64RegClass,
423     &AMDGPU::SReg_64RegClass,
424     &AMDGPU::VReg_96RegClass,
425     &AMDGPU::VReg_128RegClass,
426     &AMDGPU::SReg_128RegClass,
427     &AMDGPU::VReg_256RegClass,
428     &AMDGPU::SReg_256RegClass,
429     &AMDGPU::VReg_512RegClass,
430     &AMDGPU::SReg_512RegClass
431   };
432
433   for (const TargetRegisterClass *BaseClass : BaseClasses) {
434     if (BaseClass->contains(Reg)) {
435       return BaseClass;
436     }
437   }
438   return nullptr;
439 }
440
441 // TODO: It might be helpful to have some target specific flags in
442 // TargetRegisterClass to mark which classes are VGPRs to make this trivial.
443 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
444   switch (RC->getSize()) {
445   case 4:
446     return getCommonSubClass(&AMDGPU::VGPR_32RegClass, RC) != nullptr;
447   case 8:
448     return getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) != nullptr;
449   case 12:
450     return getCommonSubClass(&AMDGPU::VReg_96RegClass, RC) != nullptr;
451   case 16:
452     return getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) != nullptr;
453   case 32:
454     return getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) != nullptr;
455   case 64:
456     return getCommonSubClass(&AMDGPU::VReg_512RegClass, RC) != nullptr;
457   default:
458     llvm_unreachable("Invalid register class size");
459   }
460 }
461
462 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
463                                          const TargetRegisterClass *SRC) const {
464   switch (SRC->getSize()) {
465   case 4:
466     return &AMDGPU::VGPR_32RegClass;
467   case 8:
468     return &AMDGPU::VReg_64RegClass;
469   case 12:
470     return &AMDGPU::VReg_96RegClass;
471   case 16:
472     return &AMDGPU::VReg_128RegClass;
473   case 32:
474     return &AMDGPU::VReg_256RegClass;
475   case 64:
476     return &AMDGPU::VReg_512RegClass;
477   default:
478     llvm_unreachable("Invalid register class size");
479   }
480 }
481
482 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
483                          const TargetRegisterClass *RC, unsigned SubIdx) const {
484   if (SubIdx == AMDGPU::NoSubRegister)
485     return RC;
486
487   // We can assume that each lane corresponds to one 32-bit register.
488   unsigned Count = countPopulation(getSubRegIndexLaneMask(SubIdx));
489   if (isSGPRClass(RC)) {
490     switch (Count) {
491     case 1:
492       return &AMDGPU::SGPR_32RegClass;
493     case 2:
494       return &AMDGPU::SReg_64RegClass;
495     case 4:
496       return &AMDGPU::SReg_128RegClass;
497     case 8:
498       return &AMDGPU::SReg_256RegClass;
499     case 16: /* fall-through */
500     default:
501       llvm_unreachable("Invalid sub-register class size");
502     }
503   } else {
504     switch (Count) {
505     case 1:
506       return &AMDGPU::VGPR_32RegClass;
507     case 2:
508       return &AMDGPU::VReg_64RegClass;
509     case 3:
510       return &AMDGPU::VReg_96RegClass;
511     case 4:
512       return &AMDGPU::VReg_128RegClass;
513     case 8:
514       return &AMDGPU::VReg_256RegClass;
515     case 16: /* fall-through */
516     default:
517       llvm_unreachable("Invalid sub-register class size");
518     }
519   }
520 }
521
522 bool SIRegisterInfo::shouldRewriteCopySrc(
523   const TargetRegisterClass *DefRC,
524   unsigned DefSubReg,
525   const TargetRegisterClass *SrcRC,
526   unsigned SrcSubReg) const {
527   // We want to prefer the smallest register class possible, so we don't want to
528   // stop and rewrite on anything that looks like a subregister
529   // extract. Operations mostly don't care about the super register class, so we
530   // only want to stop on the most basic of copies between the smae register
531   // class.
532   //
533   // e.g. if we have something like
534   // vreg0 = ...
535   // vreg1 = ...
536   // vreg2 = REG_SEQUENCE vreg0, sub0, vreg1, sub1, vreg2, sub2
537   // vreg3 = COPY vreg2, sub0
538   //
539   // We want to look through the COPY to find:
540   //  => vreg3 = COPY vreg0
541
542   // Plain copy.
543   return getCommonSubClass(DefRC, SrcRC) != nullptr;
544 }
545
546 unsigned SIRegisterInfo::getPhysRegSubReg(unsigned Reg,
547                                           const TargetRegisterClass *SubRC,
548                                           unsigned Channel) const {
549
550   switch (Reg) {
551     case AMDGPU::VCC:
552       switch(Channel) {
553         case 0: return AMDGPU::VCC_LO;
554         case 1: return AMDGPU::VCC_HI;
555         default: llvm_unreachable("Invalid SubIdx for VCC");
556       }
557
558   case AMDGPU::FLAT_SCR:
559     switch (Channel) {
560     case 0:
561       return AMDGPU::FLAT_SCR_LO;
562     case 1:
563       return AMDGPU::FLAT_SCR_HI;
564     default:
565       llvm_unreachable("Invalid SubIdx for FLAT_SCR");
566     }
567     break;
568
569   case AMDGPU::EXEC:
570     switch (Channel) {
571     case 0:
572       return AMDGPU::EXEC_LO;
573     case 1:
574       return AMDGPU::EXEC_HI;
575     default:
576       llvm_unreachable("Invalid SubIdx for EXEC");
577     }
578     break;
579   }
580
581   const TargetRegisterClass *RC = getPhysRegClass(Reg);
582   // 32-bit registers don't have sub-registers, so we can just return the
583   // Reg.  We need to have this check here, because the calculation below
584   // using getHWRegIndex() will fail with special 32-bit registers like
585   // VCC_LO, VCC_HI, EXEC_LO, EXEC_HI and M0.
586   if (RC->getSize() == 4) {
587     assert(Channel == 0);
588     return Reg;
589   }
590
591   unsigned Index = getHWRegIndex(Reg);
592   return SubRC->getRegister(Index + Channel);
593 }
594
595 bool SIRegisterInfo::opCanUseLiteralConstant(unsigned OpType) const {
596   return OpType == AMDGPU::OPERAND_REG_IMM32;
597 }
598
599 bool SIRegisterInfo::opCanUseInlineConstant(unsigned OpType) const {
600   if (opCanUseLiteralConstant(OpType))
601     return true;
602
603   return OpType == AMDGPU::OPERAND_REG_INLINE_C;
604 }
605
606 // FIXME: Most of these are flexible with HSA and we don't need to reserve them
607 // as input registers if unused. Whether the dispatch ptr is necessary should be
608 // easy to detect from used intrinsics. Scratch setup is harder to know.
609 unsigned SIRegisterInfo::getPreloadedValue(const MachineFunction &MF,
610                                            enum PreloadedValue Value) const {
611
612   const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>();
613   const AMDGPUSubtarget &ST = MF.getSubtarget<AMDGPUSubtarget>();
614   (void)ST;
615   switch (Value) {
616   case SIRegisterInfo::WORKGROUP_ID_X:
617     assert(MFI->hasWorkGroupIDX());
618     return MFI->WorkGroupIDXSystemSGPR;
619   case SIRegisterInfo::WORKGROUP_ID_Y:
620     assert(MFI->hasWorkGroupIDY());
621     return MFI->WorkGroupIDYSystemSGPR;
622   case SIRegisterInfo::WORKGROUP_ID_Z:
623     assert(MFI->hasWorkGroupIDZ());
624     return MFI->WorkGroupIDZSystemSGPR;
625   case SIRegisterInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:
626     return MFI->PrivateSegmentWaveByteOffsetSystemSGPR;
627   case SIRegisterInfo::PRIVATE_SEGMENT_BUFFER:
628     assert(ST.isAmdHsaOS() && "Non-HSA ABI currently uses relocations");
629     assert(MFI->hasPrivateSegmentBuffer());
630     return MFI->PrivateSegmentBufferUserSGPR;
631   case SIRegisterInfo::KERNARG_SEGMENT_PTR:
632     assert(MFI->hasKernargSegmentPtr());
633     return MFI->KernargSegmentPtrUserSGPR;
634   case SIRegisterInfo::DISPATCH_PTR:
635     assert(MFI->hasDispatchPtr());
636     return MFI->DispatchPtrUserSGPR;
637   case SIRegisterInfo::QUEUE_PTR:
638     llvm_unreachable("not implemented");
639   case SIRegisterInfo::WORKITEM_ID_X:
640     assert(MFI->hasWorkItemIDX());
641     return AMDGPU::VGPR0;
642   case SIRegisterInfo::WORKITEM_ID_Y:
643     assert(MFI->hasWorkItemIDY());
644     return AMDGPU::VGPR1;
645   case SIRegisterInfo::WORKITEM_ID_Z:
646     assert(MFI->hasWorkItemIDZ());
647     return AMDGPU::VGPR2;
648   }
649   llvm_unreachable("unexpected preloaded value type");
650 }
651
652 /// \brief Returns a register that is not used at any point in the function.
653 ///        If all registers are used, then this function will return
654 //         AMDGPU::NoRegister.
655 unsigned SIRegisterInfo::findUnusedRegister(const MachineRegisterInfo &MRI,
656                                            const TargetRegisterClass *RC) const {
657   for (unsigned Reg : *RC)
658     if (!MRI.isPhysRegUsed(Reg))
659       return Reg;
660   return AMDGPU::NoRegister;
661 }
662
663 unsigned SIRegisterInfo::getNumVGPRsAllowed(unsigned WaveCount) const {
664   switch(WaveCount) {
665     case 10: return 24;
666     case 9:  return 28;
667     case 8:  return 32;
668     case 7:  return 36;
669     case 6:  return 40;
670     case 5:  return 48;
671     case 4:  return 64;
672     case 3:  return 84;
673     case 2:  return 128;
674     default: return 256;
675   }
676 }
677
678 unsigned SIRegisterInfo::getNumSGPRsAllowed(AMDGPUSubtarget::Generation gen,
679                                             unsigned WaveCount) const {
680   if (gen >= AMDGPUSubtarget::VOLCANIC_ISLANDS) {
681     switch (WaveCount) {
682       case 10: return 80;
683       case 9:  return 80;
684       case 8:  return 96;
685       default: return 102;
686     }
687   } else {
688     switch(WaveCount) {
689       case 10: return 48;
690       case 9:  return 56;
691       case 8:  return 64;
692       case 7:  return 72;
693       case 6:  return 80;
694       case 5:  return 96;
695       default: return 103;
696     }
697   }
698 }