1 //===- AMDGPURegisterBankInfo.cpp -------------------------------*- C++ -*-==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 /// This file implements the targeting of the RegisterBankInfo class for
10 /// AMDGPU.
11 /// \todo This should be generated by TableGen.
12 //===----------------------------------------------------------------------===//
13 
14 #include "AMDGPURegisterBankInfo.h"
15 #include "AMDGPUInstrInfo.h"
16 #include "AMDGPUSubtarget.h"
17 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
18 #include "SIMachineFunctionInfo.h"
19 #include "SIRegisterInfo.h"
20 #include "llvm/ADT/SmallSet.h"
21 #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
22 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
23 #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
24 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
25 #include "llvm/CodeGen/TargetRegisterInfo.h"
26 #include "llvm/CodeGen/TargetSubtargetInfo.h"
27 #include "llvm/IR/Constants.h"
28 
29 #define GET_TARGET_REGBANK_IMPL
30 #include "AMDGPUGenRegisterBank.inc"
31 
32 // This file will be TableGen'ed at some point.
33 #include "AMDGPUGenRegisterBankInfo.def"
34 
35 using namespace llvm;
36 
37 namespace {
38 
39 // Observer to apply a register bank to new registers created by LegalizerHelper.
40 class ApplyRegBankMapping final : public GISelChangeObserver {
41 private:
42   MachineRegisterInfo &MRI;
43   const RegisterBank *NewBank;
44   SmallVector<MachineInstr *, 4> NewInsts;
45 
46 public:
47   ApplyRegBankMapping(MachineRegisterInfo &MRI_, const RegisterBank *RB)
48     : MRI(MRI_), NewBank(RB) {}
49 
50   ~ApplyRegBankMapping() {
51     for (MachineInstr *MI : NewInsts)
52       applyBank(*MI);
53   }
54 
55   /// Set any registers that don't have a set register class or bank to SALU.
56   void applyBank(MachineInstr &MI) {
57     for (MachineOperand &Op : MI.operands()) {
58       if (!Op.isReg())
59         continue;
60 
61       Register Reg = Op.getReg();
62       if (MRI.getRegClassOrRegBank(Reg))
63         continue;
64 
65       const RegisterBank *RB = NewBank;
66       // FIXME: This might not be enough to detect when SCC should be used.
67       if (MRI.getType(Reg) == LLT::scalar(1))
68         RB = (NewBank == &AMDGPU::SGPRRegBank ?
69               &AMDGPU::SCCRegBank : &AMDGPU::VCCRegBank);
70 
71       MRI.setRegBank(Reg, *RB);
72     }
73   }
74 
75   void erasingInstr(MachineInstr &MI) override {}
76 
77   void createdInstr(MachineInstr &MI) override {
78     // At this point, the instruction was just inserted and has no operands.
79     NewInsts.push_back(&MI);
80   }
81 
82   void changingInstr(MachineInstr &MI) override {}
83   void changedInstr(MachineInstr &MI) override {}
84 };
85 
86 }
87 AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI)
88     : AMDGPUGenRegisterBankInfo(),
89       TRI(static_cast<const SIRegisterInfo*>(&TRI)) {
90 
91   // HACK: Until this is fully tablegen'd.
92   static bool AlreadyInit = false;
93   if (AlreadyInit)
94     return;
95 
96   AlreadyInit = true;
97 
98   const RegisterBank &RBSGPR = getRegBank(AMDGPU::SGPRRegBankID);
99   (void)RBSGPR;
100   assert(&RBSGPR == &AMDGPU::SGPRRegBank);
101 
102   const RegisterBank &RBVGPR = getRegBank(AMDGPU::VGPRRegBankID);
103   (void)RBVGPR;
104   assert(&RBVGPR == &AMDGPU::VGPRRegBank);
105 
106 }
107 
108 unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst,
109                                           const RegisterBank &Src,
110                                           unsigned Size) const {
111   // TODO: Should there be a UniformVGPRRegBank which can use readfirstlane?
112   if (Dst.getID() == AMDGPU::SGPRRegBankID &&
113       Src.getID() == AMDGPU::VGPRRegBankID) {
114     return std::numeric_limits<unsigned>::max();
115   }
116 
117   // Bool values are tricky, because the meaning is based on context. The SCC
118   // and VCC banks are for the natural scalar and vector conditions produced by
119   // a compare.
120   //
121   // Legalization doesn't know about the necessary context, so an s1 use may
122   // have been a truncate from an arbitrary value, in which case a copy (lowered
123   // as a compare with 0) needs to be inserted.
124   if (Size == 1 &&
125       (Dst.getID() == AMDGPU::SCCRegBankID ||
126        Dst.getID() == AMDGPU::SGPRRegBankID) &&
127       (Src.getID() == AMDGPU::SGPRRegBankID ||
128        Src.getID() == AMDGPU::VGPRRegBankID ||
129        Src.getID() == AMDGPU::VCCRegBankID))
130     return std::numeric_limits<unsigned>::max();
131 
132   if (Dst.getID() == AMDGPU::SCCRegBankID &&
133       Src.getID() == AMDGPU::VCCRegBankID)
134     return std::numeric_limits<unsigned>::max();
135 
136   return RegisterBankInfo::copyCost(Dst, Src, Size);
137 }
138 
139 unsigned AMDGPURegisterBankInfo::getBreakDownCost(
140   const ValueMapping &ValMapping,
141   const RegisterBank *CurBank) const {
142   // Check if this is a breakdown for G_LOAD to move the pointer from SGPR to
143   // VGPR.
144   // FIXME: Is there a better way to do this?
145   if (ValMapping.NumBreakDowns >= 2 || ValMapping.BreakDown[0].Length >= 64)
146     return 10; // This is expensive.
147 
148   assert(ValMapping.NumBreakDowns == 2 &&
149          ValMapping.BreakDown[0].Length == 32 &&
150          ValMapping.BreakDown[0].StartIdx == 0 &&
151          ValMapping.BreakDown[1].Length == 32 &&
152          ValMapping.BreakDown[1].StartIdx == 32 &&
153          ValMapping.BreakDown[0].RegBank == ValMapping.BreakDown[1].RegBank);
154 
155   // 32-bit extract of a 64-bit value is just access of a subregister, so free.
156   // TODO: Cost of 0 hits assert, though it's not clear it's what we really
157   // want.
158 
159   // TODO: 32-bit insert to a 64-bit SGPR may incur a non-free copy due to SGPR
160   // alignment restrictions, but this probably isn't important.
161   return 1;
162 }
163 
164 const RegisterBank &AMDGPURegisterBankInfo::getRegBankFromRegClass(
165     const TargetRegisterClass &RC) const {
166   if (&RC == &AMDGPU::SReg_1RegClass)
167     return AMDGPU::VCCRegBank;
168 
169   return TRI->isSGPRClass(&RC) ? AMDGPU::SGPRRegBank : AMDGPU::VGPRRegBank;
170 }
171 
172 template <unsigned NumOps>
173 RegisterBankInfo::InstructionMappings
174 AMDGPURegisterBankInfo::addMappingFromTable(
175     const MachineInstr &MI, const MachineRegisterInfo &MRI,
176     const std::array<unsigned, NumOps> RegSrcOpIdx,
177     ArrayRef<OpRegBankEntry<NumOps>> Table) const {
178 
179   InstructionMappings AltMappings;
180 
181   SmallVector<const ValueMapping *, 10> Operands(MI.getNumOperands());
182 
183   unsigned Sizes[NumOps];
184   for (unsigned I = 0; I < NumOps; ++I) {
185     Register Reg = MI.getOperand(RegSrcOpIdx[I]).getReg();
186     Sizes[I] = getSizeInBits(Reg, MRI, *TRI);
187   }
188 
189   for (unsigned I = 0, E = MI.getNumExplicitDefs(); I != E; ++I) {
190     unsigned SizeI = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI);
191     Operands[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SizeI);
192   }
193 
194   // getInstrMapping's default mapping uses ID 1, so start at 2.
195   unsigned MappingID = 2;
196   for (const auto &Entry : Table) {
197     for (unsigned I = 0; I < NumOps; ++I) {
198       int OpIdx = RegSrcOpIdx[I];
199       Operands[OpIdx] = AMDGPU::getValueMapping(Entry.RegBanks[I], Sizes[I]);
200     }
201 
202     AltMappings.push_back(&getInstructionMapping(MappingID++, Entry.Cost,
203                                                  getOperandsMapping(Operands),
204                                                  Operands.size()));
205   }
206 
207   return AltMappings;
208 }
209 
210 RegisterBankInfo::InstructionMappings
211 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsic(
212     const MachineInstr &MI, const MachineRegisterInfo &MRI) const {
213   switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
214   case Intrinsic::amdgcn_readlane: {
215     static const OpRegBankEntry<3> Table[2] = {
216       // Perfectly legal.
217       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
218 
219       // Need a readfirstlane for the index.
220       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }
221     };
222 
223     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } };
224     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
225   }
226   case Intrinsic::amdgcn_writelane: {
227     static const OpRegBankEntry<4> Table[4] = {
228       // Perfectly legal.
229       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
230 
231       // Need readfirstlane of first op
232       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 },
233 
234       // Need readfirstlane of second op
235       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 },
236 
237       // Need readfirstlane of both ops
238       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 3 }
239     };
240 
241     // rsrc, voffset, offset
242     const std::array<unsigned, 4> RegSrcOpIdx = { { 0, 2, 3, 4 } };
243     return addMappingFromTable<4>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
244   }
245   default:
246     return RegisterBankInfo::getInstrAlternativeMappings(MI);
247   }
248 }
249 
250 RegisterBankInfo::InstructionMappings
251 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsicWSideEffects(
252     const MachineInstr &MI, const MachineRegisterInfo &MRI) const {
253 
254   switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
255   case Intrinsic::amdgcn_buffer_load: {
256     static const OpRegBankEntry<3> Table[4] = {
257       // Perfectly legal.
258       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
259       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
260 
261       // Waterfall loop needed for rsrc. In the worst case this will execute
262       // approximately an extra 10 * wavesize + 2 instructions.
263       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 },
264       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1000 }
265     };
266 
267     // rsrc, voffset, offset
268     const std::array<unsigned, 3> RegSrcOpIdx = { { 2, 3, 4 } };
269     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
270   }
271   case Intrinsic::amdgcn_s_buffer_load: {
272     static const OpRegBankEntry<2> Table[4] = {
273       // Perfectly legal.
274       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
275 
276       // Only need 1 register in loop
277       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 300 },
278 
279       // Have to waterfall the resource.
280       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 },
281 
282       // Have to waterfall the resource, and the offset.
283       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1500 }
284     };
285 
286     // rsrc, offset
287     const std::array<unsigned, 2> RegSrcOpIdx = { { 2, 3 } };
288     return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
289   }
290   case Intrinsic::amdgcn_ds_ordered_add:
291   case Intrinsic::amdgcn_ds_ordered_swap: {
292     // VGPR = M0, VGPR
293     static const OpRegBankEntry<3> Table[2] = {
294       // Perfectly legal.
295       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID  }, 1 },
296 
297       // Need a readfirstlane for m0
298       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }
299     };
300 
301     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } };
302     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
303   }
304   case Intrinsic::amdgcn_s_sendmsg:
305   case Intrinsic::amdgcn_s_sendmsghalt: {
306     // FIXME: Should have no register for immediate
307     static const OpRegBankEntry<2> Table[2] = {
308       // Perfectly legal.
309       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
310 
311       // Need readlane
312       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 3 }
313     };
314 
315     const std::array<unsigned, 2> RegSrcOpIdx = { { 1, 2 } };
316     return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
317   }
318   default:
319     return RegisterBankInfo::getInstrAlternativeMappings(MI);
320   }
321 }
322 
323 static bool isInstrUniformNonExtLoadAlign4(const MachineInstr &MI) {
324   if (!MI.hasOneMemOperand())
325     return false;
326 
327   const MachineMemOperand *MMO = *MI.memoperands_begin();
328   return MMO->getSize() >= 4 && MMO->getAlignment() >= 4 &&
329          AMDGPUInstrInfo::isUniformMMO(MMO);
330 }
331 
332 RegisterBankInfo::InstructionMappings
333 AMDGPURegisterBankInfo::getInstrAlternativeMappings(
334     const MachineInstr &MI) const {
335 
336   const MachineFunction &MF = *MI.getParent()->getParent();
337   const MachineRegisterInfo &MRI = MF.getRegInfo();
338 
339 
340   InstructionMappings AltMappings;
341   switch (MI.getOpcode()) {
342   case TargetOpcode::G_CONSTANT:
343   case TargetOpcode::G_FCONSTANT:
344   case TargetOpcode::G_FRAME_INDEX:
345   case TargetOpcode::G_GLOBAL_VALUE: {
346     static const OpRegBankEntry<1> Table[2] = {
347       { { AMDGPU::VGPRRegBankID }, 1 },
348       { { AMDGPU::SGPRRegBankID }, 1 }
349     };
350 
351     return addMappingFromTable<1>(MI, MRI, { 0 }, Table);
352   }
353   case TargetOpcode::G_AND:
354   case TargetOpcode::G_OR:
355   case TargetOpcode::G_XOR: {
356     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
357 
358     if (Size == 1) {
359       // s_{and|or|xor}_b32 set scc when the result of the 32-bit op is not 0.
360       const InstructionMapping &SCCMapping = getInstructionMapping(
361         1, 1, getOperandsMapping(
362           {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, Size),
363            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
364            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
365         3); // Num Operands
366       AltMappings.push_back(&SCCMapping);
367 
368       const InstructionMapping &SGPRMapping = getInstructionMapping(
369         1, 1, getOperandsMapping(
370           {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
371            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
372            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
373         3); // Num Operands
374       AltMappings.push_back(&SGPRMapping);
375 
376       const InstructionMapping &VCCMapping0 = getInstructionMapping(
377         2, 10, getOperandsMapping(
378           {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size),
379               AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size),
380               AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size)}),
381         3); // Num Operands
382       AltMappings.push_back(&VCCMapping0);
383       return AltMappings;
384     }
385 
386     if (Size != 64)
387       break;
388 
389     const InstructionMapping &SSMapping = getInstructionMapping(
390       1, 1, getOperandsMapping(
391         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
392          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
393          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
394       3); // Num Operands
395     AltMappings.push_back(&SSMapping);
396 
397     const InstructionMapping &VVMapping = getInstructionMapping(
398       2, 2, getOperandsMapping(
399         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
400          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
401          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
402       3); // Num Operands
403     AltMappings.push_back(&VVMapping);
404 
405     const InstructionMapping &SVMapping = getInstructionMapping(
406       3, 3, getOperandsMapping(
407         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
408          AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size),
409          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
410       3); // Num Operands
411     AltMappings.push_back(&SVMapping);
412 
413     // SGPR in LHS is slightly preferrable, so make it VS more expensive than
414     // SV.
415     const InstructionMapping &VSMapping = getInstructionMapping(
416       3, 4, getOperandsMapping(
417         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
418          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
419          AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size)}),
420       3); // Num Operands
421     AltMappings.push_back(&VSMapping);
422     break;
423   }
424   case TargetOpcode::G_LOAD:
425   case TargetOpcode::G_ZEXTLOAD:
426   case TargetOpcode::G_SEXTLOAD: {
427     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
428     LLT PtrTy = MRI.getType(MI.getOperand(1).getReg());
429     unsigned PtrSize = PtrTy.getSizeInBits();
430     unsigned AS = PtrTy.getAddressSpace();
431     LLT LoadTy = MRI.getType(MI.getOperand(0).getReg());
432     if (isInstrUniformNonExtLoadAlign4(MI) &&
433         (AS != AMDGPUAS::LOCAL_ADDRESS && AS != AMDGPUAS::REGION_ADDRESS)) {
434       const InstructionMapping &SSMapping = getInstructionMapping(
435           1, 1, getOperandsMapping(
436                     {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
437                      AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize)}),
438           2); // Num Operands
439       AltMappings.push_back(&SSMapping);
440     }
441 
442     const InstructionMapping &VVMapping = getInstructionMapping(
443         2, 1, getOperandsMapping(
444           {AMDGPU::getValueMappingLoadSGPROnly(AMDGPU::VGPRRegBankID, LoadTy),
445            AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize)}),
446         2); // Num Operands
447     AltMappings.push_back(&VVMapping);
448 
449     // It may be possible to have a vgpr = load sgpr mapping here, because
450     // the mubuf instructions support this kind of load, but probably for only
451     // gfx7 and older.  However, the addressing mode matching in the instruction
452     // selector should be able to do a better job of detecting and selecting
453     // these kinds of loads from the vgpr = load vgpr mapping.
454 
455     return AltMappings;
456 
457   }
458   case TargetOpcode::G_ICMP: {
459     unsigned Size = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI);
460     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
461       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
462                           nullptr, // Predicate operand.
463                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
464                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
465       4); // Num Operands
466     AltMappings.push_back(&SSMapping);
467 
468     const InstructionMapping &SVMapping = getInstructionMapping(2, 1,
469       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
470                           nullptr, // Predicate operand.
471                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
472                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}),
473       4); // Num Operands
474     AltMappings.push_back(&SVMapping);
475 
476     const InstructionMapping &VSMapping = getInstructionMapping(3, 1,
477       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
478                           nullptr, // Predicate operand.
479                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
480                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
481       4); // Num Operands
482     AltMappings.push_back(&VSMapping);
483 
484     const InstructionMapping &VVMapping = getInstructionMapping(4, 1,
485       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
486                           nullptr, // Predicate operand.
487                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
488                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}),
489       4); // Num Operands
490     AltMappings.push_back(&VVMapping);
491 
492     return AltMappings;
493   }
494   case TargetOpcode::G_SELECT: {
495     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
496     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
497       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
498                           AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
499                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
500                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
501       4); // Num Operands
502     AltMappings.push_back(&SSMapping);
503 
504     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
505       getOperandsMapping({AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
506                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
507                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
508                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
509       4); // Num Operands
510     AltMappings.push_back(&VVMapping);
511 
512     return AltMappings;
513   }
514   case TargetOpcode::G_SMIN:
515   case TargetOpcode::G_SMAX:
516   case TargetOpcode::G_UMIN:
517   case TargetOpcode::G_UMAX: {
518     static const OpRegBankEntry<3> Table[4] = {
519       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
520       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
521       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
522 
523       // Scalar requires cmp+select, and extends if 16-bit.
524       // FIXME: Should there be separate costs for 32 and 16-bit
525       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 3 }
526     };
527 
528     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 1, 2 } };
529     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
530   }
531   case TargetOpcode::G_UADDE:
532   case TargetOpcode::G_USUBE:
533   case TargetOpcode::G_SADDE:
534   case TargetOpcode::G_SSUBE: {
535     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
536     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
537       getOperandsMapping(
538         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
539          AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
540          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
541          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
542          AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1)}),
543       5); // Num Operands
544     AltMappings.push_back(&SSMapping);
545 
546     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
547       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
548                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
549                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
550                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
551                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1)}),
552       5); // Num Operands
553     AltMappings.push_back(&VVMapping);
554     return AltMappings;
555   }
556   case AMDGPU::G_BRCOND: {
557     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
558 
559     const InstructionMapping &SMapping = getInstructionMapping(
560       1, 1, getOperandsMapping(
561         {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), nullptr}),
562       2); // Num Operands
563     AltMappings.push_back(&SMapping);
564 
565     const InstructionMapping &VMapping = getInstructionMapping(
566       1, 1, getOperandsMapping(
567         {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), nullptr }),
568       2); // Num Operands
569     AltMappings.push_back(&VMapping);
570     return AltMappings;
571   }
572   case AMDGPU::G_INTRINSIC:
573     return getInstrAlternativeMappingsIntrinsic(MI, MRI);
574   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS:
575     return getInstrAlternativeMappingsIntrinsicWSideEffects(MI, MRI);
576   default:
577     break;
578   }
579   return RegisterBankInfo::getInstrAlternativeMappings(MI);
580 }
581 
582 void AMDGPURegisterBankInfo::split64BitValueForMapping(
583   MachineIRBuilder &B,
584   SmallVector<Register, 2> &Regs,
585   LLT HalfTy,
586   Register Reg) const {
587   assert(HalfTy.getSizeInBits() == 32);
588   MachineRegisterInfo *MRI = B.getMRI();
589   Register LoLHS = MRI->createGenericVirtualRegister(HalfTy);
590   Register HiLHS = MRI->createGenericVirtualRegister(HalfTy);
591   const RegisterBank *Bank = getRegBank(Reg, *MRI, *TRI);
592   MRI->setRegBank(LoLHS, *Bank);
593   MRI->setRegBank(HiLHS, *Bank);
594 
595   Regs.push_back(LoLHS);
596   Regs.push_back(HiLHS);
597 
598   B.buildInstr(AMDGPU::G_UNMERGE_VALUES)
599     .addDef(LoLHS)
600     .addDef(HiLHS)
601     .addUse(Reg);
602 }
603 
604 /// Replace the current type each register in \p Regs has with \p NewTy
605 static void setRegsToType(MachineRegisterInfo &MRI, ArrayRef<Register> Regs,
606                           LLT NewTy) {
607   for (Register Reg : Regs) {
608     assert(MRI.getType(Reg).getSizeInBits() == NewTy.getSizeInBits());
609     MRI.setType(Reg, NewTy);
610   }
611 }
612 
613 static LLT getHalfSizedType(LLT Ty) {
614   if (Ty.isVector()) {
615     assert(Ty.getNumElements() % 2 == 0);
616     return LLT::scalarOrVector(Ty.getNumElements() / 2, Ty.getElementType());
617   }
618 
619   assert(Ty.getSizeInBits() % 2 == 0);
620   return LLT::scalar(Ty.getSizeInBits() / 2);
621 }
622 
623 /// Legalize instruction \p MI where operands in \p OpIndices must be SGPRs. If
624 /// any of the required SGPR operands are VGPRs, perform a waterfall loop to
625 /// execute the instruction for each unique combination of values in all lanes
626 /// in the wave. The block will be split such that rest of the instructions are
627 /// moved to a new block.
628 ///
629 /// Essentially performs this loop:
630 //
631 /// Save Execution Mask
632 /// For (Lane : Wavefront) {
633 ///   Enable Lane, Disable all other lanes
634 ///   SGPR = read SGPR value for current lane from VGPR
635 ///   VGPRResult[Lane] = use_op SGPR
636 /// }
637 /// Restore Execution Mask
638 ///
639 /// There is additional complexity to try for compare values to identify the
640 /// unique values used.
641 void AMDGPURegisterBankInfo::executeInWaterfallLoop(
642   MachineInstr &MI, MachineRegisterInfo &MRI,
643   ArrayRef<unsigned> OpIndices) const {
644   MachineFunction *MF = MI.getParent()->getParent();
645   const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>();
646   const SIInstrInfo *TII = ST.getInstrInfo();
647   MachineBasicBlock::iterator I(MI);
648 
649   MachineBasicBlock &MBB = *MI.getParent();
650   const DebugLoc &DL = MI.getDebugLoc();
651 
652   // Use a set to avoid extra readfirstlanes in the case where multiple operands
653   // are the same register.
654   SmallSet<Register, 4> SGPROperandRegs;
655   for (unsigned Op : OpIndices) {
656     assert(MI.getOperand(Op).isUse());
657     Register Reg = MI.getOperand(Op).getReg();
658     const RegisterBank *OpBank = getRegBank(Reg, MRI, *TRI);
659     if (OpBank->getID() == AMDGPU::VGPRRegBankID)
660       SGPROperandRegs.insert(Reg);
661   }
662 
663   // No operands need to be replaced, so no need to loop.
664   if (SGPROperandRegs.empty())
665     return;
666 
667   MachineIRBuilder B(MI);
668   SmallVector<Register, 4> ResultRegs;
669   SmallVector<Register, 4> InitResultRegs;
670   SmallVector<Register, 4> PhiRegs;
671   for (MachineOperand &Def : MI.defs()) {
672     LLT ResTy = MRI.getType(Def.getReg());
673     const RegisterBank *DefBank = getRegBank(Def.getReg(), MRI, *TRI);
674     ResultRegs.push_back(Def.getReg());
675     Register InitReg = B.buildUndef(ResTy).getReg(0);
676     Register PhiReg = MRI.createGenericVirtualRegister(ResTy);
677     InitResultRegs.push_back(InitReg);
678     PhiRegs.push_back(PhiReg);
679     MRI.setRegBank(PhiReg, *DefBank);
680     MRI.setRegBank(InitReg, *DefBank);
681   }
682 
683   Register SaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
684   Register InitSaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
685 
686   // Don't bother using generic instructions/registers for the exec mask.
687   B.buildInstr(TargetOpcode::IMPLICIT_DEF)
688     .addDef(InitSaveExecReg);
689 
690   Register PhiExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
691   Register NewExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
692 
693   // To insert the loop we need to split the block. Move everything before this
694   // point to a new block, and insert a new empty block before this instruction.
695   MachineBasicBlock *LoopBB = MF->CreateMachineBasicBlock();
696   MachineBasicBlock *RemainderBB = MF->CreateMachineBasicBlock();
697   MachineBasicBlock *RestoreExecBB = MF->CreateMachineBasicBlock();
698   MachineFunction::iterator MBBI(MBB);
699   ++MBBI;
700   MF->insert(MBBI, LoopBB);
701   MF->insert(MBBI, RestoreExecBB);
702   MF->insert(MBBI, RemainderBB);
703 
704   LoopBB->addSuccessor(RestoreExecBB);
705   LoopBB->addSuccessor(LoopBB);
706 
707   // Move the rest of the block into a new block.
708   RemainderBB->transferSuccessorsAndUpdatePHIs(&MBB);
709   RemainderBB->splice(RemainderBB->begin(), &MBB, I, MBB.end());
710 
711   MBB.addSuccessor(LoopBB);
712   RestoreExecBB->addSuccessor(RemainderBB);
713 
714   B.setInsertPt(*LoopBB, LoopBB->end());
715 
716   B.buildInstr(TargetOpcode::PHI)
717     .addDef(PhiExec)
718     .addReg(InitSaveExecReg)
719     .addMBB(&MBB)
720     .addReg(NewExec)
721     .addMBB(LoopBB);
722 
723   for (auto Result : zip(InitResultRegs, ResultRegs, PhiRegs)) {
724     B.buildInstr(TargetOpcode::G_PHI)
725       .addDef(std::get<2>(Result))
726       .addReg(std::get<0>(Result)) // Initial value / implicit_def
727       .addMBB(&MBB)
728       .addReg(std::get<1>(Result)) // Mid-loop value.
729       .addMBB(LoopBB);
730   }
731 
732   // Move the instruction into the loop.
733   LoopBB->splice(LoopBB->end(), &MBB, I);
734   I = std::prev(LoopBB->end());
735 
736   B.setInstr(*I);
737 
738   Register CondReg;
739 
740   for (MachineOperand &Op : MI.uses()) {
741     if (!Op.isReg())
742       continue;
743 
744     assert(!Op.isDef());
745     if (SGPROperandRegs.count(Op.getReg())) {
746       LLT OpTy = MRI.getType(Op.getReg());
747       unsigned OpSize = OpTy.getSizeInBits();
748 
749       // Can only do a readlane of 32-bit pieces.
750       if (OpSize == 32) {
751         // Avoid extra copies in the simple case of one 32-bit register.
752         Register CurrentLaneOpReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
753         MRI.setType(CurrentLaneOpReg, OpTy);
754 
755         constrainGenericRegister(Op.getReg(), AMDGPU::VGPR_32RegClass, MRI);
756         // Read the next variant <- also loop target.
757         BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), CurrentLaneOpReg)
758           .addReg(Op.getReg());
759 
760         Register NewCondReg = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
761         bool First = CondReg == AMDGPU::NoRegister;
762         if (First)
763           CondReg = NewCondReg;
764 
765         // Compare the just read M0 value to all possible Idx values.
766         B.buildInstr(AMDGPU::V_CMP_EQ_U32_e64)
767           .addDef(NewCondReg)
768           .addReg(CurrentLaneOpReg)
769           .addReg(Op.getReg());
770         Op.setReg(CurrentLaneOpReg);
771 
772         if (!First) {
773           Register AndReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
774 
775           // If there are multiple operands to consider, and the conditions.
776           B.buildInstr(AMDGPU::S_AND_B64)
777             .addDef(AndReg)
778             .addReg(NewCondReg)
779             .addReg(CondReg);
780           CondReg = AndReg;
781         }
782       } else {
783         LLT S32 = LLT::scalar(32);
784         SmallVector<Register, 8> ReadlanePieces;
785 
786         // The compares can be done as 64-bit, but the extract needs to be done
787         // in 32-bit pieces.
788 
789         bool Is64 = OpSize % 64 == 0;
790 
791         LLT UnmergeTy = OpSize % 64 == 0 ? LLT::scalar(64) : LLT::scalar(32);
792         unsigned CmpOp = OpSize % 64 == 0 ? AMDGPU::V_CMP_EQ_U64_e64
793                                           : AMDGPU::V_CMP_EQ_U32_e64;
794 
795         // The compares can be done as 64-bit, but the extract needs to be done
796         // in 32-bit pieces.
797 
798         // Insert the unmerge before the loop.
799 
800         B.setMBB(MBB);
801         auto Unmerge = B.buildUnmerge(UnmergeTy, Op.getReg());
802         B.setInstr(*I);
803 
804         unsigned NumPieces = Unmerge->getNumOperands() - 1;
805         for (unsigned PieceIdx = 0; PieceIdx != NumPieces; ++PieceIdx) {
806           Register UnmergePiece = Unmerge.getReg(PieceIdx);
807 
808           Register CurrentLaneOpReg;
809           if (Is64) {
810             Register CurrentLaneOpRegLo = MRI.createGenericVirtualRegister(S32);
811             Register CurrentLaneOpRegHi = MRI.createGenericVirtualRegister(S32);
812 
813             MRI.setRegClass(UnmergePiece, &AMDGPU::VReg_64RegClass);
814             MRI.setRegClass(CurrentLaneOpRegLo, &AMDGPU::SReg_32_XM0RegClass);
815             MRI.setRegClass(CurrentLaneOpRegHi, &AMDGPU::SReg_32_XM0RegClass);
816 
817             // Read the next variant <- also loop target.
818             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
819                     CurrentLaneOpRegLo)
820               .addReg(UnmergePiece, 0, AMDGPU::sub0);
821 
822             // Read the next variant <- also loop target.
823             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
824                     CurrentLaneOpRegHi)
825               .addReg(UnmergePiece, 0, AMDGPU::sub1);
826 
827             CurrentLaneOpReg =
828                 B.buildMerge(LLT::scalar(64),
829                              {CurrentLaneOpRegLo, CurrentLaneOpRegHi})
830                     .getReg(0);
831 
832             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_64_XEXECRegClass);
833 
834             if (OpTy.getScalarSizeInBits() == 64) {
835               // If we need to produce a 64-bit element vector, so use the
836               // merged pieces
837               ReadlanePieces.push_back(CurrentLaneOpReg);
838             } else {
839               // 32-bit element type.
840               ReadlanePieces.push_back(CurrentLaneOpRegLo);
841               ReadlanePieces.push_back(CurrentLaneOpRegHi);
842             }
843           } else {
844             CurrentLaneOpReg = MRI.createGenericVirtualRegister(LLT::scalar(32));
845             MRI.setRegClass(UnmergePiece, &AMDGPU::VGPR_32RegClass);
846             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_32_XM0RegClass);
847 
848             // Read the next variant <- also loop target.
849             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
850                     CurrentLaneOpReg)
851               .addReg(UnmergePiece);
852             ReadlanePieces.push_back(CurrentLaneOpReg);
853           }
854 
855           Register NewCondReg
856             = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
857           bool First = CondReg == AMDGPU::NoRegister;
858           if (First)
859             CondReg = NewCondReg;
860 
861           B.buildInstr(CmpOp)
862             .addDef(NewCondReg)
863             .addReg(CurrentLaneOpReg)
864             .addReg(UnmergePiece);
865 
866           if (!First) {
867             Register AndReg
868               = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
869 
870             // If there are multiple operands to consider, and the conditions.
871             B.buildInstr(AMDGPU::S_AND_B64)
872               .addDef(AndReg)
873               .addReg(NewCondReg)
874               .addReg(CondReg);
875             CondReg = AndReg;
876           }
877         }
878 
879         // FIXME: Build merge seems to switch to CONCAT_VECTORS but not
880         // BUILD_VECTOR
881         if (OpTy.isVector()) {
882           auto Merge = B.buildBuildVector(OpTy, ReadlanePieces);
883           Op.setReg(Merge.getReg(0));
884         } else {
885           auto Merge = B.buildMerge(OpTy, ReadlanePieces);
886           Op.setReg(Merge.getReg(0));
887         }
888 
889         MRI.setRegBank(Op.getReg(), getRegBank(AMDGPU::SGPRRegBankID));
890       }
891     }
892   }
893 
894   B.setInsertPt(*LoopBB, LoopBB->end());
895 
896   // Update EXEC, save the original EXEC value to VCC.
897   B.buildInstr(AMDGPU::S_AND_SAVEEXEC_B64)
898     .addDef(NewExec)
899     .addReg(CondReg, RegState::Kill);
900 
901   MRI.setSimpleHint(NewExec, CondReg);
902 
903   // Update EXEC, switch all done bits to 0 and all todo bits to 1.
904   B.buildInstr(AMDGPU::S_XOR_B64_term)
905     .addDef(AMDGPU::EXEC)
906     .addReg(AMDGPU::EXEC)
907     .addReg(NewExec);
908 
909   // XXX - s_xor_b64 sets scc to 1 if the result is nonzero, so can we use
910   // s_cbranch_scc0?
911 
912   // Loop back to V_READFIRSTLANE_B32 if there are still variants to cover.
913   B.buildInstr(AMDGPU::S_CBRANCH_EXECNZ)
914     .addMBB(LoopBB);
915 
916   // Save the EXEC mask before the loop.
917   BuildMI(MBB, MBB.end(), DL, TII->get(AMDGPU::S_MOV_B64_term), SaveExecReg)
918     .addReg(AMDGPU::EXEC);
919 
920   // Restore the EXEC mask after the loop.
921   B.setMBB(*RestoreExecBB);
922   B.buildInstr(AMDGPU::S_MOV_B64_term)
923     .addDef(AMDGPU::EXEC)
924     .addReg(SaveExecReg);
925 }
926 
927 // Legalize an operand that must be an SGPR by inserting a readfirstlane.
928 void AMDGPURegisterBankInfo::constrainOpWithReadfirstlane(
929     MachineInstr &MI, MachineRegisterInfo &MRI, unsigned OpIdx) const {
930   Register Reg = MI.getOperand(OpIdx).getReg();
931   const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI);
932   if (Bank != &AMDGPU::VGPRRegBank)
933     return;
934 
935   MachineIRBuilder B(MI);
936   Register SGPR = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
937   B.buildInstr(AMDGPU::V_READFIRSTLANE_B32)
938     .addDef(SGPR)
939     .addReg(Reg);
940 
941   const TargetRegisterClass *Constrained =
942       constrainGenericRegister(Reg, AMDGPU::VGPR_32RegClass, MRI);
943   (void)Constrained;
944   assert(Constrained && "Failed to constrain readfirstlane src reg");
945 
946   MI.getOperand(OpIdx).setReg(SGPR);
947 }
948 
949 // When regbankselect repairs registers, it will insert a repair instruction
950 // which defines the repaired register.  Then it calls applyMapping and expects
951 // that the targets will either delete or rewrite the originally wrote to the
952 // repaired registers.  Beccause of this, we end up in a situation where
953 // we have 2 instructions defining the same registers.
954 static MachineInstr *getOtherVRegDef(const MachineRegisterInfo &MRI,
955                                      Register Reg,
956                                      const MachineInstr &MI) {
957   // Is there some way we can assert that there are exactly 2 def instructions?
958   for (MachineInstr &Other : MRI.def_instructions(Reg)) {
959     if (&Other != &MI)
960       return &Other;
961   }
962 
963   return nullptr;
964 }
965 
966 bool AMDGPURegisterBankInfo::applyMappingWideLoad(MachineInstr &MI,
967                         const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper,
968                                               MachineRegisterInfo &MRI) const {
969   Register DstReg = MI.getOperand(0).getReg();
970   const LLT LoadTy =  MRI.getType(DstReg);
971   unsigned LoadSize = LoadTy.getSizeInBits();
972   const unsigned MaxNonSmrdLoadSize = 128;
973   // 128-bit loads are supported for all instruction types.
974   if (LoadSize <= MaxNonSmrdLoadSize)
975     return false;
976 
977   SmallVector<unsigned, 16> DefRegs(OpdMapper.getVRegs(0));
978   SmallVector<unsigned, 1> SrcRegs(OpdMapper.getVRegs(1));
979 
980   // If the pointer is an SGPR, we have nothing to do.
981   if (SrcRegs.empty())
982     return false;
983 
984   assert(LoadSize % MaxNonSmrdLoadSize == 0);
985 
986   // We want to get the repair instruction now, because it will help us
987   // determine which instruction the legalizer inserts that will also
988   // write to DstReg.
989   MachineInstr *RepairInst = getOtherVRegDef(MRI, DstReg, MI);
990 
991   // RegBankSelect only emits scalar types, so we need to reset the pointer
992   // operand to a pointer type.
993   Register BasePtrReg = SrcRegs[0];
994   LLT PtrTy = MRI.getType(MI.getOperand(1).getReg());
995   MRI.setType(BasePtrReg, PtrTy);
996 
997   MachineIRBuilder B(MI);
998 
999   unsigned SplitElts =
1000       MaxNonSmrdLoadSize / LoadTy.getScalarType().getSizeInBits();
1001   const LLT LoadSplitTy =  LLT::vector(SplitElts, LoadTy.getScalarType());
1002   ApplyRegBankMapping O(MRI, &AMDGPU::VGPRRegBank);
1003   GISelObserverWrapper Observer(&O);
1004   B.setChangeObserver(Observer);
1005   LegalizerHelper Helper(B.getMF(), Observer, B);
1006   if (Helper.fewerElementsVector(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
1007     return false;
1008 
1009   // At this point, the legalizer has split the original load into smaller
1010   // loads.  At the end of lowering, it inserts an instruction (LegalizedInst)
1011   // that combines the outputs of the lower loads and writes it to DstReg.
1012   // The register bank selector has also added the RepairInst which writes to
1013   // DstReg as well.
1014 
1015   MachineInstr *LegalizedInst = getOtherVRegDef(MRI, DstReg, *RepairInst);
1016 
1017   // Replace the output of the LegalizedInst with a temporary register, since
1018   // RepairInst already defines DstReg.
1019   Register TmpReg = MRI.createGenericVirtualRegister(MRI.getType(DstReg));
1020   LegalizedInst->getOperand(0).setReg(TmpReg);
1021   B.setInsertPt(*RepairInst->getParent(), RepairInst);
1022 
1023   for (unsigned DefIdx = 0, e = DefRegs.size(); DefIdx != e; ++DefIdx) {
1024     Register IdxReg = MRI.createGenericVirtualRegister(LLT::scalar(32));
1025     B.buildConstant(IdxReg, DefIdx);
1026     MRI.setRegBank(IdxReg, getRegBank(AMDGPU::VGPRRegBankID));
1027     B.buildExtractVectorElement(DefRegs[DefIdx], TmpReg, IdxReg);
1028   }
1029 
1030   MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID));
1031   return true;
1032 }
1033 
1034 // For cases where only a single copy is inserted for matching register banks.
1035 // Replace the register in the instruction operand
1036 static void substituteSimpleCopyRegs(
1037   const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper, unsigned OpIdx) {
1038   SmallVector<unsigned, 1> SrcReg(OpdMapper.getVRegs(OpIdx));
1039   if (!SrcReg.empty()) {
1040     assert(SrcReg.size() == 1);
1041     OpdMapper.getMI().getOperand(OpIdx).setReg(SrcReg[0]);
1042   }
1043 }
1044 
1045 void AMDGPURegisterBankInfo::applyMappingImpl(
1046     const OperandsMapper &OpdMapper) const {
1047   MachineInstr &MI = OpdMapper.getMI();
1048   unsigned Opc = MI.getOpcode();
1049   MachineRegisterInfo &MRI = OpdMapper.getMRI();
1050   switch (Opc) {
1051   case AMDGPU::G_SELECT: {
1052     Register DstReg = MI.getOperand(0).getReg();
1053     LLT DstTy = MRI.getType(DstReg);
1054     if (DstTy.getSizeInBits() != 64)
1055       break;
1056 
1057     LLT HalfTy = getHalfSizedType(DstTy);
1058 
1059     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
1060     SmallVector<Register, 1> Src0Regs(OpdMapper.getVRegs(1));
1061     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
1062     SmallVector<Register, 2> Src2Regs(OpdMapper.getVRegs(3));
1063 
1064     // All inputs are SGPRs, nothing special to do.
1065     if (DefRegs.empty()) {
1066       assert(Src1Regs.empty() && Src2Regs.empty());
1067       break;
1068     }
1069 
1070     MachineIRBuilder B(MI);
1071     if (Src0Regs.empty())
1072       Src0Regs.push_back(MI.getOperand(1).getReg());
1073     else {
1074       assert(Src0Regs.size() == 1);
1075     }
1076 
1077     if (Src1Regs.empty())
1078       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
1079     else {
1080       setRegsToType(MRI, Src1Regs, HalfTy);
1081     }
1082 
1083     if (Src2Regs.empty())
1084       split64BitValueForMapping(B, Src2Regs, HalfTy, MI.getOperand(3).getReg());
1085     else
1086       setRegsToType(MRI, Src2Regs, HalfTy);
1087 
1088     setRegsToType(MRI, DefRegs, HalfTy);
1089 
1090     B.buildSelect(DefRegs[0], Src0Regs[0], Src1Regs[0], Src2Regs[0]);
1091     B.buildSelect(DefRegs[1], Src0Regs[0], Src1Regs[1], Src2Regs[1]);
1092 
1093     MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID));
1094     MI.eraseFromParent();
1095     return;
1096   }
1097   case AMDGPU::G_AND:
1098   case AMDGPU::G_OR:
1099   case AMDGPU::G_XOR: {
1100     // 64-bit and is only available on the SALU, so split into 2 32-bit ops if
1101     // there is a VGPR input.
1102     Register DstReg = MI.getOperand(0).getReg();
1103     LLT DstTy = MRI.getType(DstReg);
1104     if (DstTy.getSizeInBits() != 64)
1105       break;
1106 
1107     LLT HalfTy = getHalfSizedType(DstTy);
1108     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
1109     SmallVector<Register, 2> Src0Regs(OpdMapper.getVRegs(1));
1110     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
1111 
1112     // All inputs are SGPRs, nothing special to do.
1113     if (DefRegs.empty()) {
1114       assert(Src0Regs.empty() && Src1Regs.empty());
1115       break;
1116     }
1117 
1118     assert(DefRegs.size() == 2);
1119     assert(Src0Regs.size() == Src1Regs.size() &&
1120            (Src0Regs.empty() || Src0Regs.size() == 2));
1121 
1122     // Depending on where the source registers came from, the generic code may
1123     // have decided to split the inputs already or not. If not, we still need to
1124     // extract the values.
1125     MachineIRBuilder B(MI);
1126 
1127     if (Src0Regs.empty())
1128       split64BitValueForMapping(B, Src0Regs, HalfTy, MI.getOperand(1).getReg());
1129     else
1130       setRegsToType(MRI, Src0Regs, HalfTy);
1131 
1132     if (Src1Regs.empty())
1133       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
1134     else
1135       setRegsToType(MRI, Src1Regs, HalfTy);
1136 
1137     setRegsToType(MRI, DefRegs, HalfTy);
1138 
1139     B.buildInstr(Opc)
1140       .addDef(DefRegs[0])
1141       .addUse(Src0Regs[0])
1142       .addUse(Src1Regs[0]);
1143 
1144     B.buildInstr(Opc)
1145       .addDef(DefRegs[1])
1146       .addUse(Src0Regs[1])
1147       .addUse(Src1Regs[1]);
1148 
1149     MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID));
1150     MI.eraseFromParent();
1151     return;
1152   }
1153   case AMDGPU::G_ADD:
1154   case AMDGPU::G_SUB:
1155   case AMDGPU::G_MUL: {
1156     Register DstReg = MI.getOperand(0).getReg();
1157     LLT DstTy = MRI.getType(DstReg);
1158     if (DstTy != LLT::scalar(16))
1159       break;
1160 
1161     const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI);
1162     if (DstBank == &AMDGPU::VGPRRegBank)
1163       break;
1164 
1165     // 16-bit operations are VALU only, but can be promoted to 32-bit SALU.
1166     MachineFunction *MF = MI.getParent()->getParent();
1167     MachineIRBuilder B(MI);
1168     ApplyRegBankMapping ApplySALU(MRI, &AMDGPU::SGPRRegBank);
1169     GISelObserverWrapper Observer(&ApplySALU);
1170     LegalizerHelper Helper(*MF, Observer, B);
1171 
1172     if (Helper.widenScalar(MI, 0, LLT::scalar(32)) !=
1173         LegalizerHelper::Legalized)
1174       llvm_unreachable("widen scalar should have succeeded");
1175     return;
1176   }
1177   case AMDGPU::G_SMIN:
1178   case AMDGPU::G_SMAX:
1179   case AMDGPU::G_UMIN:
1180   case AMDGPU::G_UMAX: {
1181     Register DstReg = MI.getOperand(0).getReg();
1182     const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI);
1183     if (DstBank == &AMDGPU::VGPRRegBank)
1184       break;
1185 
1186     MachineFunction *MF = MI.getParent()->getParent();
1187     MachineIRBuilder B(MI);
1188     ApplyRegBankMapping ApplySALU(MRI, &AMDGPU::SGPRRegBank);
1189     GISelObserverWrapper Observer(&ApplySALU);
1190     LegalizerHelper Helper(*MF, Observer, B);
1191 
1192     // Turn scalar min/max into a compare and select.
1193     LLT Ty = MRI.getType(DstReg);
1194     LLT S32 = LLT::scalar(32);
1195     LLT S16 = LLT::scalar(16);
1196 
1197     if (Ty == S16) {
1198       // Need to widen to s32, and expand as cmp + select.
1199       if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized)
1200         llvm_unreachable("widenScalar should have succeeded");
1201 
1202       // FIXME: This is relying on widenScalar leaving MI in place.
1203       if (Helper.lower(MI, 0, S32) != LegalizerHelper::Legalized)
1204         llvm_unreachable("lower should have succeeded");
1205     } else {
1206       if (Helper.lower(MI, 0, Ty) != LegalizerHelper::Legalized)
1207         llvm_unreachable("lower should have succeeded");
1208     }
1209 
1210     return;
1211   }
1212   case AMDGPU::G_SEXT:
1213   case AMDGPU::G_ZEXT: {
1214     Register SrcReg = MI.getOperand(1).getReg();
1215     LLT SrcTy = MRI.getType(SrcReg);
1216     bool Signed = Opc == AMDGPU::G_SEXT;
1217 
1218     MachineIRBuilder B(MI);
1219     const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI);
1220 
1221     Register DstReg = MI.getOperand(0).getReg();
1222     LLT DstTy = MRI.getType(DstReg);
1223     if (DstTy.isScalar() &&
1224         SrcBank != &AMDGPU::SGPRRegBank &&
1225         SrcBank != &AMDGPU::SCCRegBank &&
1226         SrcBank != &AMDGPU::VCCRegBank &&
1227         // FIXME: Should handle any type that round to s64 when irregular
1228         // breakdowns supported.
1229         DstTy.getSizeInBits() == 64 &&
1230         SrcTy.getSizeInBits() <= 32) {
1231       const LLT S32 = LLT::scalar(32);
1232       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
1233 
1234       // Extend to 32-bit, and then extend the low half.
1235       if (Signed) {
1236         // TODO: Should really be buildSExtOrCopy
1237         B.buildSExtOrTrunc(DefRegs[0], SrcReg);
1238 
1239         // Replicate sign bit from 32-bit extended part.
1240         auto ShiftAmt = B.buildConstant(S32, 31);
1241         MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank);
1242         B.buildAShr(DefRegs[1], DefRegs[0], ShiftAmt);
1243       } else {
1244         B.buildZExtOrTrunc(DefRegs[0], SrcReg);
1245         B.buildConstant(DefRegs[1], 0);
1246       }
1247 
1248       MRI.setRegBank(DstReg, *SrcBank);
1249       MI.eraseFromParent();
1250       return;
1251     }
1252 
1253     if (SrcTy != LLT::scalar(1))
1254       return;
1255 
1256     if (SrcBank == &AMDGPU::SCCRegBank || SrcBank == &AMDGPU::VCCRegBank) {
1257       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
1258 
1259       const RegisterBank *DstBank = SrcBank == &AMDGPU::SCCRegBank ?
1260         &AMDGPU::SGPRRegBank : &AMDGPU::VGPRRegBank;
1261 
1262       unsigned DstSize = DstTy.getSizeInBits();
1263       // 64-bit select is SGPR only
1264       const bool UseSel64 = DstSize > 32 &&
1265         SrcBank->getID() == AMDGPU::SCCRegBankID;
1266 
1267       // TODO: Should s16 select be legal?
1268       LLT SelType = UseSel64 ? LLT::scalar(64) : LLT::scalar(32);
1269       auto True = B.buildConstant(SelType, Signed ? -1 : 1);
1270       auto False = B.buildConstant(SelType, 0);
1271 
1272       MRI.setRegBank(True.getReg(0), *DstBank);
1273       MRI.setRegBank(False.getReg(0), *DstBank);
1274       MRI.setRegBank(DstReg, *DstBank);
1275 
1276       if (DstSize > 32 && SrcBank->getID() != AMDGPU::SCCRegBankID) {
1277         B.buildSelect(DefRegs[0], SrcReg, True, False);
1278         B.buildCopy(DefRegs[1], DefRegs[0]);
1279       } else if (DstSize < 32) {
1280         auto Sel = B.buildSelect(SelType, SrcReg, True, False);
1281         MRI.setRegBank(Sel.getReg(0), *DstBank);
1282         B.buildTrunc(DstReg, Sel);
1283       } else {
1284         B.buildSelect(DstReg, SrcReg, True, False);
1285       }
1286 
1287       MI.eraseFromParent();
1288       return;
1289     }
1290 
1291     // Fixup the case with an s1 src that isn't a condition register. Use shifts
1292     // instead of introducing a compare to avoid an unnecessary condition
1293     // register (and since there's no scalar 16-bit compares).
1294     auto Ext = B.buildAnyExt(DstTy, SrcReg);
1295     auto ShiftAmt = B.buildConstant(LLT::scalar(32), DstTy.getSizeInBits() - 1);
1296     auto Shl = B.buildShl(DstTy, Ext, ShiftAmt);
1297 
1298     if (MI.getOpcode() == AMDGPU::G_SEXT)
1299       B.buildAShr(DstReg, Shl, ShiftAmt);
1300     else
1301       B.buildLShr(DstReg, Shl, ShiftAmt);
1302 
1303     MRI.setRegBank(DstReg, *SrcBank);
1304     MRI.setRegBank(Ext.getReg(0), *SrcBank);
1305     MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank);
1306     MRI.setRegBank(Shl.getReg(0), *SrcBank);
1307     MI.eraseFromParent();
1308     return;
1309   }
1310   case AMDGPU::G_BUILD_VECTOR:
1311   case AMDGPU::G_BUILD_VECTOR_TRUNC: {
1312     Register DstReg = MI.getOperand(0).getReg();
1313     LLT DstTy = MRI.getType(DstReg);
1314     if (DstTy != LLT::vector(2, 16))
1315       break;
1316 
1317     assert(MI.getNumOperands() == 3 && empty(OpdMapper.getVRegs(0)));
1318     substituteSimpleCopyRegs(OpdMapper, 1);
1319     substituteSimpleCopyRegs(OpdMapper, 2);
1320 
1321     const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI);
1322     if (DstBank == &AMDGPU::SGPRRegBank)
1323       break; // Can use S_PACK_* instructions.
1324 
1325     MachineIRBuilder B(MI);
1326 
1327     Register Lo = MI.getOperand(1).getReg();
1328     Register Hi = MI.getOperand(2).getReg();
1329     const LLT S32 = LLT::scalar(32);
1330 
1331     const RegisterBank *BankLo = getRegBank(Lo, MRI, *TRI);
1332     const RegisterBank *BankHi = getRegBank(Hi, MRI, *TRI);
1333 
1334     Register ZextLo;
1335     Register ShiftHi;
1336 
1337     if (Opc == AMDGPU::G_BUILD_VECTOR) {
1338       ZextLo = B.buildZExt(S32, Lo).getReg(0);
1339       MRI.setRegBank(ZextLo, *BankLo);
1340 
1341       Register ZextHi = B.buildZExt(S32, Hi).getReg(0);
1342       MRI.setRegBank(ZextHi, *BankHi);
1343 
1344       auto ShiftAmt = B.buildConstant(S32, 16);
1345       MRI.setRegBank(ShiftAmt.getReg(0), *BankHi);
1346 
1347       ShiftHi = B.buildShl(S32, ZextHi, ShiftAmt).getReg(0);
1348       MRI.setRegBank(ShiftHi, *BankHi);
1349     } else {
1350       Register MaskLo = B.buildConstant(S32, 0xffff).getReg(0);
1351       MRI.setRegBank(MaskLo, *BankLo);
1352 
1353       auto ShiftAmt = B.buildConstant(S32, 16);
1354       MRI.setRegBank(ShiftAmt.getReg(0), *BankHi);
1355 
1356       ShiftHi = B.buildShl(S32, Hi, ShiftAmt).getReg(0);
1357       MRI.setRegBank(ShiftHi, *BankHi);
1358 
1359       ZextLo = B.buildAnd(S32, Lo, MaskLo).getReg(0);
1360       MRI.setRegBank(ZextLo, *BankLo);
1361     }
1362 
1363     auto Or = B.buildOr(S32, ZextLo, ShiftHi);
1364     MRI.setRegBank(Or.getReg(0), *DstBank);
1365 
1366     B.buildBitcast(DstReg, Or);
1367     MI.eraseFromParent();
1368     return;
1369   }
1370   case AMDGPU::G_EXTRACT_VECTOR_ELT:
1371     applyDefaultMapping(OpdMapper);
1372     executeInWaterfallLoop(MI, MRI, { 2 });
1373     return;
1374   case AMDGPU::G_INTRINSIC: {
1375     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
1376     case Intrinsic::amdgcn_s_buffer_load: {
1377       // FIXME: Move to G_INTRINSIC_W_SIDE_EFFECTS
1378       executeInWaterfallLoop(MI, MRI, { 2, 3 });
1379       return;
1380     }
1381     case Intrinsic::amdgcn_readlane: {
1382       substituteSimpleCopyRegs(OpdMapper, 2);
1383 
1384       assert(empty(OpdMapper.getVRegs(0)));
1385       assert(empty(OpdMapper.getVRegs(3)));
1386 
1387       // Make sure the index is an SGPR. It doesn't make sense to run this in a
1388       // waterfall loop, so assume it's a uniform value.
1389       constrainOpWithReadfirstlane(MI, MRI, 3); // Index
1390       return;
1391     }
1392     case Intrinsic::amdgcn_writelane: {
1393       assert(empty(OpdMapper.getVRegs(0)));
1394       assert(empty(OpdMapper.getVRegs(2)));
1395       assert(empty(OpdMapper.getVRegs(3)));
1396 
1397       substituteSimpleCopyRegs(OpdMapper, 4); // VGPR input val
1398       constrainOpWithReadfirstlane(MI, MRI, 2); // Source value
1399       constrainOpWithReadfirstlane(MI, MRI, 3); // Index
1400       return;
1401     }
1402     default:
1403       break;
1404     }
1405     break;
1406   }
1407   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
1408     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
1409     case Intrinsic::amdgcn_buffer_load: {
1410       executeInWaterfallLoop(MI, MRI, { 2 });
1411       return;
1412     }
1413     case Intrinsic::amdgcn_ds_ordered_add:
1414     case Intrinsic::amdgcn_ds_ordered_swap: {
1415       // This is only allowed to execute with 1 lane, so readfirstlane is safe.
1416       assert(empty(OpdMapper.getVRegs(0)));
1417       substituteSimpleCopyRegs(OpdMapper, 3);
1418       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
1419       return;
1420     }
1421     case Intrinsic::amdgcn_s_sendmsg:
1422     case Intrinsic::amdgcn_s_sendmsghalt: {
1423       // FIXME: Should this use a waterfall loop?
1424       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
1425       return;
1426     }
1427     default:
1428       break;
1429     }
1430     break;
1431   }
1432   case AMDGPU::G_LOAD:
1433   case AMDGPU::G_ZEXTLOAD:
1434   case AMDGPU::G_SEXTLOAD: {
1435     if (applyMappingWideLoad(MI, OpdMapper, MRI))
1436       return;
1437     break;
1438   }
1439   default:
1440     break;
1441   }
1442 
1443   return applyDefaultMapping(OpdMapper);
1444 }
1445 
1446 bool AMDGPURegisterBankInfo::isSALUMapping(const MachineInstr &MI) const {
1447   const MachineFunction &MF = *MI.getParent()->getParent();
1448   const MachineRegisterInfo &MRI = MF.getRegInfo();
1449   for (unsigned i = 0, e = MI.getNumOperands();i != e; ++i) {
1450     if (!MI.getOperand(i).isReg())
1451       continue;
1452     Register Reg = MI.getOperand(i).getReg();
1453     if (const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI)) {
1454       if (Bank->getID() == AMDGPU::VGPRRegBankID)
1455         return false;
1456 
1457       assert(Bank->getID() == AMDGPU::SGPRRegBankID ||
1458              Bank->getID() == AMDGPU::SCCRegBankID);
1459     }
1460   }
1461   return true;
1462 }
1463 
1464 const RegisterBankInfo::InstructionMapping &
1465 AMDGPURegisterBankInfo::getDefaultMappingSOP(const MachineInstr &MI) const {
1466   const MachineFunction &MF = *MI.getParent()->getParent();
1467   const MachineRegisterInfo &MRI = MF.getRegInfo();
1468   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1469 
1470   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
1471     unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI);
1472     unsigned BankID = Size == 1 ? AMDGPU::SCCRegBankID : AMDGPU::SGPRRegBankID;
1473     OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size);
1474   }
1475   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
1476                                MI.getNumOperands());
1477 }
1478 
1479 const RegisterBankInfo::InstructionMapping &
1480 AMDGPURegisterBankInfo::getDefaultMappingVOP(const MachineInstr &MI) const {
1481   const MachineFunction &MF = *MI.getParent()->getParent();
1482   const MachineRegisterInfo &MRI = MF.getRegInfo();
1483   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1484   unsigned OpdIdx = 0;
1485 
1486   unsigned Size0 = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1487   OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0);
1488 
1489   if (MI.getOperand(OpdIdx).isIntrinsicID())
1490     OpdsMapping[OpdIdx++] = nullptr;
1491 
1492   Register Reg1 = MI.getOperand(OpdIdx).getReg();
1493   unsigned Size1 = getSizeInBits(Reg1, MRI, *TRI);
1494 
1495   unsigned DefaultBankID = Size1 == 1 ?
1496     AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID;
1497   unsigned Bank1 = getRegBankID(Reg1, MRI, *TRI, DefaultBankID);
1498 
1499   OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(Bank1, Size1);
1500 
1501   for (unsigned e = MI.getNumOperands(); OpdIdx != e; ++OpdIdx) {
1502     const MachineOperand &MO = MI.getOperand(OpdIdx);
1503     if (!MO.isReg())
1504       continue;
1505 
1506     unsigned Size = getSizeInBits(MO.getReg(), MRI, *TRI);
1507     unsigned BankID = Size == 1 ? AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID;
1508     OpdsMapping[OpdIdx] = AMDGPU::getValueMapping(BankID, Size);
1509   }
1510 
1511   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
1512                                MI.getNumOperands());
1513 }
1514 
1515 const RegisterBankInfo::InstructionMapping &
1516 AMDGPURegisterBankInfo::getDefaultMappingAllVGPR(const MachineInstr &MI) const {
1517   const MachineFunction &MF = *MI.getParent()->getParent();
1518   const MachineRegisterInfo &MRI = MF.getRegInfo();
1519   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1520 
1521   for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {
1522     const MachineOperand &Op = MI.getOperand(I);
1523     if (!Op.isReg())
1524       continue;
1525 
1526     unsigned Size = getSizeInBits(Op.getReg(), MRI, *TRI);
1527     OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1528   }
1529 
1530   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
1531                                MI.getNumOperands());
1532 }
1533 
1534 const RegisterBankInfo::InstructionMapping &
1535 AMDGPURegisterBankInfo::getInstrMappingForLoad(const MachineInstr &MI) const {
1536 
1537   const MachineFunction &MF = *MI.getParent()->getParent();
1538   const MachineRegisterInfo &MRI = MF.getRegInfo();
1539   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1540   unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1541   LLT LoadTy = MRI.getType(MI.getOperand(0).getReg());
1542   Register PtrReg = MI.getOperand(1).getReg();
1543   LLT PtrTy = MRI.getType(PtrReg);
1544   unsigned AS = PtrTy.getAddressSpace();
1545   unsigned PtrSize = PtrTy.getSizeInBits();
1546 
1547   const ValueMapping *ValMapping;
1548   const ValueMapping *PtrMapping;
1549 
1550   if (isInstrUniformNonExtLoadAlign4(MI) &&
1551       (AS != AMDGPUAS::LOCAL_ADDRESS && AS != AMDGPUAS::REGION_ADDRESS)) {
1552     // We have a uniform instruction so we want to use an SMRD load
1553     ValMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1554     PtrMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize);
1555   } else {
1556     ValMapping = AMDGPU::getValueMappingLoadSGPROnly(AMDGPU::VGPRRegBankID, LoadTy);
1557     PtrMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize);
1558   }
1559 
1560   OpdsMapping[0] = ValMapping;
1561   OpdsMapping[1] = PtrMapping;
1562   const RegisterBankInfo::InstructionMapping &Mapping = getInstructionMapping(
1563       1, 1, getOperandsMapping(OpdsMapping), MI.getNumOperands());
1564   return Mapping;
1565 
1566   // FIXME: Do we want to add a mapping for FLAT load, or should we just
1567   // handle that during instruction selection?
1568 }
1569 
1570 unsigned
1571 AMDGPURegisterBankInfo::getRegBankID(Register Reg,
1572                                      const MachineRegisterInfo &MRI,
1573                                      const TargetRegisterInfo &TRI,
1574                                      unsigned Default) const {
1575 
1576   const RegisterBank *Bank = getRegBank(Reg, MRI, TRI);
1577   return Bank ? Bank->getID() : Default;
1578 }
1579 
1580 static unsigned regBankUnion(unsigned RB0, unsigned RB1) {
1581   return (RB0 == AMDGPU::SGPRRegBankID && RB1 == AMDGPU::SGPRRegBankID) ?
1582     AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1583 }
1584 
1585 ///
1586 /// This function must return a legal mapping, because
1587 /// AMDGPURegisterBankInfo::getInstrAlternativeMappings() is not called
1588 /// in RegBankSelect::Mode::Fast.  Any mapping that would cause a
1589 /// VGPR to SGPR generated is illegal.
1590 ///
1591 const RegisterBankInfo::InstructionMapping &
1592 AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
1593   const MachineFunction &MF = *MI.getParent()->getParent();
1594   const MachineRegisterInfo &MRI = MF.getRegInfo();
1595 
1596   if (MI.isRegSequence()) {
1597     // If any input is a VGPR, the result must be a VGPR. The default handling
1598     // assumes any copy between banks is legal.
1599     unsigned BankID = AMDGPU::SGPRRegBankID;
1600 
1601     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
1602       auto OpBank = getRegBankID(MI.getOperand(I).getReg(), MRI, *TRI);
1603       // It doesn't make sense to use vcc or scc banks here, so just ignore
1604       // them.
1605       if (OpBank != AMDGPU::SGPRRegBankID) {
1606         BankID = AMDGPU::VGPRRegBankID;
1607         break;
1608       }
1609     }
1610     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1611 
1612     const ValueMapping &ValMap = getValueMapping(0, Size, getRegBank(BankID));
1613     return getInstructionMapping(
1614         1, /*Cost*/ 1,
1615         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
1616   }
1617 
1618   // The default handling is broken and doesn't handle illegal SGPR->VGPR copies
1619   // properly.
1620   //
1621   // TODO: There are additional exec masking dependencies to analyze.
1622   if (MI.getOpcode() == TargetOpcode::G_PHI) {
1623     // TODO: Generate proper invalid bank enum.
1624     int ResultBank = -1;
1625 
1626     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
1627       Register Reg = MI.getOperand(I).getReg();
1628       const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI);
1629 
1630       // FIXME: Assuming VGPR for any undetermined inputs.
1631       if (!Bank || Bank->getID() == AMDGPU::VGPRRegBankID) {
1632         ResultBank = AMDGPU::VGPRRegBankID;
1633         break;
1634       }
1635 
1636       unsigned OpBank = Bank->getID();
1637       // scc, scc -> sgpr
1638       if (OpBank == AMDGPU::SCCRegBankID) {
1639         // There's only one SCC register, so a phi requires copying to SGPR.
1640         OpBank = AMDGPU::SGPRRegBankID;
1641       } else if (OpBank == AMDGPU::VCCRegBankID) {
1642         // vcc, vcc -> vcc
1643         // vcc, sgpr -> vgpr
1644         if (ResultBank != -1 && ResultBank != AMDGPU::VCCRegBankID) {
1645           ResultBank = AMDGPU::VGPRRegBankID;
1646           break;
1647         }
1648       }
1649 
1650       ResultBank = OpBank;
1651     }
1652 
1653     assert(ResultBank != -1);
1654 
1655     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1656 
1657     const ValueMapping &ValMap =
1658         getValueMapping(0, Size, getRegBank(ResultBank));
1659     return getInstructionMapping(
1660         1, /*Cost*/ 1,
1661         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
1662   }
1663 
1664   const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
1665   if (Mapping.isValid())
1666     return Mapping;
1667 
1668   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1669 
1670   switch (MI.getOpcode()) {
1671   default:
1672     return getInvalidInstructionMapping();
1673 
1674   case AMDGPU::G_AND:
1675   case AMDGPU::G_OR:
1676   case AMDGPU::G_XOR: {
1677     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1678     if (Size == 1) {
1679       const RegisterBank *DstBank
1680         = getRegBank(MI.getOperand(0).getReg(), MRI, *TRI);
1681 
1682       unsigned TargetBankID = -1;
1683       unsigned BankLHS = -1;
1684       unsigned BankRHS = -1;
1685       if (DstBank) {
1686         TargetBankID = DstBank->getID();
1687         if (DstBank == &AMDGPU::VCCRegBank) {
1688           TargetBankID = AMDGPU::VCCRegBankID;
1689           BankLHS = AMDGPU::VCCRegBankID;
1690           BankRHS = AMDGPU::VCCRegBankID;
1691         } else if (DstBank == &AMDGPU::SCCRegBank) {
1692           TargetBankID = AMDGPU::SCCRegBankID;
1693           BankLHS = AMDGPU::SGPRRegBankID;
1694           BankRHS = AMDGPU::SGPRRegBankID;
1695         } else {
1696           BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
1697                                  AMDGPU::SGPRRegBankID);
1698           BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
1699                                  AMDGPU::SGPRRegBankID);
1700         }
1701       } else {
1702         BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
1703                                AMDGPU::VCCRegBankID);
1704         BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
1705                                AMDGPU::VCCRegBankID);
1706 
1707         // Both inputs should be true booleans to produce a boolean result.
1708         if (BankLHS == AMDGPU::VGPRRegBankID || BankRHS == AMDGPU::VGPRRegBankID) {
1709           TargetBankID = AMDGPU::VGPRRegBankID;
1710         } else if (BankLHS == AMDGPU::VCCRegBankID || BankRHS == AMDGPU::VCCRegBankID) {
1711           TargetBankID = AMDGPU::VCCRegBankID;
1712           BankLHS = AMDGPU::VCCRegBankID;
1713           BankRHS = AMDGPU::VCCRegBankID;
1714         } else if (BankLHS == AMDGPU::SGPRRegBankID && BankRHS == AMDGPU::SGPRRegBankID) {
1715           TargetBankID = AMDGPU::SGPRRegBankID;
1716         } else if (BankLHS == AMDGPU::SCCRegBankID || BankRHS == AMDGPU::SCCRegBankID) {
1717           // The operation must be done on a 32-bit register, but it will set
1718           // scc. The result type could interchangably be SCC or SGPR, since
1719           // both values will be produced.
1720           TargetBankID = AMDGPU::SCCRegBankID;
1721           BankLHS = AMDGPU::SGPRRegBankID;
1722           BankRHS = AMDGPU::SGPRRegBankID;
1723         }
1724       }
1725 
1726       OpdsMapping[0] = AMDGPU::getValueMapping(TargetBankID, Size);
1727       OpdsMapping[1] = AMDGPU::getValueMapping(BankLHS, Size);
1728       OpdsMapping[2] = AMDGPU::getValueMapping(BankRHS, Size);
1729       break;
1730     }
1731 
1732     if (Size == 64) {
1733 
1734       if (isSALUMapping(MI)) {
1735         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size);
1736         OpdsMapping[1] = OpdsMapping[2] = OpdsMapping[0];
1737       } else {
1738         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size);
1739         unsigned Bank1 = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI/*, DefaultBankID*/);
1740         OpdsMapping[1] = AMDGPU::getValueMapping(Bank1, Size);
1741 
1742         unsigned Bank2 = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI/*, DefaultBankID*/);
1743         OpdsMapping[2] = AMDGPU::getValueMapping(Bank2, Size);
1744       }
1745 
1746       break;
1747     }
1748 
1749     LLVM_FALLTHROUGH;
1750   }
1751 
1752   case AMDGPU::G_GEP:
1753   case AMDGPU::G_ADD:
1754   case AMDGPU::G_SUB:
1755   case AMDGPU::G_MUL:
1756   case AMDGPU::G_SHL:
1757   case AMDGPU::G_LSHR:
1758   case AMDGPU::G_ASHR:
1759   case AMDGPU::G_UADDO:
1760   case AMDGPU::G_SADDO:
1761   case AMDGPU::G_USUBO:
1762   case AMDGPU::G_SSUBO:
1763   case AMDGPU::G_UADDE:
1764   case AMDGPU::G_SADDE:
1765   case AMDGPU::G_USUBE:
1766   case AMDGPU::G_SSUBE:
1767   case AMDGPU::G_UMULH:
1768   case AMDGPU::G_SMULH:
1769   case AMDGPU::G_SMIN:
1770   case AMDGPU::G_SMAX:
1771   case AMDGPU::G_UMIN:
1772   case AMDGPU::G_UMAX:
1773     if (isSALUMapping(MI))
1774       return getDefaultMappingSOP(MI);
1775     LLVM_FALLTHROUGH;
1776 
1777   case AMDGPU::G_FADD:
1778   case AMDGPU::G_FSUB:
1779   case AMDGPU::G_FPTOSI:
1780   case AMDGPU::G_FPTOUI:
1781   case AMDGPU::G_FMUL:
1782   case AMDGPU::G_FMA:
1783   case AMDGPU::G_FMAD:
1784   case AMDGPU::G_FSQRT:
1785   case AMDGPU::G_FFLOOR:
1786   case AMDGPU::G_SITOFP:
1787   case AMDGPU::G_UITOFP:
1788   case AMDGPU::G_FPTRUNC:
1789   case AMDGPU::G_FPEXT:
1790   case AMDGPU::G_FEXP2:
1791   case AMDGPU::G_FLOG2:
1792   case AMDGPU::G_FMINNUM:
1793   case AMDGPU::G_FMAXNUM:
1794   case AMDGPU::G_FMINNUM_IEEE:
1795   case AMDGPU::G_FMAXNUM_IEEE:
1796   case AMDGPU::G_FCANONICALIZE:
1797   case AMDGPU::G_INTRINSIC_TRUNC:
1798   case AMDGPU::G_INTRINSIC_ROUND:
1799     return getDefaultMappingVOP(MI);
1800   case AMDGPU::G_IMPLICIT_DEF: {
1801     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1802     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1803     break;
1804   }
1805   case AMDGPU::G_FCONSTANT:
1806   case AMDGPU::G_CONSTANT:
1807   case AMDGPU::G_FRAME_INDEX:
1808   case AMDGPU::G_GLOBAL_VALUE:
1809   case AMDGPU::G_BLOCK_ADDR: {
1810     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1811     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1812     break;
1813   }
1814   case AMDGPU::G_INSERT: {
1815     unsigned BankID = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
1816                                           AMDGPU::VGPRRegBankID;
1817     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1818     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
1819     unsigned EltSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI);
1820     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
1821     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
1822     OpdsMapping[2] = AMDGPU::getValueMapping(BankID, EltSize);
1823     OpdsMapping[3] = nullptr;
1824     break;
1825   }
1826   case AMDGPU::G_EXTRACT: {
1827     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
1828     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1829     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
1830     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
1831     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
1832     OpdsMapping[2] = nullptr;
1833     break;
1834   }
1835   case AMDGPU::G_BUILD_VECTOR:
1836   case AMDGPU::G_BUILD_VECTOR_TRUNC: {
1837     LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
1838     if (DstTy == LLT::vector(2, 16)) {
1839       unsigned DstSize = DstTy.getSizeInBits();
1840       unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1841       unsigned Src0BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
1842       unsigned Src1BankID = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1843       unsigned DstBankID = regBankUnion(Src0BankID, Src1BankID);
1844 
1845       OpdsMapping[0] = AMDGPU::getValueMapping(DstBankID, DstSize);
1846       OpdsMapping[1] = AMDGPU::getValueMapping(Src0BankID, SrcSize);
1847       OpdsMapping[2] = AMDGPU::getValueMapping(Src1BankID, SrcSize);
1848       break;
1849     }
1850 
1851     LLVM_FALLTHROUGH;
1852   }
1853   case AMDGPU::G_MERGE_VALUES:
1854   case AMDGPU::G_CONCAT_VECTORS: {
1855     unsigned Bank = isSALUMapping(MI) ?
1856       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1857     unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1858     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1859 
1860     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
1861     // Op1 and Dst should use the same register bank.
1862     for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i)
1863       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, SrcSize);
1864     break;
1865   }
1866   case AMDGPU::G_BITCAST:
1867   case AMDGPU::G_INTTOPTR:
1868   case AMDGPU::G_PTRTOINT:
1869   case AMDGPU::G_CTLZ:
1870   case AMDGPU::G_CTLZ_ZERO_UNDEF:
1871   case AMDGPU::G_CTTZ:
1872   case AMDGPU::G_CTTZ_ZERO_UNDEF:
1873   case AMDGPU::G_CTPOP:
1874   case AMDGPU::G_BSWAP:
1875   case AMDGPU::G_BITREVERSE:
1876   case AMDGPU::G_FABS:
1877   case AMDGPU::G_FNEG: {
1878     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1879     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
1880     OpdsMapping[0] = OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size);
1881     break;
1882   }
1883   case AMDGPU::G_TRUNC: {
1884     Register Dst = MI.getOperand(0).getReg();
1885     Register Src = MI.getOperand(1).getReg();
1886     unsigned Bank = getRegBankID(Src, MRI, *TRI);
1887     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
1888     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
1889     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
1890     OpdsMapping[1] = AMDGPU::getValueMapping(Bank, SrcSize);
1891     break;
1892   }
1893   case AMDGPU::G_ZEXT:
1894   case AMDGPU::G_SEXT:
1895   case AMDGPU::G_ANYEXT: {
1896     Register Dst = MI.getOperand(0).getReg();
1897     Register Src = MI.getOperand(1).getReg();
1898     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
1899     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
1900 
1901     unsigned DstBank;
1902     const RegisterBank *SrcBank = getRegBank(Src, MRI, *TRI);
1903     assert(SrcBank);
1904     switch (SrcBank->getID()) {
1905     case AMDGPU::SCCRegBankID:
1906     case AMDGPU::SGPRRegBankID:
1907       DstBank = AMDGPU::SGPRRegBankID;
1908       break;
1909     default:
1910       DstBank = AMDGPU::VGPRRegBankID;
1911       break;
1912     }
1913 
1914     // TODO: Should anyext be split into 32-bit part as well?
1915     if (MI.getOpcode() == AMDGPU::G_ANYEXT) {
1916       OpdsMapping[0] = AMDGPU::getValueMapping(DstBank, DstSize);
1917       OpdsMapping[1] = AMDGPU::getValueMapping(SrcBank->getID(), SrcSize);
1918     } else {
1919       // Scalar extend can use 64-bit BFE, but VGPRs require extending to
1920       // 32-bits, and then to 64.
1921       OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(DstBank, DstSize);
1922       OpdsMapping[1] = AMDGPU::getValueMappingSGPR64Only(SrcBank->getID(),
1923                                                          SrcSize);
1924     }
1925     break;
1926   }
1927   case AMDGPU::G_FCMP: {
1928     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1929     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1930     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
1931     OpdsMapping[1] = nullptr; // Predicate Operand.
1932     OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size);
1933     OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1934     break;
1935   }
1936   case AMDGPU::G_STORE: {
1937     assert(MI.getOperand(0).isReg());
1938     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1939     // FIXME: We need to specify a different reg bank once scalar stores
1940     // are supported.
1941     const ValueMapping *ValMapping =
1942         AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1943     // FIXME: Depending on the type of store, the pointer could be in
1944     // the SGPR Reg bank.
1945     // FIXME: Pointer size should be based on the address space.
1946     const ValueMapping *PtrMapping =
1947         AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64);
1948 
1949     OpdsMapping[0] = ValMapping;
1950     OpdsMapping[1] = PtrMapping;
1951     break;
1952   }
1953 
1954   case AMDGPU::G_ICMP: {
1955     auto Pred = static_cast<CmpInst::Predicate>(MI.getOperand(1).getPredicate());
1956     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1957     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1958     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
1959 
1960     bool CanUseSCC = Op2Bank == AMDGPU::SGPRRegBankID &&
1961                      Op3Bank == AMDGPU::SGPRRegBankID &&
1962       (Size == 32 || (Size == 64 &&
1963                       (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) &&
1964                       MF.getSubtarget<GCNSubtarget>().hasScalarCompareEq64()));
1965 
1966     unsigned Op0Bank = CanUseSCC ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID;
1967 
1968     OpdsMapping[0] = AMDGPU::getValueMapping(Op0Bank, 1);
1969     OpdsMapping[1] = nullptr; // Predicate Operand.
1970     OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size);
1971     OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size);
1972     break;
1973   }
1974   case AMDGPU::G_EXTRACT_VECTOR_ELT: {
1975     unsigned OutputBankID = isSALUMapping(MI) ?
1976                             AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1977     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1978     unsigned IdxSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1979     unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1980 
1981     OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, SrcSize);
1982     OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, SrcSize);
1983 
1984     // The index can be either if the source vector is VGPR.
1985     OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, IdxSize);
1986     break;
1987   }
1988   case AMDGPU::G_INSERT_VECTOR_ELT: {
1989     unsigned OutputBankID = isSALUMapping(MI) ?
1990       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1991 
1992     unsigned VecSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1993     unsigned InsertSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1994     unsigned IdxSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
1995     unsigned InsertEltBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1996     unsigned IdxBank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
1997 
1998     OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, VecSize);
1999     OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, VecSize);
2000     OpdsMapping[2] = AMDGPU::getValueMapping(InsertEltBank, InsertSize);
2001 
2002     // The index can be either if the source vector is VGPR.
2003     OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
2004     break;
2005   }
2006   case AMDGPU::G_UNMERGE_VALUES: {
2007     unsigned Bank = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
2008       AMDGPU::VGPRRegBankID;
2009 
2010     // Op1 and Dst should use the same register bank.
2011     // FIXME: Shouldn't this be the default? Why do we need to handle this?
2012     for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
2013       unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI);
2014       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, Size);
2015     }
2016     break;
2017   }
2018   case AMDGPU::G_INTRINSIC: {
2019     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
2020     default:
2021       return getInvalidInstructionMapping();
2022     case Intrinsic::amdgcn_div_fmas:
2023     case Intrinsic::amdgcn_trig_preop:
2024     case Intrinsic::amdgcn_sin:
2025     case Intrinsic::amdgcn_cos:
2026     case Intrinsic::amdgcn_log_clamp:
2027     case Intrinsic::amdgcn_rcp:
2028     case Intrinsic::amdgcn_rcp_legacy:
2029     case Intrinsic::amdgcn_rsq:
2030     case Intrinsic::amdgcn_rsq_legacy:
2031     case Intrinsic::amdgcn_rsq_clamp:
2032     case Intrinsic::amdgcn_ldexp:
2033     case Intrinsic::amdgcn_frexp_mant:
2034     case Intrinsic::amdgcn_frexp_exp:
2035     case Intrinsic::amdgcn_fract:
2036     case Intrinsic::amdgcn_cvt_pkrtz:
2037     case Intrinsic::amdgcn_cvt_pknorm_i16:
2038     case Intrinsic::amdgcn_cvt_pknorm_u16:
2039     case Intrinsic::amdgcn_cvt_pk_i16:
2040     case Intrinsic::amdgcn_cvt_pk_u16:
2041     case Intrinsic::amdgcn_fmed3:
2042     case Intrinsic::amdgcn_cubeid:
2043     case Intrinsic::amdgcn_cubema:
2044     case Intrinsic::amdgcn_cubesc:
2045     case Intrinsic::amdgcn_cubetc:
2046     case Intrinsic::amdgcn_sffbh:
2047     case Intrinsic::amdgcn_fmad_ftz:
2048     case Intrinsic::amdgcn_mbcnt_lo:
2049     case Intrinsic::amdgcn_mbcnt_hi:
2050     case Intrinsic::amdgcn_ubfe:
2051     case Intrinsic::amdgcn_sbfe:
2052     case Intrinsic::amdgcn_lerp:
2053     case Intrinsic::amdgcn_sad_u8:
2054     case Intrinsic::amdgcn_msad_u8:
2055     case Intrinsic::amdgcn_sad_hi_u8:
2056     case Intrinsic::amdgcn_sad_u16:
2057     case Intrinsic::amdgcn_qsad_pk_u16_u8:
2058     case Intrinsic::amdgcn_mqsad_pk_u16_u8:
2059     case Intrinsic::amdgcn_mqsad_u32_u8:
2060     case Intrinsic::amdgcn_cvt_pk_u8_f32:
2061     case Intrinsic::amdgcn_alignbit:
2062     case Intrinsic::amdgcn_alignbyte:
2063     case Intrinsic::amdgcn_fdot2:
2064     case Intrinsic::amdgcn_sdot2:
2065     case Intrinsic::amdgcn_udot2:
2066     case Intrinsic::amdgcn_sdot4:
2067     case Intrinsic::amdgcn_udot4:
2068     case Intrinsic::amdgcn_sdot8:
2069     case Intrinsic::amdgcn_udot8:
2070     case Intrinsic::amdgcn_wwm:
2071     case Intrinsic::amdgcn_wqm:
2072       return getDefaultMappingVOP(MI);
2073     case Intrinsic::amdgcn_ds_permute:
2074     case Intrinsic::amdgcn_ds_bpermute:
2075     case Intrinsic::amdgcn_update_dpp:
2076       return getDefaultMappingAllVGPR(MI);
2077     case Intrinsic::amdgcn_kernarg_segment_ptr:
2078     case Intrinsic::amdgcn_s_getpc:
2079     case Intrinsic::amdgcn_groupstaticsize: {
2080       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2081       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
2082       break;
2083     }
2084     case Intrinsic::amdgcn_wqm_vote: {
2085       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2086       OpdsMapping[0] = OpdsMapping[2]
2087         = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size);
2088       break;
2089     }
2090     case Intrinsic::amdgcn_s_buffer_load: {
2091       // FIXME: This should be moved to G_INTRINSIC_W_SIDE_EFFECTS
2092       Register RSrc = MI.getOperand(2).getReg();   // SGPR
2093       Register Offset = MI.getOperand(3).getReg(); // SGPR/imm
2094 
2095       unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2096       unsigned Size2 = MRI.getType(RSrc).getSizeInBits();
2097       unsigned Size3 = MRI.getType(Offset).getSizeInBits();
2098 
2099       unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI);
2100       unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI);
2101 
2102       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size0);
2103       OpdsMapping[1] = nullptr; // intrinsic id
2104 
2105       // Lie and claim everything is legal, even though some need to be
2106       // SGPRs. applyMapping will have to deal with it as a waterfall loop.
2107       OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc
2108       OpdsMapping[3] = AMDGPU::getValueMapping(OffsetBank, Size3);
2109       OpdsMapping[4] = nullptr;
2110       break;
2111     }
2112     case Intrinsic::amdgcn_div_scale: {
2113       unsigned Dst0Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2114       unsigned Dst1Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
2115       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Dst0Size);
2116       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Dst1Size);
2117 
2118       unsigned SrcSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
2119       OpdsMapping[3] = AMDGPU::getValueMapping(
2120         getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI), SrcSize);
2121       OpdsMapping[4] = AMDGPU::getValueMapping(
2122         getRegBankID(MI.getOperand(4).getReg(), MRI, *TRI), SrcSize);
2123 
2124       break;
2125     }
2126     case Intrinsic::amdgcn_class: {
2127       Register Src0Reg = MI.getOperand(2).getReg();
2128       Register Src1Reg = MI.getOperand(3).getReg();
2129       unsigned Src0Size = MRI.getType(Src0Reg).getSizeInBits();
2130       unsigned Src1Size = MRI.getType(Src1Reg).getSizeInBits();
2131       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2132       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, DstSize);
2133       OpdsMapping[2] = AMDGPU::getValueMapping(getRegBankID(Src0Reg, MRI, *TRI),
2134                                                Src0Size);
2135       OpdsMapping[3] = AMDGPU::getValueMapping(getRegBankID(Src1Reg, MRI, *TRI),
2136                                                Src1Size);
2137       break;
2138     }
2139     case Intrinsic::amdgcn_icmp:
2140     case Intrinsic::amdgcn_fcmp: {
2141       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2142       // This is not VCCRegBank because this is not used in boolean contexts.
2143       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize);
2144       unsigned OpSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
2145       unsigned Op1Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
2146       unsigned Op2Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
2147       OpdsMapping[2] = AMDGPU::getValueMapping(Op1Bank, OpSize);
2148       OpdsMapping[3] = AMDGPU::getValueMapping(Op2Bank, OpSize);
2149       break;
2150     }
2151     case Intrinsic::amdgcn_readlane: {
2152       // This must be an SGPR, but accept a VGPR.
2153       Register IdxReg = MI.getOperand(3).getReg();
2154       unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits();
2155       unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
2156       OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
2157       LLVM_FALLTHROUGH;
2158     }
2159     case Intrinsic::amdgcn_readfirstlane: {
2160       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2161       unsigned SrcSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
2162       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize);
2163       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
2164       break;
2165     }
2166     case Intrinsic::amdgcn_writelane: {
2167       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2168       Register SrcReg = MI.getOperand(2).getReg();
2169       unsigned SrcSize = MRI.getType(SrcReg).getSizeInBits();
2170       unsigned SrcBank = getRegBankID(SrcReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
2171       Register IdxReg = MI.getOperand(3).getReg();
2172       unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits();
2173       unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
2174       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
2175 
2176       // These 2 must be SGPRs, but accept VGPRs. Readfirstlane will be inserted
2177       // to legalize.
2178       OpdsMapping[2] = AMDGPU::getValueMapping(SrcBank, SrcSize);
2179       OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
2180       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
2181       break;
2182     }
2183     case Intrinsic::amdgcn_if_break: {
2184       unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
2185       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
2186       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
2187       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
2188       break;
2189     }
2190     }
2191     break;
2192   }
2193   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
2194     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
2195     default:
2196       return getInvalidInstructionMapping();
2197     case Intrinsic::amdgcn_s_getreg:
2198     case Intrinsic::amdgcn_s_memtime:
2199     case Intrinsic::amdgcn_s_memrealtime:
2200     case Intrinsic::amdgcn_s_get_waveid_in_workgroup: {
2201       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2202       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
2203       break;
2204     }
2205     case Intrinsic::amdgcn_ds_append:
2206     case Intrinsic::amdgcn_ds_consume:
2207     case Intrinsic::amdgcn_ds_fadd:
2208     case Intrinsic::amdgcn_ds_fmin:
2209     case Intrinsic::amdgcn_ds_fmax:
2210     case Intrinsic::amdgcn_atomic_inc:
2211     case Intrinsic::amdgcn_atomic_dec:
2212       return getDefaultMappingAllVGPR(MI);
2213     case Intrinsic::amdgcn_ds_ordered_add:
2214     case Intrinsic::amdgcn_ds_ordered_swap: {
2215       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2216       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
2217       unsigned M0Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
2218                                  AMDGPU::SGPRRegBankID);
2219       OpdsMapping[2] = AMDGPU::getValueMapping(M0Bank, 32);
2220       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2221       break;
2222     }
2223     case Intrinsic::amdgcn_exp_compr:
2224       OpdsMapping[0] = nullptr; // IntrinsicID
2225       // FIXME: These are immediate values which can't be read from registers.
2226       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2227       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2228       // FIXME: Could we support packed types here?
2229       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2230       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2231       // FIXME: These are immediate values which can't be read from registers.
2232       OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2233       OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2234       break;
2235     case Intrinsic::amdgcn_exp:
2236       OpdsMapping[0] = nullptr; // IntrinsicID
2237       // FIXME: These are immediate values which can't be read from registers.
2238       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2239       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2240       // FIXME: Could we support packed types here?
2241       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2242       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2243       OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2244       OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
2245       // FIXME: These are immediate values which can't be read from registers.
2246       OpdsMapping[7] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2247       OpdsMapping[8] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
2248       break;
2249     case Intrinsic::amdgcn_buffer_load: {
2250       Register RSrc = MI.getOperand(2).getReg();   // SGPR
2251       Register VIndex = MI.getOperand(3).getReg(); // VGPR
2252       Register Offset = MI.getOperand(4).getReg(); // SGPR/VGPR/imm
2253 
2254       unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2255       unsigned Size2 = MRI.getType(RSrc).getSizeInBits();
2256       unsigned Size3 = MRI.getType(VIndex).getSizeInBits();
2257       unsigned Size4 = MRI.getType(Offset).getSizeInBits();
2258 
2259       unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI);
2260       unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI);
2261 
2262       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0);
2263       OpdsMapping[1] = nullptr; // intrinsic id
2264 
2265       // Lie and claim everything is legal, even though some need to be
2266       // SGPRs. applyMapping will have to deal with it as a waterfall loop.
2267       OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc
2268       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size3);
2269       OpdsMapping[4] = AMDGPU::getValueMapping(OffsetBank, Size4);
2270       OpdsMapping[5] = nullptr;
2271       OpdsMapping[6] = nullptr;
2272       break;
2273     }
2274     case Intrinsic::amdgcn_s_sendmsg:
2275     case Intrinsic::amdgcn_s_sendmsghalt: {
2276       // This must be an SGPR, but accept a VGPR.
2277       unsigned Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
2278                                    AMDGPU::SGPRRegBankID);
2279       OpdsMapping[1] = AMDGPU::getValueMapping(Bank, 32);
2280       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, 32);
2281       break;
2282     }
2283     case Intrinsic::amdgcn_end_cf: {
2284       unsigned Size = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
2285       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
2286       break;
2287     }
2288     case Intrinsic::amdgcn_else: {
2289       unsigned WaveSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
2290       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
2291       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize);
2292       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize);
2293       break;
2294     }
2295     }
2296     break;
2297   }
2298   case AMDGPU::G_SELECT: {
2299     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
2300     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
2301                                     AMDGPU::SGPRRegBankID);
2302     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI,
2303                                     AMDGPU::SGPRRegBankID);
2304     bool SGPRSrcs = Op2Bank == AMDGPU::SGPRRegBankID &&
2305                     Op3Bank == AMDGPU::SGPRRegBankID;
2306 
2307     unsigned CondBankDefault = SGPRSrcs ?
2308       AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID;
2309     unsigned CondBank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
2310                                      CondBankDefault);
2311     if (CondBank == AMDGPU::SGPRRegBankID)
2312       CondBank = SGPRSrcs ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID;
2313     else if (CondBank == AMDGPU::VGPRRegBankID)
2314       CondBank = AMDGPU::VCCRegBankID;
2315 
2316     unsigned Bank = SGPRSrcs && CondBank == AMDGPU::SCCRegBankID ?
2317       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
2318 
2319     assert(CondBank == AMDGPU::VCCRegBankID || CondBank == AMDGPU::SCCRegBankID);
2320 
2321     if (Size == 64) {
2322       OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
2323       OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1);
2324       OpdsMapping[2] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
2325       OpdsMapping[3] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
2326     } else {
2327       OpdsMapping[0] = AMDGPU::getValueMapping(Bank, Size);
2328       OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1);
2329       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, Size);
2330       OpdsMapping[3] = AMDGPU::getValueMapping(Bank, Size);
2331     }
2332 
2333     break;
2334   }
2335 
2336   case AMDGPU::G_LOAD:
2337   case AMDGPU::G_ZEXTLOAD:
2338   case AMDGPU::G_SEXTLOAD:
2339     return getInstrMappingForLoad(MI);
2340 
2341   case AMDGPU::G_ATOMICRMW_XCHG:
2342   case AMDGPU::G_ATOMICRMW_ADD:
2343   case AMDGPU::G_ATOMICRMW_SUB:
2344   case AMDGPU::G_ATOMICRMW_AND:
2345   case AMDGPU::G_ATOMICRMW_OR:
2346   case AMDGPU::G_ATOMICRMW_XOR:
2347   case AMDGPU::G_ATOMICRMW_MAX:
2348   case AMDGPU::G_ATOMICRMW_MIN:
2349   case AMDGPU::G_ATOMICRMW_UMAX:
2350   case AMDGPU::G_ATOMICRMW_UMIN:
2351   case AMDGPU::G_ATOMICRMW_FADD:
2352   case AMDGPU::G_ATOMIC_CMPXCHG: {
2353     return getDefaultMappingAllVGPR(MI);
2354   }
2355   case AMDGPU::G_BRCOND: {
2356     unsigned Bank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI,
2357                                  AMDGPU::SGPRRegBankID);
2358     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
2359     if (Bank != AMDGPU::SCCRegBankID)
2360       Bank = AMDGPU::VCCRegBankID;
2361 
2362     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, 1);
2363     break;
2364   }
2365   }
2366 
2367   return getInstructionMapping(/*ID*/1, /*Cost*/1,
2368                                getOperandsMapping(OpdsMapping),
2369                                MI.getNumOperands());
2370 }
2371 
2372