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 "SIMachineFunctionInfo.h"
18 #include "SIRegisterInfo.h"
19 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
20 #include "llvm/ADT/SmallSet.h"
21 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
22 #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
23 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
24 #include "llvm/CodeGen/TargetRegisterInfo.h"
25 #include "llvm/CodeGen/TargetSubtargetInfo.h"
26 #include "llvm/IR/Constants.h"
27 
28 #define GET_TARGET_REGBANK_IMPL
29 #include "AMDGPUGenRegisterBank.inc"
30 
31 // This file will be TableGen'ed at some point.
32 #include "AMDGPUGenRegisterBankInfo.def"
33 
34 using namespace llvm;
35 
36 AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI)
37     : AMDGPUGenRegisterBankInfo(),
38       TRI(static_cast<const SIRegisterInfo*>(&TRI)) {
39 
40   // HACK: Until this is fully tablegen'd.
41   static bool AlreadyInit = false;
42   if (AlreadyInit)
43     return;
44 
45   AlreadyInit = true;
46 
47   const RegisterBank &RBSGPR = getRegBank(AMDGPU::SGPRRegBankID);
48   (void)RBSGPR;
49   assert(&RBSGPR == &AMDGPU::SGPRRegBank);
50 
51   const RegisterBank &RBVGPR = getRegBank(AMDGPU::VGPRRegBankID);
52   (void)RBVGPR;
53   assert(&RBVGPR == &AMDGPU::VGPRRegBank);
54 
55 }
56 
57 unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst,
58                                           const RegisterBank &Src,
59                                           unsigned Size) const {
60   if (Dst.getID() == AMDGPU::SGPRRegBankID &&
61       Src.getID() == AMDGPU::VGPRRegBankID) {
62     return std::numeric_limits<unsigned>::max();
63   }
64 
65   // SGPRRegBank with size 1 is actually vcc or another 64-bit sgpr written by
66   // the valu.
67   if (Size == 1 && Dst.getID() == AMDGPU::SCCRegBankID &&
68       (Src.getID() == AMDGPU::SGPRRegBankID ||
69        Src.getID() == AMDGPU::VGPRRegBankID ||
70        Src.getID() == AMDGPU::VCCRegBankID))
71     return std::numeric_limits<unsigned>::max();
72 
73   if (Dst.getID() == AMDGPU::SCCRegBankID &&
74       Src.getID() == AMDGPU::VCCRegBankID)
75     return std::numeric_limits<unsigned>::max();
76 
77   return RegisterBankInfo::copyCost(Dst, Src, Size);
78 }
79 
80 unsigned AMDGPURegisterBankInfo::getBreakDownCost(
81   const ValueMapping &ValMapping,
82   const RegisterBank *CurBank) const {
83   assert(ValMapping.NumBreakDowns == 2 &&
84          ValMapping.BreakDown[0].Length == 32 &&
85          ValMapping.BreakDown[0].StartIdx == 0 &&
86          ValMapping.BreakDown[1].Length == 32 &&
87          ValMapping.BreakDown[1].StartIdx == 32 &&
88          ValMapping.BreakDown[0].RegBank == ValMapping.BreakDown[1].RegBank);
89 
90   // 32-bit extract of a 64-bit value is just access of a subregister, so free.
91   // TODO: Cost of 0 hits assert, though it's not clear it's what we really
92   // want.
93 
94   // TODO: 32-bit insert to a 64-bit SGPR may incur a non-free copy due to SGPR
95   // alignment restrictions, but this probably isn't important.
96   return 1;
97 }
98 
99 const RegisterBank &AMDGPURegisterBankInfo::getRegBankFromRegClass(
100     const TargetRegisterClass &RC) const {
101 
102   if (TRI->isSGPRClass(&RC))
103     return getRegBank(AMDGPU::SGPRRegBankID);
104 
105   return getRegBank(AMDGPU::VGPRRegBankID);
106 }
107 
108 template <unsigned NumOps>
109 RegisterBankInfo::InstructionMappings
110 AMDGPURegisterBankInfo::addMappingFromTable(
111     const MachineInstr &MI, const MachineRegisterInfo &MRI,
112     const std::array<unsigned, NumOps> RegSrcOpIdx,
113     ArrayRef<OpRegBankEntry<NumOps>> Table) const {
114 
115   InstructionMappings AltMappings;
116 
117   SmallVector<const ValueMapping *, 10> Operands(MI.getNumOperands());
118 
119   unsigned Sizes[NumOps];
120   for (unsigned I = 0; I < NumOps; ++I) {
121     unsigned Reg = MI.getOperand(RegSrcOpIdx[I]).getReg();
122     Sizes[I] = getSizeInBits(Reg, MRI, *TRI);
123   }
124 
125   for (unsigned I = 0, E = MI.getNumExplicitDefs(); I != E; ++I) {
126     unsigned SizeI = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI);
127     Operands[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SizeI);
128   }
129 
130   unsigned MappingID = 0;
131   for (const auto &Entry : Table) {
132     for (unsigned I = 0; I < NumOps; ++I) {
133       int OpIdx = RegSrcOpIdx[I];
134       Operands[OpIdx] = AMDGPU::getValueMapping(Entry.RegBanks[I], Sizes[I]);
135     }
136 
137     AltMappings.push_back(&getInstructionMapping(MappingID++, Entry.Cost,
138                                                  getOperandsMapping(Operands),
139                                                  Operands.size()));
140   }
141 
142   return AltMappings;
143 }
144 
145 RegisterBankInfo::InstructionMappings
146 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsicWSideEffects(
147     const MachineInstr &MI, const MachineRegisterInfo &MRI) const {
148 
149   switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
150   case Intrinsic::amdgcn_buffer_load: {
151     static const OpRegBankEntry<3> Table[4] = {
152       // Perfectly legal.
153       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
154       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
155 
156       // Waterfall loop needed for rsrc. In the worst case this will execute
157       // approximately an extra 10 * wavesize + 2 instructions.
158       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 },
159       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1000 }
160     };
161 
162     // rsrc, voffset, offset
163     const std::array<unsigned, 3> RegSrcOpIdx = { { 2, 3, 4 } };
164     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
165   }
166   case Intrinsic::amdgcn_s_buffer_load: {
167     static const OpRegBankEntry<2> Table[4] = {
168       // Perfectly legal.
169       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
170 
171       // Only need 1 register in loop
172       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 300 },
173 
174       // Have to waterfall the resource.
175       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 },
176 
177       // Have to waterfall the resource, and the offset.
178       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1500 }
179     };
180 
181     // rsrc, offset
182     const std::array<unsigned, 2> RegSrcOpIdx = { { 2, 3 } };
183     return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
184   }
185   default:
186     return RegisterBankInfo::getInstrAlternativeMappings(MI);
187   }
188 }
189 
190 RegisterBankInfo::InstructionMappings
191 AMDGPURegisterBankInfo::getInstrAlternativeMappings(
192     const MachineInstr &MI) const {
193 
194   const MachineFunction &MF = *MI.getParent()->getParent();
195   const MachineRegisterInfo &MRI = MF.getRegInfo();
196 
197 
198   InstructionMappings AltMappings;
199   switch (MI.getOpcode()) {
200   case TargetOpcode::G_AND:
201   case TargetOpcode::G_OR:
202   case TargetOpcode::G_XOR: {
203     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
204     if (Size != 64)
205       break;
206 
207     const InstructionMapping &SSMapping = getInstructionMapping(
208       1, 1, getOperandsMapping(
209         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
210          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
211          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
212       3); // Num Operands
213     AltMappings.push_back(&SSMapping);
214 
215     const InstructionMapping &VVMapping = getInstructionMapping(
216       2, 2, getOperandsMapping(
217         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
218          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
219          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
220       3); // Num Operands
221     AltMappings.push_back(&VVMapping);
222 
223     const InstructionMapping &SVMapping = getInstructionMapping(
224       3, 3, getOperandsMapping(
225         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
226          AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size),
227          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
228       3); // Num Operands
229     AltMappings.push_back(&SVMapping);
230 
231     // SGPR in LHS is slightly preferrable, so make it VS more expnesive than
232     // SV.
233     const InstructionMapping &VSMapping = getInstructionMapping(
234       3, 4, getOperandsMapping(
235         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
236          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
237          AMDGPU::getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size)}),
238       3); // Num Operands
239     AltMappings.push_back(&VSMapping);
240     break;
241   }
242   case TargetOpcode::G_LOAD: {
243     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
244     // FIXME: Should we be hard coding the size for these mappings?
245     const InstructionMapping &SSMapping = getInstructionMapping(
246         1, 1, getOperandsMapping(
247                   {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
248                    AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 64)}),
249         2); // Num Operands
250     AltMappings.push_back(&SSMapping);
251 
252     const InstructionMapping &VVMapping = getInstructionMapping(
253         2, 1, getOperandsMapping(
254                   {AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
255                    AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64)}),
256         2); // Num Operands
257     AltMappings.push_back(&VVMapping);
258 
259     // FIXME: Should this be the pointer-size (64-bits) or the size of the
260     // register that will hold the bufffer resourc (128-bits).
261     const InstructionMapping &VSMapping = getInstructionMapping(
262         3, 1, getOperandsMapping(
263                   {AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
264                    AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 64)}),
265         2); // Num Operands
266     AltMappings.push_back(&VSMapping);
267 
268     return AltMappings;
269 
270   }
271   case TargetOpcode::G_ICMP: {
272     unsigned Size = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI);
273     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
274       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
275                           nullptr, // Predicate operand.
276                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
277                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
278       4); // Num Operands
279     AltMappings.push_back(&SSMapping);
280 
281     const InstructionMapping &SVMapping = getInstructionMapping(2, 1,
282       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
283                           nullptr, // Predicate operand.
284                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
285                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}),
286       4); // Num Operands
287     AltMappings.push_back(&SVMapping);
288 
289     const InstructionMapping &VSMapping = getInstructionMapping(3, 1,
290       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
291                           nullptr, // Predicate operand.
292                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
293                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
294       4); // Num Operands
295     AltMappings.push_back(&VSMapping);
296 
297     const InstructionMapping &VVMapping = getInstructionMapping(4, 1,
298       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
299                           nullptr, // Predicate operand.
300                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
301                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size)}),
302       4); // Num Operands
303     AltMappings.push_back(&VVMapping);
304 
305     return AltMappings;
306   }
307   case TargetOpcode::G_SELECT: {
308     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
309     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
310       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
311                           AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
312                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
313                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
314       4); // Num Operands
315     AltMappings.push_back(&SSMapping);
316 
317     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
318       getOperandsMapping({AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
319                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
320                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
321                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
322       4); // Num Operands
323     AltMappings.push_back(&VVMapping);
324 
325     return AltMappings;
326   }
327   case TargetOpcode::G_UADDE:
328   case TargetOpcode::G_USUBE:
329   case TargetOpcode::G_SADDE:
330   case TargetOpcode::G_SSUBE: {
331     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
332     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
333       getOperandsMapping(
334         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
335          AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1),
336          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
337          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
338          AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1)}),
339       5); // Num Operands
340     AltMappings.push_back(&SSMapping);
341 
342     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
343       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
344                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
345                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
346                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
347                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1)}),
348       5); // Num Operands
349     AltMappings.push_back(&VVMapping);
350     return AltMappings;
351   }
352   case AMDGPU::G_BRCOND: {
353     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
354 
355     const InstructionMapping &SMapping = getInstructionMapping(
356       1, 1, getOperandsMapping(
357         {AMDGPU::getValueMapping(AMDGPU::SCCRegBankID, 1), nullptr}),
358       2); // Num Operands
359     AltMappings.push_back(&SMapping);
360 
361     const InstructionMapping &VMapping = getInstructionMapping(
362       1, 1, getOperandsMapping(
363         {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), nullptr }),
364       2); // Num Operands
365     AltMappings.push_back(&VMapping);
366     return AltMappings;
367   }
368   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS:
369     return getInstrAlternativeMappingsIntrinsicWSideEffects(MI, MRI);
370   default:
371     break;
372   }
373   return RegisterBankInfo::getInstrAlternativeMappings(MI);
374 }
375 
376 void AMDGPURegisterBankInfo::split64BitValueForMapping(
377   MachineIRBuilder &B,
378   SmallVector<Register, 2> &Regs,
379   LLT HalfTy,
380   unsigned Reg) const {
381   assert(HalfTy.getSizeInBits() == 32);
382   MachineRegisterInfo *MRI = B.getMRI();
383   unsigned LoLHS = MRI->createGenericVirtualRegister(HalfTy);
384   unsigned HiLHS = MRI->createGenericVirtualRegister(HalfTy);
385   const RegisterBank *Bank = getRegBank(Reg, *MRI, *TRI);
386   MRI->setRegBank(LoLHS, *Bank);
387   MRI->setRegBank(HiLHS, *Bank);
388 
389   Regs.push_back(LoLHS);
390   Regs.push_back(HiLHS);
391 
392   B.buildInstr(AMDGPU::G_UNMERGE_VALUES)
393     .addDef(LoLHS)
394     .addDef(HiLHS)
395     .addUse(Reg);
396 }
397 
398 /// Replace the current type each register in \p Regs has with \p NewTy
399 static void setRegsToType(MachineRegisterInfo &MRI, ArrayRef<Register> Regs,
400                           LLT NewTy) {
401   for (unsigned Reg : Regs) {
402     assert(MRI.getType(Reg).getSizeInBits() == NewTy.getSizeInBits());
403     MRI.setType(Reg, NewTy);
404   }
405 }
406 
407 static LLT getHalfSizedType(LLT Ty) {
408   if (Ty.isVector()) {
409     assert(Ty.getNumElements() % 2 == 0);
410     return LLT::scalarOrVector(Ty.getNumElements() / 2, Ty.getElementType());
411   }
412 
413   assert(Ty.getSizeInBits() % 2 == 0);
414   return LLT::scalar(Ty.getSizeInBits() / 2);
415 }
416 
417 /// Legalize instruction \p MI where operands in \p OpIndices must be SGPRs. If
418 /// any of the required SGPR operands are VGPRs, perform a waterfall loop to
419 /// execute the instruction for each unique combination of values in all lanes
420 /// in the wave. The block will be split such that rest of the instructions are
421 /// moved to a new block.
422 ///
423 /// Essentially performs this loop:
424 //
425 /// Save Execution Mask
426 /// For (Lane : Wavefront) {
427 ///   Enable Lane, Disable all other lanes
428 ///   SGPR = read SGPR value for current lane from VGPR
429 ///   VGPRResult[Lane] = use_op SGPR
430 /// }
431 /// Restore Execution Mask
432 ///
433 /// There is additional complexity to try for compare values to identify the
434 /// unique values used.
435 void AMDGPURegisterBankInfo::executeInWaterfallLoop(
436   MachineInstr &MI, MachineRegisterInfo &MRI,
437   ArrayRef<unsigned> OpIndices) const {
438   MachineFunction *MF = MI.getParent()->getParent();
439   const GCNSubtarget &ST = MF->getSubtarget<GCNSubtarget>();
440   const SIInstrInfo *TII = ST.getInstrInfo();
441   MachineBasicBlock::iterator I(MI);
442 
443   MachineBasicBlock &MBB = *MI.getParent();
444   const DebugLoc &DL = MI.getDebugLoc();
445 
446   // Use a set to avoid extra readfirstlanes in the case where multiple operands
447   // are the same register.
448   SmallSet<Register, 4> SGPROperandRegs;
449   for (unsigned Op : OpIndices) {
450     assert(MI.getOperand(Op).isUse());
451     unsigned Reg = MI.getOperand(Op).getReg();
452     const RegisterBank *OpBank = getRegBank(Reg, MRI, *TRI);
453     if (OpBank->getID() == AMDGPU::VGPRRegBankID)
454       SGPROperandRegs.insert(Reg);
455   }
456 
457   // No operands need to be replaced, so no need to loop.
458   if (SGPROperandRegs.empty())
459     return;
460 
461   MachineIRBuilder B(MI);
462   SmallVector<Register, 4> ResultRegs;
463   SmallVector<Register, 4> InitResultRegs;
464   SmallVector<Register, 4> PhiRegs;
465   for (MachineOperand &Def : MI.defs()) {
466     LLT ResTy = MRI.getType(Def.getReg());
467     const RegisterBank *DefBank = getRegBank(Def.getReg(), MRI, *TRI);
468     ResultRegs.push_back(Def.getReg());
469     unsigned InitReg = B.buildUndef(ResTy).getReg(0);
470     unsigned PhiReg = MRI.createGenericVirtualRegister(ResTy);
471     InitResultRegs.push_back(InitReg);
472     PhiRegs.push_back(PhiReg);
473     MRI.setRegBank(PhiReg, *DefBank);
474     MRI.setRegBank(InitReg, *DefBank);
475   }
476 
477   unsigned SaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
478   unsigned InitSaveExecReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
479 
480   // Don't bother using generic instructions/registers for the exec mask.
481   B.buildInstr(TargetOpcode::IMPLICIT_DEF)
482     .addDef(InitSaveExecReg);
483 
484   unsigned PhiExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
485   unsigned NewExec = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
486 
487   // To insert the loop we need to split the block. Move everything before this
488   // point to a new block, and insert a new empty block before this instruction.
489   MachineBasicBlock *LoopBB = MF->CreateMachineBasicBlock();
490   MachineBasicBlock *RemainderBB = MF->CreateMachineBasicBlock();
491   MachineBasicBlock *RestoreExecBB = MF->CreateMachineBasicBlock();
492   MachineFunction::iterator MBBI(MBB);
493   ++MBBI;
494   MF->insert(MBBI, LoopBB);
495   MF->insert(MBBI, RestoreExecBB);
496   MF->insert(MBBI, RemainderBB);
497 
498   LoopBB->addSuccessor(RestoreExecBB);
499   LoopBB->addSuccessor(LoopBB);
500 
501   // Move the rest of the block into a new block.
502   RemainderBB->transferSuccessorsAndUpdatePHIs(&MBB);
503   RemainderBB->splice(RemainderBB->begin(), &MBB, I, MBB.end());
504 
505   MBB.addSuccessor(LoopBB);
506   RestoreExecBB->addSuccessor(RemainderBB);
507 
508   B.setInsertPt(*LoopBB, LoopBB->end());
509 
510   B.buildInstr(TargetOpcode::PHI)
511     .addDef(PhiExec)
512     .addReg(InitSaveExecReg)
513     .addMBB(&MBB)
514     .addReg(NewExec)
515     .addMBB(LoopBB);
516 
517   for (auto Result : zip(InitResultRegs, ResultRegs, PhiRegs)) {
518     B.buildInstr(TargetOpcode::G_PHI)
519       .addDef(std::get<2>(Result))
520       .addReg(std::get<0>(Result)) // Initial value / implicit_def
521       .addMBB(&MBB)
522       .addReg(std::get<1>(Result)) // Mid-loop value.
523       .addMBB(LoopBB);
524   }
525 
526   // Move the instruction into the loop.
527   LoopBB->splice(LoopBB->end(), &MBB, I);
528   I = std::prev(LoopBB->end());
529 
530   B.setInstr(*I);
531 
532   unsigned CondReg = AMDGPU::NoRegister;
533 
534   for (MachineOperand &Op : MI.uses()) {
535     if (!Op.isReg())
536       continue;
537 
538     assert(!Op.isDef());
539     if (SGPROperandRegs.count(Op.getReg())) {
540       LLT OpTy = MRI.getType(Op.getReg());
541       unsigned OpSize = OpTy.getSizeInBits();
542 
543       // Can only do a readlane of 32-bit pieces.
544       if (OpSize == 32) {
545         // Avoid extra copies in the simple case of one 32-bit register.
546         unsigned CurrentLaneOpReg = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
547         MRI.setType(CurrentLaneOpReg, OpTy);
548 
549         constrainGenericRegister(Op.getReg(), AMDGPU::VGPR_32RegClass, MRI);
550         // Read the next variant <- also loop target.
551         BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32), CurrentLaneOpReg)
552           .addReg(Op.getReg());
553 
554         unsigned NewCondReg = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
555         bool First = CondReg == AMDGPU::NoRegister;
556         if (First)
557           CondReg = NewCondReg;
558 
559         // Compare the just read M0 value to all possible Idx values.
560         B.buildInstr(AMDGPU::V_CMP_EQ_U32_e64)
561           .addDef(NewCondReg)
562           .addReg(CurrentLaneOpReg)
563           .addReg(Op.getReg());
564         Op.setReg(CurrentLaneOpReg);
565 
566         if (!First) {
567           unsigned AndReg = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
568 
569           // If there are multiple operands to consider, and the conditions.
570           B.buildInstr(AMDGPU::S_AND_B64)
571             .addDef(AndReg)
572             .addReg(NewCondReg)
573             .addReg(CondReg);
574           CondReg = AndReg;
575         }
576       } else {
577         LLT S32 = LLT::scalar(32);
578         SmallVector<Register, 8> ReadlanePieces;
579 
580         // The compares can be done as 64-bit, but the extract needs to be done
581         // in 32-bit pieces.
582 
583         bool Is64 = OpSize % 64 == 0;
584 
585         LLT UnmergeTy = OpSize % 64 == 0 ? LLT::scalar(64) : LLT::scalar(32);
586         unsigned CmpOp = OpSize % 64 == 0 ? AMDGPU::V_CMP_EQ_U64_e64
587                                           : AMDGPU::V_CMP_EQ_U32_e64;
588 
589         // The compares can be done as 64-bit, but the extract needs to be done
590         // in 32-bit pieces.
591 
592         // Insert the unmerge before the loop.
593 
594         B.setMBB(MBB);
595         auto Unmerge = B.buildUnmerge(UnmergeTy, Op.getReg());
596         B.setInstr(*I);
597 
598         unsigned NumPieces = Unmerge->getNumOperands() - 1;
599         for (unsigned PieceIdx = 0; PieceIdx != NumPieces; ++PieceIdx) {
600           unsigned UnmergePiece = Unmerge.getReg(PieceIdx);
601 
602           unsigned CurrentLaneOpReg;
603           if (Is64) {
604             unsigned CurrentLaneOpRegLo = MRI.createGenericVirtualRegister(S32);
605             unsigned CurrentLaneOpRegHi = MRI.createGenericVirtualRegister(S32);
606 
607             MRI.setRegClass(UnmergePiece, &AMDGPU::VReg_64RegClass);
608             MRI.setRegClass(CurrentLaneOpRegLo, &AMDGPU::SReg_32_XM0RegClass);
609             MRI.setRegClass(CurrentLaneOpRegHi, &AMDGPU::SReg_32_XM0RegClass);
610 
611             // Read the next variant <- also loop target.
612             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
613                     CurrentLaneOpRegLo)
614               .addReg(UnmergePiece, 0, AMDGPU::sub0);
615 
616             // Read the next variant <- also loop target.
617             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
618                     CurrentLaneOpRegHi)
619               .addReg(UnmergePiece, 0, AMDGPU::sub1);
620 
621             CurrentLaneOpReg =
622                 B.buildMerge(LLT::scalar(64),
623                              {CurrentLaneOpRegLo, CurrentLaneOpRegHi})
624                     .getReg(0);
625 
626             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_64_XEXECRegClass);
627 
628             if (OpTy.getScalarSizeInBits() == 64) {
629               // If we need to produce a 64-bit element vector, so use the
630               // merged pieces
631               ReadlanePieces.push_back(CurrentLaneOpReg);
632             } else {
633               // 32-bit element type.
634               ReadlanePieces.push_back(CurrentLaneOpRegLo);
635               ReadlanePieces.push_back(CurrentLaneOpRegHi);
636             }
637           } else {
638             CurrentLaneOpReg = MRI.createGenericVirtualRegister(LLT::scalar(32));
639             MRI.setRegClass(UnmergePiece, &AMDGPU::VGPR_32RegClass);
640             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_32_XM0RegClass);
641 
642             // Read the next variant <- also loop target.
643             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
644                     CurrentLaneOpReg)
645               .addReg(UnmergePiece);
646             ReadlanePieces.push_back(CurrentLaneOpReg);
647           }
648 
649           unsigned NewCondReg
650             = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
651           bool First = CondReg == AMDGPU::NoRegister;
652           if (First)
653             CondReg = NewCondReg;
654 
655           B.buildInstr(CmpOp)
656             .addDef(NewCondReg)
657             .addReg(CurrentLaneOpReg)
658             .addReg(UnmergePiece);
659 
660           if (!First) {
661             unsigned AndReg
662               = MRI.createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass);
663 
664             // If there are multiple operands to consider, and the conditions.
665             B.buildInstr(AMDGPU::S_AND_B64)
666               .addDef(AndReg)
667               .addReg(NewCondReg)
668               .addReg(CondReg);
669             CondReg = AndReg;
670           }
671         }
672 
673         // FIXME: Build merge seems to switch to CONCAT_VECTORS but not
674         // BUILD_VECTOR
675         if (OpTy.isVector()) {
676           auto Merge = B.buildBuildVector(OpTy, ReadlanePieces);
677           Op.setReg(Merge.getReg(0));
678         } else {
679           auto Merge = B.buildMerge(OpTy, ReadlanePieces);
680           Op.setReg(Merge.getReg(0));
681         }
682 
683         MRI.setRegBank(Op.getReg(), getRegBank(AMDGPU::SGPRRegBankID));
684       }
685     }
686   }
687 
688   B.setInsertPt(*LoopBB, LoopBB->end());
689 
690   // Update EXEC, save the original EXEC value to VCC.
691   B.buildInstr(AMDGPU::S_AND_SAVEEXEC_B64)
692     .addDef(NewExec)
693     .addReg(CondReg, RegState::Kill);
694 
695   MRI.setSimpleHint(NewExec, CondReg);
696 
697   // Update EXEC, switch all done bits to 0 and all todo bits to 1.
698   B.buildInstr(AMDGPU::S_XOR_B64_term)
699     .addDef(AMDGPU::EXEC)
700     .addReg(AMDGPU::EXEC)
701     .addReg(NewExec);
702 
703   // XXX - s_xor_b64 sets scc to 1 if the result is nonzero, so can we use
704   // s_cbranch_scc0?
705 
706   // Loop back to V_READFIRSTLANE_B32 if there are still variants to cover.
707   B.buildInstr(AMDGPU::S_CBRANCH_EXECNZ)
708     .addMBB(LoopBB);
709 
710   // Save the EXEC mask before the loop.
711   BuildMI(MBB, MBB.end(), DL, TII->get(AMDGPU::S_MOV_B64_term), SaveExecReg)
712     .addReg(AMDGPU::EXEC);
713 
714   // Restore the EXEC mask after the loop.
715   B.setMBB(*RestoreExecBB);
716   B.buildInstr(AMDGPU::S_MOV_B64_term)
717     .addDef(AMDGPU::EXEC)
718     .addReg(SaveExecReg);
719 }
720 
721 void AMDGPURegisterBankInfo::applyMappingImpl(
722     const OperandsMapper &OpdMapper) const {
723   MachineInstr &MI = OpdMapper.getMI();
724   unsigned Opc = MI.getOpcode();
725   MachineRegisterInfo &MRI = OpdMapper.getMRI();
726   switch (Opc) {
727   case AMDGPU::G_SELECT: {
728     unsigned DstReg = MI.getOperand(0).getReg();
729     LLT DstTy = MRI.getType(DstReg);
730     if (DstTy.getSizeInBits() != 64)
731       break;
732 
733     LLT HalfTy = getHalfSizedType(DstTy);
734 
735     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
736     SmallVector<Register, 1> Src0Regs(OpdMapper.getVRegs(1));
737     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
738     SmallVector<Register, 2> Src2Regs(OpdMapper.getVRegs(3));
739 
740     // All inputs are SGPRs, nothing special to do.
741     if (DefRegs.empty()) {
742       assert(Src1Regs.empty() && Src2Regs.empty());
743       break;
744     }
745 
746     MachineIRBuilder B(MI);
747     if (Src0Regs.empty())
748       Src0Regs.push_back(MI.getOperand(1).getReg());
749     else {
750       assert(Src0Regs.size() == 1);
751     }
752 
753     if (Src1Regs.empty())
754       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
755     else {
756       setRegsToType(MRI, Src1Regs, HalfTy);
757     }
758 
759     if (Src2Regs.empty())
760       split64BitValueForMapping(B, Src2Regs, HalfTy, MI.getOperand(3).getReg());
761     else
762       setRegsToType(MRI, Src2Regs, HalfTy);
763 
764     setRegsToType(MRI, DefRegs, HalfTy);
765 
766     B.buildSelect(DefRegs[0], Src0Regs[0], Src1Regs[0], Src2Regs[0]);
767     B.buildSelect(DefRegs[1], Src0Regs[0], Src1Regs[1], Src2Regs[1]);
768 
769     MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID));
770     MI.eraseFromParent();
771     return;
772   }
773   case AMDGPU::G_AND:
774   case AMDGPU::G_OR:
775   case AMDGPU::G_XOR: {
776     // 64-bit and is only available on the SALU, so split into 2 32-bit ops if
777     // there is a VGPR input.
778     unsigned DstReg = MI.getOperand(0).getReg();
779     LLT DstTy = MRI.getType(DstReg);
780     if (DstTy.getSizeInBits() != 64)
781       break;
782 
783     LLT HalfTy = getHalfSizedType(DstTy);
784     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
785     SmallVector<Register, 2> Src0Regs(OpdMapper.getVRegs(1));
786     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
787 
788     // All inputs are SGPRs, nothing special to do.
789     if (DefRegs.empty()) {
790       assert(Src0Regs.empty() && Src1Regs.empty());
791       break;
792     }
793 
794     assert(DefRegs.size() == 2);
795     assert(Src0Regs.size() == Src1Regs.size() &&
796            (Src0Regs.empty() || Src0Regs.size() == 2));
797 
798     // Depending on where the source registers came from, the generic code may
799     // have decided to split the inputs already or not. If not, we still need to
800     // extract the values.
801     MachineIRBuilder B(MI);
802 
803     if (Src0Regs.empty())
804       split64BitValueForMapping(B, Src0Regs, HalfTy, MI.getOperand(1).getReg());
805     else
806       setRegsToType(MRI, Src0Regs, HalfTy);
807 
808     if (Src1Regs.empty())
809       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
810     else
811       setRegsToType(MRI, Src1Regs, HalfTy);
812 
813     setRegsToType(MRI, DefRegs, HalfTy);
814 
815     B.buildInstr(Opc)
816       .addDef(DefRegs[0])
817       .addUse(Src0Regs[0])
818       .addUse(Src1Regs[0]);
819 
820     B.buildInstr(Opc)
821       .addDef(DefRegs[1])
822       .addUse(Src0Regs[1])
823       .addUse(Src1Regs[1]);
824 
825     MRI.setRegBank(DstReg, getRegBank(AMDGPU::VGPRRegBankID));
826     MI.eraseFromParent();
827     return;
828   }
829   case AMDGPU::G_SEXT:
830   case AMDGPU::G_ZEXT: {
831     Register SrcReg = MI.getOperand(1).getReg();
832     LLT SrcTy = MRI.getType(SrcReg);
833     bool Signed = Opc == AMDGPU::G_SEXT;
834 
835     MachineIRBuilder B(MI);
836     const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI);
837 
838     Register DstReg = MI.getOperand(0).getReg();
839     LLT DstTy = MRI.getType(DstReg);
840     if (DstTy.isScalar() &&
841         SrcBank != &AMDGPU::SGPRRegBank &&
842         SrcBank != &AMDGPU::SCCRegBank &&
843         SrcBank != &AMDGPU::VCCRegBank &&
844         // FIXME: Should handle any type that round to s64 when irregular
845         // breakdowns supported.
846         DstTy.getSizeInBits() == 64 &&
847         SrcTy.getSizeInBits() <= 32) {
848       const LLT S32 = LLT::scalar(32);
849       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
850 
851       // Extend to 32-bit, and then extend the low half.
852       if (Signed) {
853         // TODO: Should really be buildSExtOrCopy
854         B.buildSExtOrTrunc(DefRegs[0], SrcReg);
855 
856         // Replicate sign bit from 32-bit extended part.
857         auto ShiftAmt = B.buildConstant(S32, 31);
858         MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank);
859         B.buildAShr(DefRegs[1], DefRegs[0], ShiftAmt);
860       } else {
861         B.buildZExtOrTrunc(DefRegs[0], SrcReg);
862         B.buildConstant(DefRegs[1], 0);
863       }
864 
865       MRI.setRegBank(DstReg, *SrcBank);
866       MI.eraseFromParent();
867       return;
868     }
869 
870     if (SrcTy != LLT::scalar(1))
871       return;
872 
873     if (SrcBank == &AMDGPU::SCCRegBank || SrcBank == &AMDGPU::VCCRegBank) {
874       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
875 
876       const RegisterBank *DstBank = SrcBank == &AMDGPU::SCCRegBank ?
877         &AMDGPU::SGPRRegBank : &AMDGPU::VGPRRegBank;
878 
879       unsigned DstSize = DstTy.getSizeInBits();
880       // 64-bit select is SGPR only
881       const bool UseSel64 = DstSize > 32 &&
882         SrcBank->getID() == AMDGPU::SCCRegBankID;
883 
884       // TODO: Should s16 select be legal?
885       LLT SelType = UseSel64 ? LLT::scalar(64) : LLT::scalar(32);
886       auto True = B.buildConstant(SelType, Signed ? -1 : 1);
887       auto False = B.buildConstant(SelType, 0);
888 
889       MRI.setRegBank(True.getReg(0), *DstBank);
890       MRI.setRegBank(False.getReg(0), *DstBank);
891       MRI.setRegBank(DstReg, *DstBank);
892 
893       if (DstSize > 32 && SrcBank->getID() != AMDGPU::SCCRegBankID) {
894         B.buildSelect(DefRegs[0], SrcReg, True, False);
895         B.buildCopy(DefRegs[1], DefRegs[0]);
896       } else if (DstSize < 32) {
897         auto Sel = B.buildSelect(SelType, SrcReg, True, False);
898         MRI.setRegBank(Sel.getReg(0), *DstBank);
899         B.buildTrunc(DstReg, Sel);
900       } else {
901         B.buildSelect(DstReg, SrcReg, True, False);
902       }
903 
904       MI.eraseFromParent();
905       return;
906     }
907 
908     // Fixup the case with an s1 src that isn't a condition register. Use shifts
909     // instead of introducing a compare to avoid an unnecessary condition
910     // register (and since there's no scalar 16-bit compares).
911     auto Ext = B.buildAnyExt(DstTy, SrcReg);
912     auto ShiftAmt = B.buildConstant(LLT::scalar(32), DstTy.getSizeInBits() - 1);
913     auto Shl = B.buildShl(DstTy, Ext, ShiftAmt);
914 
915     if (MI.getOpcode() == AMDGPU::G_SEXT)
916       B.buildAShr(DstReg, Shl, ShiftAmt);
917     else
918       B.buildLShr(DstReg, Shl, ShiftAmt);
919 
920     MRI.setRegBank(DstReg, *SrcBank);
921     MRI.setRegBank(Ext.getReg(0), *SrcBank);
922     MRI.setRegBank(ShiftAmt.getReg(0), *SrcBank);
923     MRI.setRegBank(Shl.getReg(0), *SrcBank);
924     MI.eraseFromParent();
925     return;
926   }
927   case AMDGPU::G_EXTRACT_VECTOR_ELT:
928     applyDefaultMapping(OpdMapper);
929     executeInWaterfallLoop(MI, MRI, { 2 });
930     return;
931   case AMDGPU::G_INTRINSIC: {
932     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
933     case Intrinsic::amdgcn_s_buffer_load: {
934       // FIXME: Move to G_INTRINSIC_W_SIDE_EFFECTS
935       executeInWaterfallLoop(MI, MRI, { 2, 3 });
936       return;
937     }
938     default:
939       break;
940     }
941     break;
942   }
943   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
944     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
945     case Intrinsic::amdgcn_buffer_load: {
946       executeInWaterfallLoop(MI, MRI, { 2 });
947       return;
948     }
949     default:
950       break;
951     }
952     break;
953   }
954   default:
955     break;
956   }
957 
958   return applyDefaultMapping(OpdMapper);
959 }
960 
961 static bool isInstrUniform(const MachineInstr &MI) {
962   if (!MI.hasOneMemOperand())
963     return false;
964 
965   const MachineMemOperand *MMO = *MI.memoperands_begin();
966   return AMDGPUInstrInfo::isUniformMMO(MMO);
967 }
968 
969 bool AMDGPURegisterBankInfo::isSALUMapping(const MachineInstr &MI) const {
970   const MachineFunction &MF = *MI.getParent()->getParent();
971   const MachineRegisterInfo &MRI = MF.getRegInfo();
972   for (unsigned i = 0, e = MI.getNumOperands();i != e; ++i) {
973     if (!MI.getOperand(i).isReg())
974       continue;
975     unsigned Reg = MI.getOperand(i).getReg();
976     if (const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI)) {
977       if (Bank->getID() == AMDGPU::VGPRRegBankID)
978         return false;
979 
980       assert(Bank->getID() == AMDGPU::SGPRRegBankID ||
981              Bank->getID() == AMDGPU::SCCRegBankID);
982     }
983   }
984   return true;
985 }
986 
987 const RegisterBankInfo::InstructionMapping &
988 AMDGPURegisterBankInfo::getDefaultMappingSOP(const MachineInstr &MI) const {
989   const MachineFunction &MF = *MI.getParent()->getParent();
990   const MachineRegisterInfo &MRI = MF.getRegInfo();
991   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
992 
993   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
994     unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI);
995     unsigned BankID = Size == 1 ? AMDGPU::SCCRegBankID : AMDGPU::SGPRRegBankID;
996     OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size);
997   }
998   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
999                                MI.getNumOperands());
1000 }
1001 
1002 const RegisterBankInfo::InstructionMapping &
1003 AMDGPURegisterBankInfo::getDefaultMappingVOP(const MachineInstr &MI) const {
1004   const MachineFunction &MF = *MI.getParent()->getParent();
1005   const MachineRegisterInfo &MRI = MF.getRegInfo();
1006   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1007   unsigned OpdIdx = 0;
1008 
1009   unsigned Size0 = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1010   OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0);
1011 
1012   if (MI.getOperand(OpdIdx).isIntrinsicID())
1013     OpdsMapping[OpdIdx++] = nullptr;
1014 
1015   unsigned Reg1 = MI.getOperand(OpdIdx).getReg();
1016   unsigned Size1 = getSizeInBits(Reg1, MRI, *TRI);
1017 
1018   unsigned DefaultBankID = Size1 == 1 ?
1019     AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID;
1020   unsigned Bank1 = getRegBankID(Reg1, MRI, *TRI, DefaultBankID);
1021 
1022   OpdsMapping[OpdIdx++] = AMDGPU::getValueMapping(Bank1, Size1);
1023 
1024   for (unsigned e = MI.getNumOperands(); OpdIdx != e; ++OpdIdx) {
1025     const MachineOperand &MO = MI.getOperand(OpdIdx);
1026     if (!MO.isReg())
1027       continue;
1028 
1029     unsigned Size = getSizeInBits(MO.getReg(), MRI, *TRI);
1030     unsigned BankID = Size == 1 ? AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID;
1031     OpdsMapping[OpdIdx] = AMDGPU::getValueMapping(BankID, Size);
1032   }
1033 
1034   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
1035                                MI.getNumOperands());
1036 }
1037 
1038 const RegisterBankInfo::InstructionMapping &
1039 AMDGPURegisterBankInfo::getDefaultMappingAllVGPR(const MachineInstr &MI) const {
1040   const MachineFunction &MF = *MI.getParent()->getParent();
1041   const MachineRegisterInfo &MRI = MF.getRegInfo();
1042   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1043 
1044   for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {
1045     unsigned Size = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI);
1046     OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1047   }
1048 
1049   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
1050                                MI.getNumOperands());
1051 }
1052 
1053 const RegisterBankInfo::InstructionMapping &
1054 AMDGPURegisterBankInfo::getInstrMappingForLoad(const MachineInstr &MI) const {
1055 
1056   const MachineFunction &MF = *MI.getParent()->getParent();
1057   const MachineRegisterInfo &MRI = MF.getRegInfo();
1058   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1059   unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1060   unsigned PtrSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
1061 
1062   const ValueMapping *ValMapping;
1063   const ValueMapping *PtrMapping;
1064 
1065   if (isInstrUniform(MI)) {
1066     // We have a uniform instruction so we want to use an SMRD load
1067     ValMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1068     PtrMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize);
1069   } else {
1070     ValMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1071     // FIXME: What would happen if we used SGPRRegBankID here?
1072     PtrMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize);
1073   }
1074 
1075   OpdsMapping[0] = ValMapping;
1076   OpdsMapping[1] = PtrMapping;
1077   const RegisterBankInfo::InstructionMapping &Mapping = getInstructionMapping(
1078       1, 1, getOperandsMapping(OpdsMapping), MI.getNumOperands());
1079   return Mapping;
1080 
1081   // FIXME: Do we want to add a mapping for FLAT load, or should we just
1082   // handle that during instruction selection?
1083 }
1084 
1085 unsigned
1086 AMDGPURegisterBankInfo::getRegBankID(unsigned Reg,
1087                                      const MachineRegisterInfo &MRI,
1088                                      const TargetRegisterInfo &TRI,
1089                                      unsigned Default) const {
1090 
1091   const RegisterBank *Bank = getRegBank(Reg, MRI, TRI);
1092   return Bank ? Bank->getID() : Default;
1093 }
1094 
1095 ///
1096 /// This function must return a legal mapping, because
1097 /// AMDGPURegisterBankInfo::getInstrAlternativeMappings() is not called
1098 /// in RegBankSelect::Mode::Fast.  Any mapping that would cause a
1099 /// VGPR to SGPR generated is illegal.
1100 ///
1101 const RegisterBankInfo::InstructionMapping &
1102 AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
1103   const MachineFunction &MF = *MI.getParent()->getParent();
1104   const MachineRegisterInfo &MRI = MF.getRegInfo();
1105 
1106   if (MI.isRegSequence()) {
1107     // If any input is a VGPR, the result must be a VGPR. The default handling
1108     // assumes any copy between banks is legal.
1109     unsigned BankID = AMDGPU::SGPRRegBankID;
1110 
1111     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
1112       auto OpBank = getRegBankID(MI.getOperand(I).getReg(), MRI, *TRI);
1113       // It doesn't make sense to use vcc or scc banks here, so just ignore
1114       // them.
1115       if (OpBank != AMDGPU::SGPRRegBankID) {
1116         BankID = AMDGPU::VGPRRegBankID;
1117         break;
1118       }
1119     }
1120     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1121 
1122     const ValueMapping &ValMap = getValueMapping(0, Size, getRegBank(BankID));
1123     return getInstructionMapping(
1124         1, /*Cost*/ 1,
1125         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
1126   }
1127 
1128   // The default handling is broken and doesn't handle illegal SGPR->VGPR copies
1129   // properly.
1130   //
1131   // TODO: There are additional exec masking dependencies to analyze.
1132   if (MI.getOpcode() == TargetOpcode::G_PHI) {
1133     // TODO: Generate proper invalid bank enum.
1134     int ResultBank = -1;
1135 
1136     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
1137       unsigned Reg = MI.getOperand(I).getReg();
1138       const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI);
1139 
1140       // FIXME: Assuming VGPR for any undetermined inputs.
1141       if (!Bank || Bank->getID() == AMDGPU::VGPRRegBankID) {
1142         ResultBank = AMDGPU::VGPRRegBankID;
1143         break;
1144       }
1145 
1146       unsigned OpBank = Bank->getID();
1147       // scc, scc -> sgpr
1148       if (OpBank == AMDGPU::SCCRegBankID) {
1149         // There's only one SCC register, so a phi requires copying to SGPR.
1150         OpBank = AMDGPU::SGPRRegBankID;
1151       } else if (OpBank == AMDGPU::VCCRegBankID) {
1152         // vcc, vcc -> vcc
1153         // vcc, sgpr -> vgpr
1154         if (ResultBank != -1 && ResultBank != AMDGPU::VCCRegBankID) {
1155           ResultBank = AMDGPU::VGPRRegBankID;
1156           break;
1157         }
1158       }
1159 
1160       ResultBank = OpBank;
1161     }
1162 
1163     assert(ResultBank != -1);
1164 
1165     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1166 
1167     const ValueMapping &ValMap =
1168         getValueMapping(0, Size, getRegBank(ResultBank));
1169     return getInstructionMapping(
1170         1, /*Cost*/ 1,
1171         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
1172   }
1173 
1174   const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
1175   if (Mapping.isValid())
1176     return Mapping;
1177 
1178   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
1179 
1180   switch (MI.getOpcode()) {
1181   default:
1182     return getInvalidInstructionMapping();
1183 
1184   case AMDGPU::G_AND:
1185   case AMDGPU::G_OR:
1186   case AMDGPU::G_XOR: {
1187     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1188     if (Size == 1) {
1189       OpdsMapping[0] = OpdsMapping[1] =
1190         OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size);
1191       break;
1192     }
1193 
1194     if (Size == 64) {
1195 
1196       if (isSALUMapping(MI)) {
1197         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size);
1198         OpdsMapping[1] = OpdsMapping[2] = OpdsMapping[0];
1199       } else {
1200         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size);
1201         unsigned Bank1 = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI/*, DefaultBankID*/);
1202         OpdsMapping[1] = AMDGPU::getValueMapping(Bank1, Size);
1203 
1204         unsigned Bank2 = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI/*, DefaultBankID*/);
1205         OpdsMapping[2] = AMDGPU::getValueMapping(Bank2, Size);
1206       }
1207 
1208       break;
1209     }
1210 
1211     LLVM_FALLTHROUGH;
1212   }
1213 
1214   case AMDGPU::G_GEP:
1215   case AMDGPU::G_ADD:
1216   case AMDGPU::G_SUB:
1217   case AMDGPU::G_MUL:
1218   case AMDGPU::G_SHL:
1219   case AMDGPU::G_LSHR:
1220   case AMDGPU::G_ASHR:
1221   case AMDGPU::G_UADDO:
1222   case AMDGPU::G_SADDO:
1223   case AMDGPU::G_USUBO:
1224   case AMDGPU::G_SSUBO:
1225   case AMDGPU::G_UADDE:
1226   case AMDGPU::G_SADDE:
1227   case AMDGPU::G_USUBE:
1228   case AMDGPU::G_SSUBE:
1229   case AMDGPU::G_UMULH:
1230   case AMDGPU::G_SMULH:
1231     if (isSALUMapping(MI))
1232       return getDefaultMappingSOP(MI);
1233     LLVM_FALLTHROUGH;
1234 
1235   case AMDGPU::G_SMIN:
1236   case AMDGPU::G_SMAX:
1237   case AMDGPU::G_UMIN:
1238   case AMDGPU::G_UMAX:
1239     // TODO: min/max can be scalar, but requires expanding as a compare and
1240     // select.
1241 
1242   case AMDGPU::G_FADD:
1243   case AMDGPU::G_FSUB:
1244   case AMDGPU::G_FPTOSI:
1245   case AMDGPU::G_FPTOUI:
1246   case AMDGPU::G_FMUL:
1247   case AMDGPU::G_FMA:
1248   case AMDGPU::G_FSQRT:
1249   case AMDGPU::G_SITOFP:
1250   case AMDGPU::G_UITOFP:
1251   case AMDGPU::G_FPTRUNC:
1252   case AMDGPU::G_FPEXT:
1253   case AMDGPU::G_FEXP2:
1254   case AMDGPU::G_FLOG2:
1255   case AMDGPU::G_INTRINSIC_TRUNC:
1256   case AMDGPU::G_INTRINSIC_ROUND:
1257     return getDefaultMappingVOP(MI);
1258   case AMDGPU::G_IMPLICIT_DEF: {
1259     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1260     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1261     break;
1262   }
1263   case AMDGPU::G_FCONSTANT:
1264   case AMDGPU::G_CONSTANT:
1265   case AMDGPU::G_FRAME_INDEX:
1266   case AMDGPU::G_BLOCK_ADDR: {
1267     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1268     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1269     break;
1270   }
1271   case AMDGPU::G_INSERT: {
1272     unsigned BankID = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
1273                                           AMDGPU::VGPRRegBankID;
1274     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1275     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
1276     unsigned EltSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI);
1277     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
1278     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
1279     OpdsMapping[2] = AMDGPU::getValueMapping(BankID, EltSize);
1280     OpdsMapping[3] = nullptr;
1281     break;
1282   }
1283   case AMDGPU::G_EXTRACT: {
1284     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
1285     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
1286     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
1287     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
1288     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
1289     OpdsMapping[2] = nullptr;
1290     break;
1291   }
1292   case AMDGPU::G_MERGE_VALUES: {
1293     unsigned Bank = isSALUMapping(MI) ?
1294       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1295     unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1296     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1297 
1298     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
1299     // Op1 and Dst should use the same register bank.
1300     for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i)
1301       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, SrcSize);
1302     break;
1303   }
1304   case AMDGPU::G_BITCAST:
1305   case AMDGPU::G_INTTOPTR:
1306   case AMDGPU::G_PTRTOINT:
1307   case AMDGPU::G_CTLZ:
1308   case AMDGPU::G_CTLZ_ZERO_UNDEF:
1309   case AMDGPU::G_CTTZ:
1310   case AMDGPU::G_CTTZ_ZERO_UNDEF:
1311   case AMDGPU::G_CTPOP:
1312   case AMDGPU::G_BSWAP:
1313   case AMDGPU::G_FABS:
1314   case AMDGPU::G_FNEG: {
1315     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1316     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
1317     OpdsMapping[0] = OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size);
1318     break;
1319   }
1320   case AMDGPU::G_TRUNC: {
1321     unsigned Dst = MI.getOperand(0).getReg();
1322     unsigned Src = MI.getOperand(1).getReg();
1323     unsigned Bank = getRegBankID(Src, MRI, *TRI);
1324     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
1325     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
1326     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
1327     OpdsMapping[1] = AMDGPU::getValueMapping(Bank, SrcSize);
1328     break;
1329   }
1330   case AMDGPU::G_ZEXT:
1331   case AMDGPU::G_SEXT:
1332   case AMDGPU::G_ANYEXT: {
1333     unsigned Dst = MI.getOperand(0).getReg();
1334     unsigned Src = MI.getOperand(1).getReg();
1335     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
1336     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
1337 
1338     unsigned DstBank;
1339     const RegisterBank *SrcBank = getRegBank(Src, MRI, *TRI);
1340     assert(SrcBank);
1341     switch (SrcBank->getID()) {
1342     case AMDGPU::SCCRegBankID:
1343     case AMDGPU::SGPRRegBankID:
1344       DstBank = AMDGPU::SGPRRegBankID;
1345       break;
1346     default:
1347       DstBank = AMDGPU::VGPRRegBankID;
1348       break;
1349     }
1350 
1351     // TODO: Should anyext be split into 32-bit part as well?
1352     if (MI.getOpcode() == AMDGPU::G_ANYEXT) {
1353       OpdsMapping[0] = AMDGPU::getValueMapping(DstBank, DstSize);
1354       OpdsMapping[1] = AMDGPU::getValueMapping(SrcBank->getID(), SrcSize);
1355     } else {
1356       // Scalar extend can use 64-bit BFE, but VGPRs require extending to
1357       // 32-bits, and then to 64.
1358       OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(DstBank, DstSize);
1359       OpdsMapping[1] = AMDGPU::getValueMappingSGPR64Only(SrcBank->getID(),
1360                                                          SrcSize);
1361     }
1362     break;
1363   }
1364   case AMDGPU::G_FCMP: {
1365     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1366     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1367     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
1368     OpdsMapping[1] = nullptr; // Predicate Operand.
1369     OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size);
1370     OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1371     break;
1372   }
1373   case AMDGPU::G_STORE: {
1374     assert(MI.getOperand(0).isReg());
1375     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1376     // FIXME: We need to specify a different reg bank once scalar stores
1377     // are supported.
1378     const ValueMapping *ValMapping =
1379         AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
1380     // FIXME: Depending on the type of store, the pointer could be in
1381     // the SGPR Reg bank.
1382     // FIXME: Pointer size should be based on the address space.
1383     const ValueMapping *PtrMapping =
1384         AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 64);
1385 
1386     OpdsMapping[0] = ValMapping;
1387     OpdsMapping[1] = PtrMapping;
1388     break;
1389   }
1390 
1391   case AMDGPU::G_ICMP: {
1392     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1393     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1394     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
1395     unsigned Op0Bank = Op2Bank == AMDGPU::SGPRRegBankID &&
1396                        Op3Bank == AMDGPU::SGPRRegBankID ?
1397                        AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID;
1398     OpdsMapping[0] = AMDGPU::getValueMapping(Op0Bank, 1);
1399     OpdsMapping[1] = nullptr; // Predicate Operand.
1400     OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size);
1401     OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size);
1402     break;
1403   }
1404 
1405 
1406   case AMDGPU::G_EXTRACT_VECTOR_ELT: {
1407     unsigned OutputBankID = isSALUMapping(MI) ?
1408                             AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1409     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1410     unsigned IdxSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1411     unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1412 
1413     OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, SrcSize);
1414     OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, SrcSize);
1415 
1416     // The index can be either if the source vector is VGPR.
1417     OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, IdxSize);
1418     break;
1419   }
1420   case AMDGPU::G_INSERT_VECTOR_ELT: {
1421     unsigned OutputBankID = isSALUMapping(MI) ?
1422       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1423 
1424     unsigned VecSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1425     unsigned InsertSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
1426     unsigned IdxSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
1427     unsigned InsertEltBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1428     unsigned IdxBank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
1429 
1430     OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, VecSize);
1431     OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, VecSize);
1432     OpdsMapping[2] = AMDGPU::getValueMapping(InsertEltBank, InsertSize);
1433 
1434     // The index can be either if the source vector is VGPR.
1435     OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
1436     break;
1437   }
1438   case AMDGPU::G_UNMERGE_VALUES: {
1439     unsigned Bank = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
1440       AMDGPU::VGPRRegBankID;
1441 
1442     // Op1 and Dst should use the same register bank.
1443     // FIXME: Shouldn't this be the default? Why do we need to handle this?
1444     for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
1445       unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI);
1446       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, Size);
1447     }
1448     break;
1449   }
1450   case AMDGPU::G_INTRINSIC: {
1451     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
1452     default:
1453       return getInvalidInstructionMapping();
1454     case Intrinsic::maxnum:
1455     case Intrinsic::minnum:
1456     case Intrinsic::amdgcn_cvt_pkrtz:
1457       return getDefaultMappingVOP(MI);
1458     case Intrinsic::amdgcn_kernarg_segment_ptr: {
1459       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1460       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1461       break;
1462     }
1463     case Intrinsic::amdgcn_wqm_vote: {
1464       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1465       OpdsMapping[0] = OpdsMapping[2]
1466         = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
1467       break;
1468     }
1469     case Intrinsic::amdgcn_s_buffer_load: {
1470       // FIXME: This should be moved to G_INTRINSIC_W_SIDE_EFFECTS
1471       unsigned RSrc = MI.getOperand(2).getReg();   // SGPR
1472       unsigned Offset = MI.getOperand(3).getReg(); // SGPR/imm
1473 
1474       unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1475       unsigned Size2 = MRI.getType(RSrc).getSizeInBits();
1476       unsigned Size3 = MRI.getType(Offset).getSizeInBits();
1477 
1478       unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI);
1479       unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI);
1480 
1481       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size0);
1482       OpdsMapping[1] = nullptr; // intrinsic id
1483 
1484       // Lie and claim everything is legal, even though some need to be
1485       // SGPRs. applyMapping will have to deal with it as a waterfall loop.
1486       OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc
1487       OpdsMapping[3] = AMDGPU::getValueMapping(OffsetBank, Size3);
1488       OpdsMapping[4] = nullptr;
1489       break;
1490     }
1491     case Intrinsic::amdgcn_div_scale: {
1492       unsigned Dst0Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1493       unsigned Dst1Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
1494       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Dst0Size);
1495       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Dst1Size);
1496 
1497       unsigned SrcSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
1498       OpdsMapping[3] = AMDGPU::getValueMapping(
1499         getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI), SrcSize);
1500       OpdsMapping[4] = AMDGPU::getValueMapping(
1501         getRegBankID(MI.getOperand(4).getReg(), MRI, *TRI), SrcSize);
1502 
1503       break;
1504     }
1505     case Intrinsic::amdgcn_class: {
1506       unsigned Src0Reg = MI.getOperand(2).getReg();
1507       unsigned Src1Reg = MI.getOperand(3).getReg();
1508       unsigned Src0Size = MRI.getType(Src0Reg).getSizeInBits();
1509       unsigned Src1Size = MRI.getType(Src1Reg).getSizeInBits();
1510       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1511       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, DstSize);
1512       OpdsMapping[2] = AMDGPU::getValueMapping(getRegBankID(Src0Reg, MRI, *TRI),
1513                                                Src0Size);
1514       OpdsMapping[3] = AMDGPU::getValueMapping(getRegBankID(Src1Reg, MRI, *TRI),
1515                                                Src1Size);
1516       break;
1517     }
1518     }
1519     break;
1520   }
1521   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
1522     switch (MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID()) {
1523     default:
1524       return getInvalidInstructionMapping();
1525     case Intrinsic::amdgcn_exp_compr:
1526       OpdsMapping[0] = nullptr; // IntrinsicID
1527       // FIXME: These are immediate values which can't be read from registers.
1528       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1529       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1530       // FIXME: Could we support packed types here?
1531       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1532       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1533       // FIXME: These are immediate values which can't be read from registers.
1534       OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1535       OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1536       break;
1537     case Intrinsic::amdgcn_exp:
1538       OpdsMapping[0] = nullptr; // IntrinsicID
1539       // FIXME: These are immediate values which can't be read from registers.
1540       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1541       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1542       // FIXME: Could we support packed types here?
1543       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1544       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1545       OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1546       OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
1547       // FIXME: These are immediate values which can't be read from registers.
1548       OpdsMapping[7] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1549       OpdsMapping[8] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
1550       break;
1551     case Intrinsic::amdgcn_buffer_load: {
1552       unsigned RSrc = MI.getOperand(2).getReg();   // SGPR
1553       unsigned VIndex = MI.getOperand(3).getReg(); // VGPR
1554       unsigned Offset = MI.getOperand(4).getReg(); // SGPR/VGPR/imm
1555 
1556       unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1557       unsigned Size2 = MRI.getType(RSrc).getSizeInBits();
1558       unsigned Size3 = MRI.getType(VIndex).getSizeInBits();
1559       unsigned Size4 = MRI.getType(Offset).getSizeInBits();
1560 
1561       unsigned RSrcBank = getRegBankID(RSrc, MRI, *TRI);
1562       unsigned OffsetBank = getRegBankID(Offset, MRI, *TRI);
1563 
1564       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size0);
1565       OpdsMapping[1] = nullptr; // intrinsic id
1566 
1567       // Lie and claim everything is legal, even though some need to be
1568       // SGPRs. applyMapping will have to deal with it as a waterfall loop.
1569       OpdsMapping[2] = AMDGPU::getValueMapping(RSrcBank, Size2); // rsrc
1570       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size3);
1571       OpdsMapping[4] = AMDGPU::getValueMapping(OffsetBank, Size4);
1572       OpdsMapping[5] = nullptr;
1573       OpdsMapping[6] = nullptr;
1574       break;
1575     }
1576     }
1577 
1578     break;
1579   }
1580   case AMDGPU::G_SELECT: {
1581     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
1582     unsigned Op1Bank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
1583                                     AMDGPU::SGPRRegBankID);
1584     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
1585     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
1586     bool SGPRSrcs = Op1Bank == AMDGPU::SCCRegBankID &&
1587                     Op2Bank == AMDGPU::SGPRRegBankID &&
1588                     Op3Bank == AMDGPU::SGPRRegBankID;
1589     unsigned Bank = SGPRSrcs ? AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
1590     Op1Bank = SGPRSrcs ? AMDGPU::SCCRegBankID : AMDGPU::VCCRegBankID;
1591 
1592     if (Size == 64) {
1593       OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
1594       OpdsMapping[1] = AMDGPU::getValueMapping(Op1Bank, 1);
1595       OpdsMapping[2] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
1596       OpdsMapping[3] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
1597     } else {
1598       OpdsMapping[0] = AMDGPU::getValueMapping(Bank, Size);
1599       OpdsMapping[1] = AMDGPU::getValueMapping(Op1Bank, 1);
1600       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, Size);
1601       OpdsMapping[3] = AMDGPU::getValueMapping(Bank, Size);
1602     }
1603 
1604     break;
1605   }
1606 
1607   case AMDGPU::G_LOAD:
1608     return getInstrMappingForLoad(MI);
1609 
1610   case AMDGPU::G_ATOMICRMW_XCHG:
1611   case AMDGPU::G_ATOMICRMW_ADD:
1612   case AMDGPU::G_ATOMICRMW_SUB:
1613   case AMDGPU::G_ATOMICRMW_AND:
1614   case AMDGPU::G_ATOMICRMW_OR:
1615   case AMDGPU::G_ATOMICRMW_XOR:
1616   case AMDGPU::G_ATOMICRMW_MAX:
1617   case AMDGPU::G_ATOMICRMW_MIN:
1618   case AMDGPU::G_ATOMICRMW_UMAX:
1619   case AMDGPU::G_ATOMICRMW_UMIN:
1620   case AMDGPU::G_ATOMIC_CMPXCHG: {
1621     return getDefaultMappingAllVGPR(MI);
1622   }
1623   case AMDGPU::G_BRCOND: {
1624     unsigned Bank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI,
1625                                  AMDGPU::SGPRRegBankID);
1626     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
1627     if (Bank != AMDGPU::SCCRegBankID)
1628       Bank = AMDGPU::VCCRegBankID;
1629 
1630     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, 1);
1631     break;
1632   }
1633   }
1634 
1635   return getInstructionMapping(/*ID*/1, /*Cost*/1,
1636                                getOperandsMapping(OpdsMapping),
1637                                MI.getNumOperands());
1638 }
1639 
1640