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 ///
12 /// \par
13 ///
14 /// AMDGPU has unique register bank constraints that require special high level
15 /// strategies to deal with. There are two main true physical register banks
16 /// VGPR (vector), and SGPR (scalar). Additionally the VCC register bank is a
17 /// sort of pseudo-register bank needed to represent SGPRs used in a vector
18 /// boolean context. There is also the AGPR bank, which is a special purpose
19 /// physical register bank present on some subtargets.
20 ///
21 /// Copying from VGPR to SGPR is generally illegal, unless the value is known to
22 /// be uniform. It is generally not valid to legalize operands by inserting
23 /// copies as on other targets. Operations which require uniform, SGPR operands
24 /// generally require scalarization by repeatedly executing the instruction,
25 /// activating each set of lanes using a unique set of input values. This is
26 /// referred to as a waterfall loop.
27 ///
28 /// \par Booleans
29 ///
30 /// Booleans (s1 values) requires special consideration. A vector compare result
31 /// is naturally a bitmask with one bit per lane, in a 32 or 64-bit
32 /// register. These are represented with the VCC bank. During selection, we need
33 /// to be able to unambiguously go back from a register class to a register
34 /// bank. To distinguish whether an SGPR should use the SGPR or VCC register
35 /// bank, we need to know the use context type. An SGPR s1 value always means a
36 /// VCC bank value, otherwise it will be the SGPR bank. A scalar compare sets
37 /// SCC, which is a 1-bit unaddressable register. This will need to be copied to
38 /// a 32-bit virtual register. Taken together, this means we need to adjust the
39 /// type of boolean operations to be regbank legal. All SALU booleans need to be
40 /// widened to 32-bits, and all VALU booleans need to be s1 values.
41 ///
42 /// A noteworthy exception to the s1-means-vcc rule is for legalization artifact
43 /// casts. G_TRUNC s1 results, and G_SEXT/G_ZEXT/G_ANYEXT sources are never vcc
44 /// bank. A non-boolean source (such as a truncate from a 1-bit load from
45 /// memory) will require a copy to the VCC bank which will require clearing the
46 /// high bits and inserting a compare.
47 ///
48 /// \par Constant bus restriction
49 ///
50 /// VALU instructions have a limitation known as the constant bus
51 /// restriction. Most VALU instructions can use SGPR operands, but may read at
52 /// most 1 SGPR or constant literal value (this to 2 in gfx10 for most
53 /// instructions). This is one unique SGPR, so the same SGPR may be used for
54 /// multiple operands. From a register bank perspective, any combination of
55 /// operands should be legal as an SGPR, but this is contextually dependent on
56 /// the SGPR operands all being the same register. There is therefore optimal to
57 /// choose the SGPR with the most uses to minimize the number of copies.
58 ///
59 /// We avoid trying to solve this problem in RegBankSelect. Any VALU G_*
60 /// operation should have its source operands all mapped to VGPRs (except for
61 /// VCC), inserting copies from any SGPR operands. This the most trival legal
62 /// mapping. Anything beyond the simplest 1:1 instruction selection would be too
63 /// complicated to solve here. Every optimization pattern or instruction
64 /// selected to multiple outputs would have to enforce this rule, and there
65 /// would be additional complexity in tracking this rule for every G_*
66 /// operation. By forcing all inputs to VGPRs, it also simplifies the task of
67 /// picking the optimal operand combination from a post-isel optimization pass.
68 ///
69 //===----------------------------------------------------------------------===//
70 
71 #include "AMDGPURegisterBankInfo.h"
72 
73 #include "AMDGPUGlobalISelUtils.h"
74 #include "AMDGPUInstrInfo.h"
75 #include "AMDGPUSubtarget.h"
76 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
77 #include "SIMachineFunctionInfo.h"
78 #include "SIRegisterInfo.h"
79 #include "llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h"
80 #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
81 #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
82 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
83 #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
84 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
85 #include "llvm/CodeGen/TargetRegisterInfo.h"
86 #include "llvm/CodeGen/TargetSubtargetInfo.h"
87 #include "llvm/IR/Constants.h"
88 
89 #define GET_TARGET_REGBANK_IMPL
90 #include "AMDGPUGenRegisterBank.inc"
91 
92 // This file will be TableGen'ed at some point.
93 #include "AMDGPUGenRegisterBankInfo.def"
94 
95 using namespace llvm;
96 using namespace MIPatternMatch;
97 
98 namespace {
99 
100 // Observer to apply a register bank to new registers created by LegalizerHelper.
101 class ApplyRegBankMapping final : public GISelChangeObserver {
102 private:
103   const AMDGPURegisterBankInfo &RBI;
104   MachineRegisterInfo &MRI;
105   const RegisterBank *NewBank;
106   SmallVector<MachineInstr *, 4> NewInsts;
107 
108 public:
109   ApplyRegBankMapping(const AMDGPURegisterBankInfo &RBI_,
110                       MachineRegisterInfo &MRI_, const RegisterBank *RB)
111     : RBI(RBI_), MRI(MRI_), NewBank(RB) {}
112 
113   ~ApplyRegBankMapping() {
114     for (MachineInstr *MI : NewInsts)
115       applyBank(*MI);
116   }
117 
118   /// Set any registers that don't have a set register class or bank to SALU.
119   void applyBank(MachineInstr &MI) {
120     const unsigned Opc = MI.getOpcode();
121     if (Opc == AMDGPU::G_ANYEXT || Opc == AMDGPU::G_ZEXT ||
122         Opc == AMDGPU::G_SEXT) {
123       // LegalizerHelper wants to use the basic legalization artifacts when
124       // widening etc. We don't handle selection with vcc in artifact sources,
125       // so we need to use a sslect instead to handle these properly.
126       Register DstReg = MI.getOperand(0).getReg();
127       Register SrcReg = MI.getOperand(1).getReg();
128       const RegisterBank *SrcBank = RBI.getRegBank(SrcReg, MRI, *RBI.TRI);
129       if (SrcBank == &AMDGPU::VCCRegBank) {
130         const LLT S32 = LLT::scalar(32);
131         assert(MRI.getType(SrcReg) == LLT::scalar(1));
132         assert(MRI.getType(DstReg) == S32);
133         assert(NewBank == &AMDGPU::VGPRRegBank);
134 
135         // Replace the extension with a select, which really uses the boolean
136         // source.
137         MachineIRBuilder B(MI);
138         auto True = B.buildConstant(S32, Opc == AMDGPU::G_SEXT ? -1 : 1);
139         auto False = B.buildConstant(S32, 0);
140         B.buildSelect(DstReg, SrcReg, True, False);
141         MRI.setRegBank(True.getReg(0), *NewBank);
142         MRI.setRegBank(False.getReg(0), *NewBank);
143         MI.eraseFromParent();
144       }
145 
146       assert(!MRI.getRegClassOrRegBank(DstReg));
147       MRI.setRegBank(DstReg, *NewBank);
148       return;
149     }
150 
151 #ifndef NDEBUG
152     if (Opc == AMDGPU::G_TRUNC) {
153       Register DstReg = MI.getOperand(0).getReg();
154       const RegisterBank *DstBank = RBI.getRegBank(DstReg, MRI, *RBI.TRI);
155       assert(DstBank != &AMDGPU::VCCRegBank);
156     }
157 #endif
158 
159     for (MachineOperand &Op : MI.operands()) {
160       if (!Op.isReg())
161         continue;
162 
163       // We may see physical registers if building a real MI
164       Register Reg = Op.getReg();
165       if (Reg.isPhysical() || MRI.getRegClassOrRegBank(Reg))
166         continue;
167 
168       const RegisterBank *RB = NewBank;
169       if (MRI.getType(Reg) == LLT::scalar(1)) {
170         assert(NewBank == &AMDGPU::VGPRRegBank &&
171                "s1 operands should only be used for vector bools");
172         assert((MI.getOpcode() != AMDGPU::G_TRUNC &&
173                 MI.getOpcode() != AMDGPU::G_ANYEXT) &&
174                "not expecting legalization artifacts here");
175         RB = &AMDGPU::VCCRegBank;
176       }
177 
178       MRI.setRegBank(Reg, *RB);
179     }
180   }
181 
182   void erasingInstr(MachineInstr &MI) override {}
183 
184   void createdInstr(MachineInstr &MI) override {
185     // At this point, the instruction was just inserted and has no operands.
186     NewInsts.push_back(&MI);
187   }
188 
189   void changingInstr(MachineInstr &MI) override {}
190   void changedInstr(MachineInstr &MI) override {}
191 };
192 
193 }
194 AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const GCNSubtarget &ST)
195     : AMDGPUGenRegisterBankInfo(),
196       Subtarget(ST),
197       TRI(Subtarget.getRegisterInfo()),
198       TII(Subtarget.getInstrInfo()) {
199 
200   // HACK: Until this is fully tablegen'd.
201   static llvm::once_flag InitializeRegisterBankFlag;
202 
203   static auto InitializeRegisterBankOnce = [this]() {
204     assert(&getRegBank(AMDGPU::SGPRRegBankID) == &AMDGPU::SGPRRegBank &&
205            &getRegBank(AMDGPU::VGPRRegBankID) == &AMDGPU::VGPRRegBank &&
206            &getRegBank(AMDGPU::AGPRRegBankID) == &AMDGPU::AGPRRegBank);
207     (void)this;
208   };
209 
210   llvm::call_once(InitializeRegisterBankFlag, InitializeRegisterBankOnce);
211 }
212 
213 static bool isVectorRegisterBank(const RegisterBank &Bank) {
214   unsigned BankID = Bank.getID();
215   return BankID == AMDGPU::VGPRRegBankID || BankID == AMDGPU::AGPRRegBankID;
216 }
217 
218 unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst,
219                                           const RegisterBank &Src,
220                                           unsigned Size) const {
221   // TODO: Should there be a UniformVGPRRegBank which can use readfirstlane?
222   if (Dst.getID() == AMDGPU::SGPRRegBankID &&
223       (isVectorRegisterBank(Src) || Src.getID() == AMDGPU::VCCRegBankID)) {
224     return std::numeric_limits<unsigned>::max();
225   }
226 
227   // Bool values are tricky, because the meaning is based on context. The SCC
228   // and VCC banks are for the natural scalar and vector conditions produced by
229   // a compare.
230   //
231   // Legalization doesn't know about the necessary context, so an s1 use may
232   // have been a truncate from an arbitrary value, in which case a copy (lowered
233   // as a compare with 0) needs to be inserted.
234   if (Size == 1 &&
235       (Dst.getID() == AMDGPU::SGPRRegBankID) &&
236       (isVectorRegisterBank(Src) ||
237        Src.getID() == AMDGPU::SGPRRegBankID ||
238        Src.getID() == AMDGPU::VCCRegBankID))
239     return std::numeric_limits<unsigned>::max();
240 
241   // There is no direct copy between AGPRs.
242   if (Dst.getID() == AMDGPU::AGPRRegBankID &&
243       Src.getID() == AMDGPU::AGPRRegBankID)
244     return 4;
245 
246   return RegisterBankInfo::copyCost(Dst, Src, Size);
247 }
248 
249 unsigned AMDGPURegisterBankInfo::getBreakDownCost(
250   const ValueMapping &ValMapping,
251   const RegisterBank *CurBank) const {
252   // Check if this is a breakdown for G_LOAD to move the pointer from SGPR to
253   // VGPR.
254   // FIXME: Is there a better way to do this?
255   if (ValMapping.NumBreakDowns >= 2 || ValMapping.BreakDown[0].Length >= 64)
256     return 10; // This is expensive.
257 
258   assert(ValMapping.NumBreakDowns == 2 &&
259          ValMapping.BreakDown[0].Length == 32 &&
260          ValMapping.BreakDown[0].StartIdx == 0 &&
261          ValMapping.BreakDown[1].Length == 32 &&
262          ValMapping.BreakDown[1].StartIdx == 32 &&
263          ValMapping.BreakDown[0].RegBank == ValMapping.BreakDown[1].RegBank);
264 
265   // 32-bit extract of a 64-bit value is just access of a subregister, so free.
266   // TODO: Cost of 0 hits assert, though it's not clear it's what we really
267   // want.
268 
269   // TODO: 32-bit insert to a 64-bit SGPR may incur a non-free copy due to SGPR
270   // alignment restrictions, but this probably isn't important.
271   return 1;
272 }
273 
274 const RegisterBank &
275 AMDGPURegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,
276                                                LLT Ty) const {
277   if (&RC == &AMDGPU::SReg_1RegClass)
278     return AMDGPU::VCCRegBank;
279 
280   // We promote real scalar booleans to SReg_32. Any SGPR using s1 is really a
281   // VCC-like use.
282   if (TRI->isSGPRClass(&RC)) {
283     // FIXME: This probably came from a copy from a physical register, which
284     // should be inferrrable from the copied to-type. We don't have many boolean
285     // physical register constraints so just assume a normal SGPR for now.
286     if (!Ty.isValid())
287       return AMDGPU::SGPRRegBank;
288 
289     return Ty == LLT::scalar(1) ? AMDGPU::VCCRegBank : AMDGPU::SGPRRegBank;
290   }
291 
292   return TRI->isAGPRClass(&RC) ? AMDGPU::AGPRRegBank : AMDGPU::VGPRRegBank;
293 }
294 
295 template <unsigned NumOps>
296 RegisterBankInfo::InstructionMappings
297 AMDGPURegisterBankInfo::addMappingFromTable(
298     const MachineInstr &MI, const MachineRegisterInfo &MRI,
299     const std::array<unsigned, NumOps> RegSrcOpIdx,
300     ArrayRef<OpRegBankEntry<NumOps>> Table) const {
301 
302   InstructionMappings AltMappings;
303 
304   SmallVector<const ValueMapping *, 10> Operands(MI.getNumOperands());
305 
306   unsigned Sizes[NumOps];
307   for (unsigned I = 0; I < NumOps; ++I) {
308     Register Reg = MI.getOperand(RegSrcOpIdx[I]).getReg();
309     Sizes[I] = getSizeInBits(Reg, MRI, *TRI);
310   }
311 
312   for (unsigned I = 0, E = MI.getNumExplicitDefs(); I != E; ++I) {
313     unsigned SizeI = getSizeInBits(MI.getOperand(I).getReg(), MRI, *TRI);
314     Operands[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SizeI);
315   }
316 
317   // getInstrMapping's default mapping uses ID 1, so start at 2.
318   unsigned MappingID = 2;
319   for (const auto &Entry : Table) {
320     for (unsigned I = 0; I < NumOps; ++I) {
321       int OpIdx = RegSrcOpIdx[I];
322       Operands[OpIdx] = AMDGPU::getValueMapping(Entry.RegBanks[I], Sizes[I]);
323     }
324 
325     AltMappings.push_back(&getInstructionMapping(MappingID++, Entry.Cost,
326                                                  getOperandsMapping(Operands),
327                                                  Operands.size()));
328   }
329 
330   return AltMappings;
331 }
332 
333 RegisterBankInfo::InstructionMappings
334 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsic(
335     const MachineInstr &MI, const MachineRegisterInfo &MRI) const {
336   switch (MI.getIntrinsicID()) {
337   case Intrinsic::amdgcn_readlane: {
338     static const OpRegBankEntry<3> Table[2] = {
339       // Perfectly legal.
340       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
341 
342       // Need a readfirstlane for the index.
343       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }
344     };
345 
346     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } };
347     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
348   }
349   case Intrinsic::amdgcn_writelane: {
350     static const OpRegBankEntry<4> Table[4] = {
351       // Perfectly legal.
352       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
353 
354       // Need readfirstlane of first op
355       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 },
356 
357       // Need readfirstlane of second op
358       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 },
359 
360       // Need readfirstlane of both ops
361       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 3 }
362     };
363 
364     // rsrc, voffset, offset
365     const std::array<unsigned, 4> RegSrcOpIdx = { { 0, 2, 3, 4 } };
366     return addMappingFromTable<4>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
367   }
368   default:
369     return RegisterBankInfo::getInstrAlternativeMappings(MI);
370   }
371 }
372 
373 RegisterBankInfo::InstructionMappings
374 AMDGPURegisterBankInfo::getInstrAlternativeMappingsIntrinsicWSideEffects(
375     const MachineInstr &MI, const MachineRegisterInfo &MRI) const {
376 
377   switch (MI.getIntrinsicID()) {
378   case Intrinsic::amdgcn_s_buffer_load: {
379     static const OpRegBankEntry<2> Table[4] = {
380       // Perfectly legal.
381       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 1 },
382 
383       // Only need 1 register in loop
384       { { AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID }, 300 },
385 
386       // Have to waterfall the resource.
387       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID }, 1000 },
388 
389       // Have to waterfall the resource, and the offset.
390       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1500 }
391     };
392 
393     // rsrc, offset
394     const std::array<unsigned, 2> RegSrcOpIdx = { { 2, 3 } };
395     return addMappingFromTable<2>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
396   }
397   case Intrinsic::amdgcn_ds_ordered_add:
398   case Intrinsic::amdgcn_ds_ordered_swap: {
399     // VGPR = M0, VGPR
400     static const OpRegBankEntry<3> Table[2] = {
401       // Perfectly legal.
402       { { AMDGPU::VGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::VGPRRegBankID  }, 1 },
403 
404       // Need a readfirstlane for m0
405       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 2 }
406     };
407 
408     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 2, 3 } };
409     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
410   }
411   case Intrinsic::amdgcn_s_sendmsg:
412   case Intrinsic::amdgcn_s_sendmsghalt: {
413     // FIXME: Should have no register for immediate
414     static const OpRegBankEntry<1> Table[2] = {
415       // Perfectly legal.
416       { { AMDGPU::SGPRRegBankID }, 1 },
417 
418       // Need readlane
419       { { AMDGPU::VGPRRegBankID }, 3 }
420     };
421 
422     const std::array<unsigned, 1> RegSrcOpIdx = { { 2 } };
423     return addMappingFromTable<1>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
424   }
425   default:
426     return RegisterBankInfo::getInstrAlternativeMappings(MI);
427   }
428 }
429 
430 static bool memOpHasNoClobbered(const MachineMemOperand *MMO) {
431   const Instruction *I = dyn_cast_or_null<Instruction>(MMO->getValue());
432   return I && I->getMetadata("amdgpu.noclobber");
433 }
434 
435 // FIXME: Returns uniform if there's no source value information. This is
436 // probably wrong.
437 static bool isScalarLoadLegal(const MachineInstr &MI) {
438   if (!MI.hasOneMemOperand())
439     return false;
440 
441   const MachineMemOperand *MMO = *MI.memoperands_begin();
442   const unsigned AS = MMO->getAddrSpace();
443   const bool IsConst = AS == AMDGPUAS::CONSTANT_ADDRESS ||
444                        AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT;
445 
446   // There are no extending SMRD/SMEM loads, and they require 4-byte alignment.
447   return MMO->getSize() >= 4 && MMO->getAlign() >= Align(4) &&
448          // Can't do a scalar atomic load.
449          !MMO->isAtomic() &&
450          // Don't use scalar loads for volatile accesses to non-constant address
451          // spaces.
452          (IsConst || !MMO->isVolatile()) &&
453          // Memory must be known constant, or not written before this load.
454          (IsConst || MMO->isInvariant() || memOpHasNoClobbered(MMO)) &&
455          AMDGPUInstrInfo::isUniformMMO(MMO);
456 }
457 
458 RegisterBankInfo::InstructionMappings
459 AMDGPURegisterBankInfo::getInstrAlternativeMappings(
460     const MachineInstr &MI) const {
461 
462   const MachineFunction &MF = *MI.getParent()->getParent();
463   const MachineRegisterInfo &MRI = MF.getRegInfo();
464 
465 
466   InstructionMappings AltMappings;
467   switch (MI.getOpcode()) {
468   case TargetOpcode::G_CONSTANT: {
469     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
470     if (Size == 1) {
471       static const OpRegBankEntry<1> Table[3] = {
472         { { AMDGPU::VGPRRegBankID }, 1 },
473         { { AMDGPU::SGPRRegBankID }, 1 },
474         { { AMDGPU::VCCRegBankID }, 1 }
475       };
476 
477       return addMappingFromTable<1>(MI, MRI, {{ 0 }}, Table);
478     }
479 
480     LLVM_FALLTHROUGH;
481   }
482   case TargetOpcode::G_FCONSTANT:
483   case TargetOpcode::G_FRAME_INDEX:
484   case TargetOpcode::G_GLOBAL_VALUE: {
485     static const OpRegBankEntry<1> Table[2] = {
486       { { AMDGPU::VGPRRegBankID }, 1 },
487       { { AMDGPU::SGPRRegBankID }, 1 }
488     };
489 
490     return addMappingFromTable<1>(MI, MRI, {{ 0 }}, Table);
491   }
492   case TargetOpcode::G_AND:
493   case TargetOpcode::G_OR:
494   case TargetOpcode::G_XOR: {
495     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
496 
497     if (Size == 1) {
498       // s_{and|or|xor}_b32 set scc when the result of the 32-bit op is not 0.
499       const InstructionMapping &SCCMapping = getInstructionMapping(
500         1, 1, getOperandsMapping(
501           {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32),
502            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32),
503            AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32)}),
504         3); // Num Operands
505       AltMappings.push_back(&SCCMapping);
506 
507       const InstructionMapping &VCCMapping0 = getInstructionMapping(
508         2, 1, getOperandsMapping(
509           {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size),
510            AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size),
511            AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size)}),
512         3); // Num Operands
513       AltMappings.push_back(&VCCMapping0);
514       return AltMappings;
515     }
516 
517     if (Size != 64)
518       break;
519 
520     const InstructionMapping &SSMapping = getInstructionMapping(
521       1, 1, getOperandsMapping(
522         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
523          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
524          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
525       3); // Num Operands
526     AltMappings.push_back(&SSMapping);
527 
528     const InstructionMapping &VVMapping = getInstructionMapping(
529       2, 2, getOperandsMapping(
530         {AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
531          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
532          AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
533       3); // Num Operands
534     AltMappings.push_back(&VVMapping);
535     break;
536   }
537   case TargetOpcode::G_LOAD:
538   case TargetOpcode::G_ZEXTLOAD:
539   case TargetOpcode::G_SEXTLOAD: {
540     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
541     LLT PtrTy = MRI.getType(MI.getOperand(1).getReg());
542     unsigned PtrSize = PtrTy.getSizeInBits();
543     unsigned AS = PtrTy.getAddressSpace();
544 
545     if ((AS != AMDGPUAS::LOCAL_ADDRESS && AS != AMDGPUAS::REGION_ADDRESS &&
546          AS != AMDGPUAS::PRIVATE_ADDRESS) &&
547         isScalarLoadLegal(MI)) {
548       const InstructionMapping &SSMapping = getInstructionMapping(
549           1, 1, getOperandsMapping(
550                     {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
551                      AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize)}),
552           2); // Num Operands
553       AltMappings.push_back(&SSMapping);
554     }
555 
556     const InstructionMapping &VVMapping = getInstructionMapping(
557         2, 1,
558         getOperandsMapping(
559             {AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
560              AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize)}),
561         2); // Num Operands
562     AltMappings.push_back(&VVMapping);
563 
564     // It may be possible to have a vgpr = load sgpr mapping here, because
565     // the mubuf instructions support this kind of load, but probably for only
566     // gfx7 and older.  However, the addressing mode matching in the instruction
567     // selector should be able to do a better job of detecting and selecting
568     // these kinds of loads from the vgpr = load vgpr mapping.
569 
570     return AltMappings;
571 
572   }
573   case TargetOpcode::G_SELECT: {
574     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
575     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
576       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
577                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 1),
578                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
579                           AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size)}),
580       4); // Num Operands
581     AltMappings.push_back(&SSMapping);
582 
583     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
584       getOperandsMapping({AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
585                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
586                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size),
587                           AMDGPU::getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size)}),
588       4); // Num Operands
589     AltMappings.push_back(&VVMapping);
590 
591     return AltMappings;
592   }
593   case TargetOpcode::G_SMIN:
594   case TargetOpcode::G_SMAX:
595   case TargetOpcode::G_UMIN:
596   case TargetOpcode::G_UMAX: {
597     static const OpRegBankEntry<3> Table[2] = {
598       { { AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID, AMDGPU::VGPRRegBankID }, 1 },
599 
600       // Scalar requires cmp+select, and extends if 16-bit.
601       // FIXME: Should there be separate costs for 32 and 16-bit
602       { { AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID, AMDGPU::SGPRRegBankID }, 3 }
603     };
604 
605     const std::array<unsigned, 3> RegSrcOpIdx = { { 0, 1, 2 } };
606     return addMappingFromTable<3>(MI, MRI, RegSrcOpIdx, makeArrayRef(Table));
607   }
608   case TargetOpcode::G_UADDE:
609   case TargetOpcode::G_USUBE:
610   case TargetOpcode::G_SADDE:
611   case TargetOpcode::G_SSUBE: {
612     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
613     const InstructionMapping &SSMapping = getInstructionMapping(1, 1,
614       getOperandsMapping(
615         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
616          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 1),
617          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
618          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size),
619          AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 1)}),
620       5); // Num Operands
621     AltMappings.push_back(&SSMapping);
622 
623     const InstructionMapping &VVMapping = getInstructionMapping(2, 1,
624       getOperandsMapping({AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
625                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1),
626                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
627                           AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size),
628                           AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1)}),
629       5); // Num Operands
630     AltMappings.push_back(&VVMapping);
631     return AltMappings;
632   }
633   case AMDGPU::G_BRCOND: {
634     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
635 
636     // TODO: Change type to 32 for scalar
637     const InstructionMapping &SMapping = getInstructionMapping(
638       1, 1, getOperandsMapping(
639         {AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 1), nullptr}),
640       2); // Num Operands
641     AltMappings.push_back(&SMapping);
642 
643     const InstructionMapping &VMapping = getInstructionMapping(
644       1, 1, getOperandsMapping(
645         {AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1), nullptr }),
646       2); // Num Operands
647     AltMappings.push_back(&VMapping);
648     return AltMappings;
649   }
650   case AMDGPU::G_INTRINSIC:
651     return getInstrAlternativeMappingsIntrinsic(MI, MRI);
652   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS:
653     return getInstrAlternativeMappingsIntrinsicWSideEffects(MI, MRI);
654   default:
655     break;
656   }
657   return RegisterBankInfo::getInstrAlternativeMappings(MI);
658 }
659 
660 void AMDGPURegisterBankInfo::split64BitValueForMapping(
661   MachineIRBuilder &B,
662   SmallVector<Register, 2> &Regs,
663   LLT HalfTy,
664   Register Reg) const {
665   assert(HalfTy.getSizeInBits() == 32);
666   MachineRegisterInfo *MRI = B.getMRI();
667   Register LoLHS = MRI->createGenericVirtualRegister(HalfTy);
668   Register HiLHS = MRI->createGenericVirtualRegister(HalfTy);
669   const RegisterBank *Bank = getRegBank(Reg, *MRI, *TRI);
670   MRI->setRegBank(LoLHS, *Bank);
671   MRI->setRegBank(HiLHS, *Bank);
672 
673   Regs.push_back(LoLHS);
674   Regs.push_back(HiLHS);
675 
676   B.buildInstr(AMDGPU::G_UNMERGE_VALUES)
677     .addDef(LoLHS)
678     .addDef(HiLHS)
679     .addUse(Reg);
680 }
681 
682 /// Replace the current type each register in \p Regs has with \p NewTy
683 static void setRegsToType(MachineRegisterInfo &MRI, ArrayRef<Register> Regs,
684                           LLT NewTy) {
685   for (Register Reg : Regs) {
686     assert(MRI.getType(Reg).getSizeInBits() == NewTy.getSizeInBits());
687     MRI.setType(Reg, NewTy);
688   }
689 }
690 
691 static LLT getHalfSizedType(LLT Ty) {
692   if (Ty.isVector()) {
693     assert(Ty.getNumElements() % 2 == 0);
694     return LLT::scalarOrVector(Ty.getNumElements() / 2, Ty.getElementType());
695   }
696 
697   assert(Ty.getSizeInBits() % 2 == 0);
698   return LLT::scalar(Ty.getSizeInBits() / 2);
699 }
700 
701 /// Legalize instruction \p MI where operands in \p OpIndices must be SGPRs. If
702 /// any of the required SGPR operands are VGPRs, perform a waterfall loop to
703 /// execute the instruction for each unique combination of values in all lanes
704 /// in the wave. The block will be split such that rest of the instructions are
705 /// moved to a new block.
706 ///
707 /// Essentially performs this loop:
708 //
709 /// Save Execution Mask
710 /// For (Lane : Wavefront) {
711 ///   Enable Lane, Disable all other lanes
712 ///   SGPR = read SGPR value for current lane from VGPR
713 ///   VGPRResult[Lane] = use_op SGPR
714 /// }
715 /// Restore Execution Mask
716 ///
717 /// There is additional complexity to try for compare values to identify the
718 /// unique values used.
719 bool AMDGPURegisterBankInfo::executeInWaterfallLoop(
720   MachineIRBuilder &B,
721   iterator_range<MachineBasicBlock::iterator> Range,
722   SmallSet<Register, 4> &SGPROperandRegs,
723   MachineRegisterInfo &MRI) const {
724   SmallVector<Register, 4> ResultRegs;
725   SmallVector<Register, 4> InitResultRegs;
726   SmallVector<Register, 4> PhiRegs;
727 
728   // Track use registers which have already been expanded with a readfirstlane
729   // sequence. This may have multiple uses if moving a sequence.
730   DenseMap<Register, Register> WaterfalledRegMap;
731 
732   MachineBasicBlock &MBB = B.getMBB();
733   MachineFunction *MF = &B.getMF();
734 
735   const TargetRegisterClass *WaveRC = TRI->getWaveMaskRegClass();
736   const unsigned WaveAndOpc = Subtarget.isWave32() ?
737     AMDGPU::S_AND_B32 : AMDGPU::S_AND_B64;
738   const unsigned MovTermOpc = Subtarget.isWave32() ?
739     AMDGPU::S_MOV_B32_term : AMDGPU::S_MOV_B64_term;
740   const unsigned XorTermOpc = Subtarget.isWave32() ?
741     AMDGPU::S_XOR_B32_term : AMDGPU::S_XOR_B64_term;
742   const unsigned AndSaveExecOpc =  Subtarget.isWave32() ?
743     AMDGPU::S_AND_SAVEEXEC_B32 : AMDGPU::S_AND_SAVEEXEC_B64;
744   const unsigned ExecReg =  Subtarget.isWave32() ?
745     AMDGPU::EXEC_LO : AMDGPU::EXEC;
746 
747 #ifndef NDEBUG
748   const int OrigRangeSize = std::distance(Range.begin(), Range.end());
749 #endif
750 
751   for (MachineInstr &MI : Range) {
752     for (MachineOperand &Def : MI.defs()) {
753       LLT ResTy = MRI.getType(Def.getReg());
754       const RegisterBank *DefBank = getRegBank(Def.getReg(), MRI, *TRI);
755       ResultRegs.push_back(Def.getReg());
756       Register InitReg = B.buildUndef(ResTy).getReg(0);
757       Register PhiReg = MRI.createGenericVirtualRegister(ResTy);
758       InitResultRegs.push_back(InitReg);
759       PhiRegs.push_back(PhiReg);
760       MRI.setRegBank(PhiReg, *DefBank);
761       MRI.setRegBank(InitReg, *DefBank);
762     }
763   }
764 
765   Register SaveExecReg = MRI.createVirtualRegister(WaveRC);
766   Register InitSaveExecReg = MRI.createVirtualRegister(WaveRC);
767 
768   // Don't bother using generic instructions/registers for the exec mask.
769   B.buildInstr(TargetOpcode::IMPLICIT_DEF)
770     .addDef(InitSaveExecReg);
771 
772   Register PhiExec = MRI.createVirtualRegister(WaveRC);
773   Register NewExec = MRI.createVirtualRegister(WaveRC);
774 
775   // To insert the loop we need to split the block. Move everything before this
776   // point to a new block, and insert a new empty block before this instruction.
777   MachineBasicBlock *LoopBB = MF->CreateMachineBasicBlock();
778   MachineBasicBlock *RemainderBB = MF->CreateMachineBasicBlock();
779   MachineBasicBlock *RestoreExecBB = MF->CreateMachineBasicBlock();
780   MachineFunction::iterator MBBI(MBB);
781   ++MBBI;
782   MF->insert(MBBI, LoopBB);
783   MF->insert(MBBI, RestoreExecBB);
784   MF->insert(MBBI, RemainderBB);
785 
786   LoopBB->addSuccessor(RestoreExecBB);
787   LoopBB->addSuccessor(LoopBB);
788 
789   // Move the rest of the block into a new block.
790   RemainderBB->transferSuccessorsAndUpdatePHIs(&MBB);
791   RemainderBB->splice(RemainderBB->begin(), &MBB, Range.end(), MBB.end());
792 
793   MBB.addSuccessor(LoopBB);
794   RestoreExecBB->addSuccessor(RemainderBB);
795 
796   B.setInsertPt(*LoopBB, LoopBB->end());
797 
798   B.buildInstr(TargetOpcode::PHI)
799     .addDef(PhiExec)
800     .addReg(InitSaveExecReg)
801     .addMBB(&MBB)
802     .addReg(NewExec)
803     .addMBB(LoopBB);
804 
805   for (auto Result : zip(InitResultRegs, ResultRegs, PhiRegs)) {
806     B.buildInstr(TargetOpcode::G_PHI)
807       .addDef(std::get<2>(Result))
808       .addReg(std::get<0>(Result)) // Initial value / implicit_def
809       .addMBB(&MBB)
810       .addReg(std::get<1>(Result)) // Mid-loop value.
811       .addMBB(LoopBB);
812   }
813 
814   const DebugLoc &DL = B.getDL();
815 
816   MachineInstr &FirstInst = *Range.begin();
817 
818   // Move the instruction into the loop. Note we moved everything after
819   // Range.end() already into a new block, so Range.end() is no longer valid.
820   LoopBB->splice(LoopBB->end(), &MBB, Range.begin(), MBB.end());
821 
822   // Figure out the iterator range after splicing the instructions.
823   MachineBasicBlock::iterator NewBegin = FirstInst.getIterator();
824   auto NewEnd = LoopBB->end();
825 
826   MachineBasicBlock::iterator I = Range.begin();
827   B.setInsertPt(*LoopBB, I);
828 
829   Register CondReg;
830 
831   assert(std::distance(NewBegin, NewEnd) == OrigRangeSize);
832 
833   for (MachineInstr &MI : make_range(NewBegin, NewEnd)) {
834     for (MachineOperand &Op : MI.uses()) {
835       if (!Op.isReg() || Op.isDef())
836         continue;
837 
838       Register OldReg = Op.getReg();
839       if (!SGPROperandRegs.count(OldReg))
840         continue;
841 
842       // See if we already processed this register in another instruction in the
843       // sequence.
844       auto OldVal = WaterfalledRegMap.find(OldReg);
845       if (OldVal != WaterfalledRegMap.end()) {
846         Op.setReg(OldVal->second);
847         continue;
848       }
849 
850       LLT OpTy = MRI.getType(Op.getReg());
851       unsigned OpSize = OpTy.getSizeInBits();
852 
853       // Can only do a readlane of 32-bit pieces.
854       if (OpSize == 32) {
855         // Avoid extra copies in the simple case of one 32-bit register.
856         Register CurrentLaneOpReg
857           = MRI.createVirtualRegister(&AMDGPU::SReg_32_XM0RegClass);
858         MRI.setType(CurrentLaneOpReg, OpTy);
859 
860         constrainGenericRegister(Op.getReg(), AMDGPU::VGPR_32RegClass, MRI);
861         // Read the next variant <- also loop target.
862         BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
863                 CurrentLaneOpReg)
864           .addReg(Op.getReg());
865 
866         Register NewCondReg = MRI.createVirtualRegister(WaveRC);
867         bool First = CondReg == AMDGPU::NoRegister;
868         if (First)
869           CondReg = NewCondReg;
870 
871         // Compare the just read M0 value to all possible Idx values.
872         B.buildInstr(AMDGPU::V_CMP_EQ_U32_e64)
873           .addDef(NewCondReg)
874           .addReg(CurrentLaneOpReg)
875           .addReg(Op.getReg());
876         Op.setReg(CurrentLaneOpReg);
877 
878         if (!First) {
879           Register AndReg = MRI.createVirtualRegister(WaveRC);
880 
881           // If there are multiple operands to consider, and the conditions.
882           B.buildInstr(WaveAndOpc)
883             .addDef(AndReg)
884             .addReg(NewCondReg)
885             .addReg(CondReg);
886           CondReg = AndReg;
887         }
888       } else {
889         LLT S32 = LLT::scalar(32);
890         SmallVector<Register, 8> ReadlanePieces;
891 
892         // The compares can be done as 64-bit, but the extract needs to be done
893         // in 32-bit pieces.
894 
895         bool Is64 = OpSize % 64 == 0;
896 
897         LLT UnmergeTy = OpSize % 64 == 0 ? LLT::scalar(64) : LLT::scalar(32);
898         unsigned CmpOp = OpSize % 64 == 0 ? AMDGPU::V_CMP_EQ_U64_e64
899           : AMDGPU::V_CMP_EQ_U32_e64;
900 
901         // The compares can be done as 64-bit, but the extract needs to be done
902         // in 32-bit pieces.
903 
904         // Insert the unmerge before the loop.
905 
906         B.setMBB(MBB);
907         auto Unmerge = B.buildUnmerge(UnmergeTy, Op.getReg());
908         B.setInstr(*I);
909 
910         unsigned NumPieces = Unmerge->getNumOperands() - 1;
911         for (unsigned PieceIdx = 0; PieceIdx != NumPieces; ++PieceIdx) {
912           Register UnmergePiece = Unmerge.getReg(PieceIdx);
913 
914           Register CurrentLaneOpReg;
915           if (Is64) {
916             Register CurrentLaneOpRegLo = MRI.createGenericVirtualRegister(S32);
917             Register CurrentLaneOpRegHi = MRI.createGenericVirtualRegister(S32);
918 
919             MRI.setRegClass(UnmergePiece, &AMDGPU::VReg_64RegClass);
920             MRI.setRegClass(CurrentLaneOpRegLo, &AMDGPU::SReg_32_XM0RegClass);
921             MRI.setRegClass(CurrentLaneOpRegHi, &AMDGPU::SReg_32_XM0RegClass);
922 
923             // Read the next variant <- also loop target.
924             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
925                     CurrentLaneOpRegLo)
926               .addReg(UnmergePiece, 0, AMDGPU::sub0);
927 
928             // Read the next variant <- also loop target.
929             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
930                     CurrentLaneOpRegHi)
931               .addReg(UnmergePiece, 0, AMDGPU::sub1);
932 
933             CurrentLaneOpReg =
934               B.buildMerge(LLT::scalar(64),
935                            {CurrentLaneOpRegLo, CurrentLaneOpRegHi})
936               .getReg(0);
937 
938             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_64_XEXECRegClass);
939 
940             if (OpTy.getScalarSizeInBits() == 64) {
941               // If we need to produce a 64-bit element vector, so use the
942               // merged pieces
943               ReadlanePieces.push_back(CurrentLaneOpReg);
944             } else {
945               // 32-bit element type.
946               ReadlanePieces.push_back(CurrentLaneOpRegLo);
947               ReadlanePieces.push_back(CurrentLaneOpRegHi);
948             }
949           } else {
950             CurrentLaneOpReg = MRI.createGenericVirtualRegister(S32);
951             MRI.setRegClass(UnmergePiece, &AMDGPU::VGPR_32RegClass);
952             MRI.setRegClass(CurrentLaneOpReg, &AMDGPU::SReg_32_XM0RegClass);
953 
954             // Read the next variant <- also loop target.
955             BuildMI(*LoopBB, I, DL, TII->get(AMDGPU::V_READFIRSTLANE_B32),
956                     CurrentLaneOpReg)
957               .addReg(UnmergePiece);
958             ReadlanePieces.push_back(CurrentLaneOpReg);
959           }
960 
961           Register NewCondReg = MRI.createVirtualRegister(WaveRC);
962           bool First = CondReg == AMDGPU::NoRegister;
963           if (First)
964             CondReg = NewCondReg;
965 
966           B.buildInstr(CmpOp)
967             .addDef(NewCondReg)
968             .addReg(CurrentLaneOpReg)
969             .addReg(UnmergePiece);
970 
971           if (!First) {
972             Register AndReg = MRI.createVirtualRegister(WaveRC);
973 
974             // If there are multiple operands to consider, and the conditions.
975             B.buildInstr(WaveAndOpc)
976               .addDef(AndReg)
977               .addReg(NewCondReg)
978               .addReg(CondReg);
979             CondReg = AndReg;
980           }
981         }
982 
983         // FIXME: Build merge seems to switch to CONCAT_VECTORS but not
984         // BUILD_VECTOR
985         if (OpTy.isVector()) {
986           auto Merge = B.buildBuildVector(OpTy, ReadlanePieces);
987           Op.setReg(Merge.getReg(0));
988         } else {
989           auto Merge = B.buildMerge(OpTy, ReadlanePieces);
990           Op.setReg(Merge.getReg(0));
991         }
992 
993         MRI.setRegBank(Op.getReg(), AMDGPU::SGPRRegBank);
994       }
995 
996       // Make sure we don't re-process this register again.
997       WaterfalledRegMap.insert(std::make_pair(OldReg, Op.getReg()));
998     }
999   }
1000 
1001   B.setInsertPt(*LoopBB, LoopBB->end());
1002 
1003   // Update EXEC, save the original EXEC value to VCC.
1004   B.buildInstr(AndSaveExecOpc)
1005     .addDef(NewExec)
1006     .addReg(CondReg, RegState::Kill);
1007 
1008   MRI.setSimpleHint(NewExec, CondReg);
1009 
1010   // Update EXEC, switch all done bits to 0 and all todo bits to 1.
1011   B.buildInstr(XorTermOpc)
1012     .addDef(ExecReg)
1013     .addReg(ExecReg)
1014     .addReg(NewExec);
1015 
1016   // XXX - s_xor_b64 sets scc to 1 if the result is nonzero, so can we use
1017   // s_cbranch_scc0?
1018 
1019   // Loop back to V_READFIRSTLANE_B32 if there are still variants to cover.
1020   B.buildInstr(AMDGPU::S_CBRANCH_EXECNZ)
1021     .addMBB(LoopBB);
1022 
1023   // Save the EXEC mask before the loop.
1024   BuildMI(MBB, MBB.end(), DL, TII->get(MovTermOpc), SaveExecReg)
1025     .addReg(ExecReg);
1026 
1027   // Restore the EXEC mask after the loop.
1028   B.setMBB(*RestoreExecBB);
1029   B.buildInstr(MovTermOpc)
1030     .addDef(ExecReg)
1031     .addReg(SaveExecReg);
1032 
1033   // Set the insert point after the original instruction, so any new
1034   // instructions will be in the remainder.
1035   B.setInsertPt(*RemainderBB, RemainderBB->begin());
1036 
1037   return true;
1038 }
1039 
1040 // Return any unique registers used by \p MI at \p OpIndices that need to be
1041 // handled in a waterfall loop. Returns these registers in \p
1042 // SGPROperandRegs. Returns true if there are any operansd to handle and a
1043 // waterfall loop is necessary.
1044 bool AMDGPURegisterBankInfo::collectWaterfallOperands(
1045   SmallSet<Register, 4> &SGPROperandRegs, MachineInstr &MI,
1046   MachineRegisterInfo &MRI, ArrayRef<unsigned> OpIndices) const {
1047   for (unsigned Op : OpIndices) {
1048     assert(MI.getOperand(Op).isUse());
1049     Register Reg = MI.getOperand(Op).getReg();
1050     const RegisterBank *OpBank = getRegBank(Reg, MRI, *TRI);
1051     if (OpBank->getID() == AMDGPU::VGPRRegBankID)
1052       SGPROperandRegs.insert(Reg);
1053   }
1054 
1055   // No operands need to be replaced, so no need to loop.
1056   return !SGPROperandRegs.empty();
1057 }
1058 
1059 bool AMDGPURegisterBankInfo::executeInWaterfallLoop(
1060   MachineIRBuilder &B, MachineInstr &MI, MachineRegisterInfo &MRI,
1061   ArrayRef<unsigned> OpIndices) const {
1062   // Use a set to avoid extra readfirstlanes in the case where multiple operands
1063   // are the same register.
1064   SmallSet<Register, 4> SGPROperandRegs;
1065 
1066   if (!collectWaterfallOperands(SGPROperandRegs, MI, MRI, OpIndices))
1067     return false;
1068 
1069   MachineBasicBlock::iterator I = MI.getIterator();
1070   return executeInWaterfallLoop(B, make_range(I, std::next(I)),
1071                                 SGPROperandRegs, MRI);
1072 }
1073 
1074 bool AMDGPURegisterBankInfo::executeInWaterfallLoop(
1075   MachineInstr &MI, MachineRegisterInfo &MRI,
1076   ArrayRef<unsigned> OpIndices) const {
1077   MachineIRBuilder B(MI);
1078   return executeInWaterfallLoop(B, MI, MRI, OpIndices);
1079 }
1080 
1081 // Legalize an operand that must be an SGPR by inserting a readfirstlane.
1082 void AMDGPURegisterBankInfo::constrainOpWithReadfirstlane(
1083     MachineInstr &MI, MachineRegisterInfo &MRI, unsigned OpIdx) const {
1084   Register Reg = MI.getOperand(OpIdx).getReg();
1085   const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI);
1086   if (Bank != &AMDGPU::VGPRRegBank)
1087     return;
1088 
1089   MachineIRBuilder B(MI);
1090   Register SGPR = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
1091   B.buildInstr(AMDGPU::V_READFIRSTLANE_B32)
1092     .addDef(SGPR)
1093     .addReg(Reg);
1094 
1095   MRI.setType(SGPR, MRI.getType(Reg));
1096 
1097   const TargetRegisterClass *Constrained =
1098       constrainGenericRegister(Reg, AMDGPU::VGPR_32RegClass, MRI);
1099   (void)Constrained;
1100   assert(Constrained && "Failed to constrain readfirstlane src reg");
1101 
1102   MI.getOperand(OpIdx).setReg(SGPR);
1103 }
1104 
1105 bool AMDGPURegisterBankInfo::applyMappingWideLoad(MachineInstr &MI,
1106                         const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper,
1107                                               MachineRegisterInfo &MRI) const {
1108   Register DstReg = MI.getOperand(0).getReg();
1109   const LLT LoadTy =  MRI.getType(DstReg);
1110   unsigned LoadSize = LoadTy.getSizeInBits();
1111   const unsigned MaxNonSmrdLoadSize = 128;
1112   // 128-bit loads are supported for all instruction types.
1113   if (LoadSize <= MaxNonSmrdLoadSize)
1114     return false;
1115 
1116   SmallVector<unsigned, 16> DefRegs(OpdMapper.getVRegs(0));
1117   SmallVector<unsigned, 1> SrcRegs(OpdMapper.getVRegs(1));
1118 
1119   // If the pointer is an SGPR, we have nothing to do.
1120   if (SrcRegs.empty()) {
1121     const RegisterBank *PtrBank =
1122       OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
1123     if (PtrBank == &AMDGPU::SGPRRegBank)
1124       return false;
1125     SrcRegs.push_back(MI.getOperand(1).getReg());
1126   }
1127 
1128   assert(LoadSize % MaxNonSmrdLoadSize == 0);
1129 
1130   // RegBankSelect only emits scalar types, so we need to reset the pointer
1131   // operand to a pointer type.
1132   Register BasePtrReg = SrcRegs[0];
1133   LLT PtrTy = MRI.getType(MI.getOperand(1).getReg());
1134   MRI.setType(BasePtrReg, PtrTy);
1135 
1136   MachineIRBuilder B(MI);
1137 
1138   unsigned NumSplitParts = LoadTy.getSizeInBits() / MaxNonSmrdLoadSize;
1139   const LLT LoadSplitTy = LoadTy.divide(NumSplitParts);
1140   ApplyRegBankMapping O(*this, MRI, &AMDGPU::VGPRRegBank);
1141   GISelObserverWrapper Observer(&O);
1142   B.setChangeObserver(Observer);
1143   LegalizerHelper Helper(B.getMF(), Observer, B);
1144 
1145   if (LoadTy.isVector()) {
1146     if (Helper.fewerElementsVector(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
1147       return false;
1148   } else {
1149     if (Helper.narrowScalar(MI, 0, LoadSplitTy) != LegalizerHelper::Legalized)
1150       return false;
1151   }
1152 
1153   MRI.setRegBank(DstReg, AMDGPU::VGPRRegBank);
1154   return true;
1155 }
1156 
1157 bool AMDGPURegisterBankInfo::applyMappingDynStackAlloc(
1158   MachineInstr &MI,
1159   const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper,
1160   MachineRegisterInfo &MRI) const {
1161   const MachineFunction &MF = *MI.getMF();
1162   const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
1163   const auto &TFI = *ST.getFrameLowering();
1164 
1165   // Guard in case the stack growth direction ever changes with scratch
1166   // instructions.
1167   if (TFI.getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown)
1168     return false;
1169 
1170   Register Dst = MI.getOperand(0).getReg();
1171   Register AllocSize = MI.getOperand(1).getReg();
1172   Align Alignment = assumeAligned(MI.getOperand(2).getImm());
1173 
1174   const RegisterBank *SizeBank = getRegBank(AllocSize, MRI, *TRI);
1175 
1176   // TODO: Need to emit a wave reduction to get the maximum size.
1177   if (SizeBank != &AMDGPU::SGPRRegBank)
1178     return false;
1179 
1180   LLT PtrTy = MRI.getType(Dst);
1181   LLT IntPtrTy = LLT::scalar(PtrTy.getSizeInBits());
1182 
1183   const SIMachineFunctionInfo *Info = MF.getInfo<SIMachineFunctionInfo>();
1184   Register SPReg = Info->getStackPtrOffsetReg();
1185   ApplyRegBankMapping ApplyBank(*this, MRI, &AMDGPU::SGPRRegBank);
1186   GISelObserverWrapper Observer(&ApplyBank);
1187 
1188   MachineIRBuilder B(MI);
1189   B.setChangeObserver(Observer);
1190 
1191   auto WaveSize = B.buildConstant(LLT::scalar(32), ST.getWavefrontSizeLog2());
1192   auto ScaledSize = B.buildShl(IntPtrTy, AllocSize, WaveSize);
1193 
1194   auto SPCopy = B.buildCopy(PtrTy, SPReg);
1195   if (Alignment > TFI.getStackAlign()) {
1196     auto PtrAdd = B.buildPtrAdd(PtrTy, SPCopy, ScaledSize);
1197     B.buildMaskLowPtrBits(Dst, PtrAdd,
1198                           Log2(Alignment) + ST.getWavefrontSizeLog2());
1199   } else {
1200     B.buildPtrAdd(Dst, SPCopy, ScaledSize);
1201   }
1202 
1203   MI.eraseFromParent();
1204   return true;
1205 }
1206 
1207 bool AMDGPURegisterBankInfo::applyMappingImage(
1208     MachineInstr &MI, const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper,
1209     MachineRegisterInfo &MRI, int RsrcIdx) const {
1210   const int NumDefs = MI.getNumExplicitDefs();
1211 
1212   // The reported argument index is relative to the IR intrinsic call arguments,
1213   // so we need to shift by the number of defs and the intrinsic ID.
1214   RsrcIdx += NumDefs + 1;
1215 
1216   // Insert copies to VGPR arguments.
1217   applyDefaultMapping(OpdMapper);
1218 
1219   // Fixup any SGPR arguments.
1220   SmallVector<unsigned, 4> SGPRIndexes;
1221   for (int I = NumDefs, NumOps = MI.getNumOperands(); I != NumOps; ++I) {
1222     if (!MI.getOperand(I).isReg())
1223       continue;
1224 
1225     // If this intrinsic has a sampler, it immediately follows rsrc.
1226     if (I == RsrcIdx || I == RsrcIdx + 1)
1227       SGPRIndexes.push_back(I);
1228   }
1229 
1230   executeInWaterfallLoop(MI, MRI, SGPRIndexes);
1231   return true;
1232 }
1233 
1234 static Register getSrcRegIgnoringCopies(const MachineRegisterInfo &MRI,
1235                                         Register Reg) {
1236   MachineInstr *Def = getDefIgnoringCopies(Reg, MRI);
1237   if (!Def)
1238     return Reg;
1239 
1240   // TODO: Guard against this being an implicit def
1241   return Def->getOperand(0).getReg();
1242 }
1243 
1244 // Analyze a combined offset from an llvm.amdgcn.s.buffer intrinsic and store
1245 // the three offsets (voffset, soffset and instoffset)
1246 static unsigned setBufferOffsets(MachineIRBuilder &B,
1247                                  const AMDGPURegisterBankInfo &RBI,
1248                                  Register CombinedOffset,
1249                                  Register &VOffsetReg,
1250                                  Register &SOffsetReg,
1251                                  int64_t &InstOffsetVal,
1252                                  unsigned Align) {
1253   const LLT S32 = LLT::scalar(32);
1254   MachineRegisterInfo *MRI = B.getMRI();
1255 
1256   if (Optional<int64_t> Imm = getConstantVRegVal(CombinedOffset, *MRI)) {
1257     uint32_t SOffset, ImmOffset;
1258     if (AMDGPU::splitMUBUFOffset(*Imm, SOffset, ImmOffset,
1259                                  &RBI.Subtarget, Align)) {
1260       VOffsetReg = B.buildConstant(S32, 0).getReg(0);
1261       SOffsetReg = B.buildConstant(S32, SOffset).getReg(0);
1262       InstOffsetVal = ImmOffset;
1263 
1264       B.getMRI()->setRegBank(VOffsetReg, AMDGPU::VGPRRegBank);
1265       B.getMRI()->setRegBank(SOffsetReg, AMDGPU::SGPRRegBank);
1266       return SOffset + ImmOffset;
1267     }
1268   }
1269 
1270   Register Base;
1271   unsigned Offset;
1272   MachineInstr *Unused;
1273 
1274   std::tie(Base, Offset, Unused)
1275     = AMDGPU::getBaseWithConstantOffset(*MRI, CombinedOffset);
1276 
1277   uint32_t SOffset, ImmOffset;
1278   if (Offset > 0 && AMDGPU::splitMUBUFOffset(Offset, SOffset, ImmOffset,
1279                                              &RBI.Subtarget, Align)) {
1280     if (RBI.getRegBank(Base, *MRI, *RBI.TRI) == &AMDGPU::VGPRRegBank) {
1281       VOffsetReg = Base;
1282       SOffsetReg = B.buildConstant(S32, SOffset).getReg(0);
1283       B.getMRI()->setRegBank(SOffsetReg, AMDGPU::SGPRRegBank);
1284       InstOffsetVal = ImmOffset;
1285       return 0; // XXX - Why is this 0?
1286     }
1287 
1288     // If we have SGPR base, we can use it for soffset.
1289     if (SOffset == 0) {
1290       VOffsetReg = B.buildConstant(S32, 0).getReg(0);
1291       B.getMRI()->setRegBank(VOffsetReg, AMDGPU::VGPRRegBank);
1292       SOffsetReg = Base;
1293       InstOffsetVal = ImmOffset;
1294       return 0; // XXX - Why is this 0?
1295     }
1296   }
1297 
1298   // Handle the variable sgpr + vgpr case.
1299   if (MachineInstr *Add = getOpcodeDef(AMDGPU::G_ADD, CombinedOffset, *MRI)) {
1300     Register Src0 = getSrcRegIgnoringCopies(*MRI, Add->getOperand(1).getReg());
1301     Register Src1 = getSrcRegIgnoringCopies(*MRI, Add->getOperand(2).getReg());
1302 
1303     const RegisterBank *Src0Bank = RBI.getRegBank(Src0, *MRI, *RBI.TRI);
1304     const RegisterBank *Src1Bank = RBI.getRegBank(Src1, *MRI, *RBI.TRI);
1305 
1306     if (Src0Bank == &AMDGPU::VGPRRegBank && Src1Bank == &AMDGPU::SGPRRegBank) {
1307       VOffsetReg = Src0;
1308       SOffsetReg = Src1;
1309       return 0;
1310     }
1311 
1312     if (Src0Bank == &AMDGPU::SGPRRegBank && Src1Bank == &AMDGPU::VGPRRegBank) {
1313       VOffsetReg = Src1;
1314       SOffsetReg = Src0;
1315       return 0;
1316     }
1317   }
1318 
1319   // Ensure we have a VGPR for the combined offset. This could be an issue if we
1320   // have an SGPR offset and a VGPR resource.
1321   if (RBI.getRegBank(CombinedOffset, *MRI, *RBI.TRI) == &AMDGPU::VGPRRegBank) {
1322     VOffsetReg = CombinedOffset;
1323   } else {
1324     VOffsetReg = B.buildCopy(S32, CombinedOffset).getReg(0);
1325     B.getMRI()->setRegBank(VOffsetReg, AMDGPU::VGPRRegBank);
1326   }
1327 
1328   SOffsetReg = B.buildConstant(S32, 0).getReg(0);
1329   B.getMRI()->setRegBank(SOffsetReg, AMDGPU::SGPRRegBank);
1330   return 0;
1331 }
1332 
1333 bool AMDGPURegisterBankInfo::applyMappingSBufferLoad(
1334   const OperandsMapper &OpdMapper) const {
1335   MachineInstr &MI = OpdMapper.getMI();
1336   MachineRegisterInfo &MRI = OpdMapper.getMRI();
1337 
1338   const LLT S32 = LLT::scalar(32);
1339   Register Dst = MI.getOperand(0).getReg();
1340   LLT Ty = MRI.getType(Dst);
1341 
1342   const RegisterBank *RSrcBank =
1343     OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
1344   const RegisterBank *OffsetBank =
1345     OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
1346   if (RSrcBank == &AMDGPU::SGPRRegBank &&
1347       OffsetBank == &AMDGPU::SGPRRegBank)
1348     return true; // Legal mapping
1349 
1350   // FIXME: 96-bit case was widened during legalize. We neeed to narrow it back
1351   // here but don't have an MMO.
1352 
1353   unsigned LoadSize = Ty.getSizeInBits();
1354   int NumLoads = 1;
1355   if (LoadSize == 256 || LoadSize == 512) {
1356     NumLoads = LoadSize / 128;
1357     Ty = Ty.divide(NumLoads);
1358   }
1359 
1360   // Use the alignment to ensure that the required offsets will fit into the
1361   // immediate offsets.
1362   const unsigned Alignment = NumLoads > 1 ? 16 * NumLoads : 1;
1363 
1364   MachineIRBuilder B(MI);
1365   MachineFunction &MF = B.getMF();
1366 
1367   Register SOffset;
1368   Register VOffset;
1369   int64_t ImmOffset = 0;
1370 
1371   unsigned MMOOffset = setBufferOffsets(B, *this, MI.getOperand(2).getReg(),
1372                                         VOffset, SOffset, ImmOffset, Alignment);
1373 
1374   // TODO: 96-bit loads were widened to 128-bit results. Shrink the result if we
1375   // can, but we neeed to track an MMO for that.
1376   const unsigned MemSize = (Ty.getSizeInBits() + 7) / 8;
1377   const Align MemAlign(4); // FIXME: ABI type alignment?
1378   MachineMemOperand *BaseMMO = MF.getMachineMemOperand(
1379     MachinePointerInfo(),
1380     MachineMemOperand::MOLoad | MachineMemOperand::MODereferenceable |
1381     MachineMemOperand::MOInvariant,
1382     MemSize, MemAlign);
1383   if (MMOOffset != 0)
1384     BaseMMO = MF.getMachineMemOperand(BaseMMO, MMOOffset, MemSize);
1385 
1386   // If only the offset is divergent, emit a MUBUF buffer load instead. We can
1387   // assume that the buffer is unswizzled.
1388 
1389   Register RSrc = MI.getOperand(1).getReg();
1390   Register VIndex = B.buildConstant(S32, 0).getReg(0);
1391   B.getMRI()->setRegBank(VIndex, AMDGPU::VGPRRegBank);
1392 
1393   SmallVector<Register, 4> LoadParts(NumLoads);
1394 
1395   MachineBasicBlock::iterator MII = MI.getIterator();
1396   MachineInstrSpan Span(MII, &B.getMBB());
1397 
1398   for (int i = 0; i < NumLoads; ++i) {
1399     if (NumLoads == 1) {
1400       LoadParts[i] = Dst;
1401     } else {
1402       LoadParts[i] = MRI.createGenericVirtualRegister(Ty);
1403       MRI.setRegBank(LoadParts[i], AMDGPU::VGPRRegBank);
1404     }
1405 
1406     MachineMemOperand *MMO = BaseMMO;
1407     if (i != 0)
1408       BaseMMO = MF.getMachineMemOperand(BaseMMO, MMOOffset + 16 * i, MemSize);
1409 
1410     B.buildInstr(AMDGPU::G_AMDGPU_BUFFER_LOAD)
1411       .addDef(LoadParts[i])       // vdata
1412       .addUse(RSrc)               // rsrc
1413       .addUse(VIndex)             // vindex
1414       .addUse(VOffset)            // voffset
1415       .addUse(SOffset)            // soffset
1416       .addImm(ImmOffset + 16 * i) // offset(imm)
1417       .addImm(0)                  // cachepolicy, swizzled buffer(imm)
1418       .addImm(0)                  // idxen(imm)
1419       .addMemOperand(MMO);
1420   }
1421 
1422   // TODO: If only the resource is a VGPR, it may be better to execute the
1423   // scalar load in the waterfall loop if the resource is expected to frequently
1424   // be dynamically uniform.
1425   if (RSrcBank != &AMDGPU::SGPRRegBank) {
1426     // Remove the original instruction to avoid potentially confusing the
1427     // waterfall loop logic.
1428     B.setInstr(*Span.begin());
1429     MI.eraseFromParent();
1430 
1431     SmallSet<Register, 4> OpsToWaterfall;
1432 
1433     OpsToWaterfall.insert(RSrc);
1434     executeInWaterfallLoop(B, make_range(Span.begin(), Span.end()),
1435                            OpsToWaterfall, MRI);
1436   }
1437 
1438   if (NumLoads != 1) {
1439     if (Ty.isVector())
1440       B.buildConcatVectors(Dst, LoadParts);
1441     else
1442       B.buildMerge(Dst, LoadParts);
1443   }
1444 
1445   // We removed the instruction earlier with a waterfall loop.
1446   if (RSrcBank == &AMDGPU::SGPRRegBank)
1447     MI.eraseFromParent();
1448 
1449   return true;
1450 }
1451 
1452 bool AMDGPURegisterBankInfo::applyMappingBFEIntrinsic(
1453   const OperandsMapper &OpdMapper, bool Signed) const {
1454   MachineInstr &MI = OpdMapper.getMI();
1455   MachineRegisterInfo &MRI = OpdMapper.getMRI();
1456 
1457   // Insert basic copies
1458   applyDefaultMapping(OpdMapper);
1459 
1460   Register DstReg = MI.getOperand(0).getReg();
1461   LLT Ty = MRI.getType(DstReg);
1462 
1463   const LLT S32 = LLT::scalar(32);
1464 
1465   const RegisterBank *DstBank =
1466     OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
1467   if (DstBank == &AMDGPU::VGPRRegBank) {
1468     if (Ty == S32)
1469       return true;
1470 
1471     // TODO: 64-bit version is scalar only, so we need to expand this.
1472     return false;
1473   }
1474 
1475   Register SrcReg = MI.getOperand(2).getReg();
1476   Register OffsetReg = MI.getOperand(3).getReg();
1477   Register WidthReg = MI.getOperand(4).getReg();
1478 
1479   // The scalar form packs the offset and width in a single operand.
1480 
1481   ApplyRegBankMapping ApplyBank(*this, MRI, &AMDGPU::SGPRRegBank);
1482   GISelObserverWrapper Observer(&ApplyBank);
1483   MachineIRBuilder B(MI);
1484   B.setChangeObserver(Observer);
1485 
1486   // Ensure the high bits are clear to insert the offset.
1487   auto OffsetMask = B.buildConstant(S32, maskTrailingOnes<unsigned>(6));
1488   auto ClampOffset = B.buildAnd(S32, OffsetReg, OffsetMask);
1489 
1490   // Zeros out the low bits, so don't bother clamping the input value.
1491   auto ShiftWidth = B.buildShl(S32, WidthReg, B.buildConstant(S32, 16));
1492 
1493   // Transformation function, pack the offset and width of a BFE into
1494   // the format expected by the S_BFE_I32 / S_BFE_U32. In the second
1495   // source, bits [5:0] contain the offset and bits [22:16] the width.
1496   auto MergedInputs = B.buildOr(S32, ClampOffset, ShiftWidth);
1497 
1498   // TODO: It might be worth using a pseudo here to avoid scc clobber and
1499   // register class constraints.
1500   unsigned Opc = Ty == S32 ? (Signed ? AMDGPU::S_BFE_I32 : AMDGPU::S_BFE_U32) :
1501                              (Signed ? AMDGPU::S_BFE_I64 : AMDGPU::S_BFE_U64);
1502 
1503   auto MIB = B.buildInstr(Opc, {DstReg}, {SrcReg, MergedInputs});
1504   if (!constrainSelectedInstRegOperands(*MIB, *TII, *TRI, *this))
1505     llvm_unreachable("failed to constrain BFE");
1506 
1507   MI.eraseFromParent();
1508   return true;
1509 }
1510 
1511 // FIXME: Duplicated from LegalizerHelper
1512 static CmpInst::Predicate minMaxToCompare(unsigned Opc) {
1513   switch (Opc) {
1514   case TargetOpcode::G_SMIN:
1515     return CmpInst::ICMP_SLT;
1516   case TargetOpcode::G_SMAX:
1517     return CmpInst::ICMP_SGT;
1518   case TargetOpcode::G_UMIN:
1519     return CmpInst::ICMP_ULT;
1520   case TargetOpcode::G_UMAX:
1521     return CmpInst::ICMP_UGT;
1522   default:
1523     llvm_unreachable("not in integer min/max");
1524   }
1525 }
1526 
1527 static unsigned minMaxToExtend(unsigned Opc) {
1528   switch (Opc) {
1529   case TargetOpcode::G_SMIN:
1530   case TargetOpcode::G_SMAX:
1531     return TargetOpcode::G_SEXT;
1532   case TargetOpcode::G_UMIN:
1533   case TargetOpcode::G_UMAX:
1534     return TargetOpcode::G_ZEXT;
1535   default:
1536     llvm_unreachable("not in integer min/max");
1537   }
1538 }
1539 
1540 // Emit a legalized extension from <2 x s16> to 2 32-bit components, avoiding
1541 // any illegal vector extend or unmerge operations.
1542 static std::pair<Register, Register>
1543 unpackV2S16ToS32(MachineIRBuilder &B, Register Src, unsigned ExtOpcode) {
1544   const LLT S32 = LLT::scalar(32);
1545   auto Bitcast = B.buildBitcast(S32, Src);
1546 
1547   if (ExtOpcode == TargetOpcode::G_SEXT) {
1548     auto ExtLo = B.buildSExtInReg(S32, Bitcast, 16);
1549     auto ShiftHi = B.buildAShr(S32, Bitcast, B.buildConstant(S32, 16));
1550     return std::make_pair(ExtLo.getReg(0), ShiftHi.getReg(0));
1551   }
1552 
1553   auto ShiftHi = B.buildLShr(S32, Bitcast, B.buildConstant(S32, 16));
1554   if (ExtOpcode == TargetOpcode::G_ZEXT) {
1555     auto ExtLo = B.buildAnd(S32, Bitcast, B.buildConstant(S32, 0xffff));
1556     return std::make_pair(ExtLo.getReg(0), ShiftHi.getReg(0));
1557   }
1558 
1559   assert(ExtOpcode == TargetOpcode::G_ANYEXT);
1560   return std::make_pair(Bitcast.getReg(0), ShiftHi.getReg(0));
1561 }
1562 
1563 static MachineInstr *buildExpandedScalarMinMax(MachineIRBuilder &B,
1564                                                CmpInst::Predicate Pred,
1565                                                Register Dst, Register Src0,
1566                                                Register Src1) {
1567   const LLT CmpType = LLT::scalar(32);
1568   auto Cmp = B.buildICmp(Pred, CmpType, Src0, Src1);
1569   return B.buildSelect(Dst, Cmp, Src0, Src1);
1570 }
1571 
1572 // FIXME: Duplicated from LegalizerHelper, except changing the boolean type.
1573 void AMDGPURegisterBankInfo::lowerScalarMinMax(MachineIRBuilder &B,
1574                                                MachineInstr &MI) const {
1575   Register Dst = MI.getOperand(0).getReg();
1576   Register Src0 = MI.getOperand(1).getReg();
1577   Register Src1 = MI.getOperand(2).getReg();
1578 
1579   const CmpInst::Predicate Pred = minMaxToCompare(MI.getOpcode());
1580   MachineInstr *Sel = buildExpandedScalarMinMax(B, Pred, Dst, Src0, Src1);
1581 
1582   Register CmpReg = Sel->getOperand(1).getReg();
1583   B.getMRI()->setRegBank(CmpReg, AMDGPU::SGPRRegBank);
1584   MI.eraseFromParent();
1585 }
1586 
1587 // For cases where only a single copy is inserted for matching register banks.
1588 // Replace the register in the instruction operand
1589 static bool substituteSimpleCopyRegs(
1590   const AMDGPURegisterBankInfo::OperandsMapper &OpdMapper, unsigned OpIdx) {
1591   SmallVector<unsigned, 1> SrcReg(OpdMapper.getVRegs(OpIdx));
1592   if (!SrcReg.empty()) {
1593     assert(SrcReg.size() == 1);
1594     OpdMapper.getMI().getOperand(OpIdx).setReg(SrcReg[0]);
1595     return true;
1596   }
1597 
1598   return false;
1599 }
1600 
1601 /// Handle register layout difference for f16 images for some subtargets.
1602 Register AMDGPURegisterBankInfo::handleD16VData(MachineIRBuilder &B,
1603                                                 MachineRegisterInfo &MRI,
1604                                                 Register Reg) const {
1605   if (!Subtarget.hasUnpackedD16VMem())
1606     return Reg;
1607 
1608   const LLT S16 = LLT::scalar(16);
1609   LLT StoreVT = MRI.getType(Reg);
1610   if (!StoreVT.isVector() || StoreVT.getElementType() != S16)
1611     return Reg;
1612 
1613   auto Unmerge = B.buildUnmerge(S16, Reg);
1614 
1615 
1616   SmallVector<Register, 4> WideRegs;
1617   for (int I = 0, E = Unmerge->getNumOperands() - 1; I != E; ++I)
1618     WideRegs.push_back(Unmerge.getReg(I));
1619 
1620   const LLT S32 = LLT::scalar(32);
1621   int NumElts = StoreVT.getNumElements();
1622 
1623   return B.buildMerge(LLT::vector(NumElts, S32), WideRegs).getReg(0);
1624 }
1625 
1626 static std::pair<Register, unsigned>
1627 getBaseWithConstantOffset(MachineRegisterInfo &MRI, Register Reg) {
1628   int64_t Const;
1629   if (mi_match(Reg, MRI, m_ICst(Const)))
1630     return std::make_pair(Register(), Const);
1631 
1632   Register Base;
1633   if (mi_match(Reg, MRI, m_GAdd(m_Reg(Base), m_ICst(Const))))
1634     return std::make_pair(Base, Const);
1635 
1636   // TODO: Handle G_OR used for add case
1637   return std::make_pair(Reg, 0);
1638 }
1639 
1640 std::pair<Register, unsigned>
1641 AMDGPURegisterBankInfo::splitBufferOffsets(MachineIRBuilder &B,
1642                                            Register OrigOffset) const {
1643   const unsigned MaxImm = 4095;
1644   Register BaseReg;
1645   unsigned ImmOffset;
1646   const LLT S32 = LLT::scalar(32);
1647 
1648   std::tie(BaseReg, ImmOffset) = getBaseWithConstantOffset(*B.getMRI(),
1649                                                            OrigOffset);
1650 
1651   unsigned C1 = 0;
1652   if (ImmOffset != 0) {
1653     // If the immediate value is too big for the immoffset field, put the value
1654     // and -4096 into the immoffset field so that the value that is copied/added
1655     // for the voffset field is a multiple of 4096, and it stands more chance
1656     // of being CSEd with the copy/add for another similar load/store.
1657     // However, do not do that rounding down to a multiple of 4096 if that is a
1658     // negative number, as it appears to be illegal to have a negative offset
1659     // in the vgpr, even if adding the immediate offset makes it positive.
1660     unsigned Overflow = ImmOffset & ~MaxImm;
1661     ImmOffset -= Overflow;
1662     if ((int32_t)Overflow < 0) {
1663       Overflow += ImmOffset;
1664       ImmOffset = 0;
1665     }
1666 
1667     C1 = ImmOffset;
1668     if (Overflow != 0) {
1669       if (!BaseReg)
1670         BaseReg = B.buildConstant(S32, Overflow).getReg(0);
1671       else {
1672         auto OverflowVal = B.buildConstant(S32, Overflow);
1673         BaseReg = B.buildAdd(S32, BaseReg, OverflowVal).getReg(0);
1674       }
1675     }
1676   }
1677 
1678   if (!BaseReg)
1679     BaseReg = B.buildConstant(S32, 0).getReg(0);
1680 
1681   return {BaseReg, C1};
1682 }
1683 
1684 static bool isZero(Register Reg, MachineRegisterInfo &MRI) {
1685   int64_t C;
1686   return mi_match(Reg, MRI, m_ICst(C)) && C == 0;
1687 }
1688 
1689 static unsigned extractGLC(unsigned CachePolicy) {
1690   return CachePolicy & 1;
1691 }
1692 
1693 static unsigned extractSLC(unsigned CachePolicy) {
1694   return (CachePolicy >> 1) & 1;
1695 }
1696 
1697 static unsigned extractDLC(unsigned CachePolicy) {
1698   return (CachePolicy >> 2) & 1;
1699 }
1700 
1701 MachineInstr *
1702 AMDGPURegisterBankInfo::selectStoreIntrinsic(MachineIRBuilder &B,
1703                                              MachineInstr &MI) const {
1704    MachineRegisterInfo &MRI = *B.getMRI();
1705   executeInWaterfallLoop(B, MI, MRI, {2, 4});
1706 
1707   // FIXME: DAG lowering brokenly changes opcode based on FP vs. integer.
1708 
1709   Register VData = MI.getOperand(1).getReg();
1710   LLT Ty = MRI.getType(VData);
1711 
1712   int EltSize = Ty.getScalarSizeInBits();
1713   int Size = Ty.getSizeInBits();
1714 
1715   // FIXME: Broken integer truncstore.
1716   if (EltSize != 32)
1717     report_fatal_error("unhandled intrinsic store");
1718 
1719   // FIXME: Verifier should enforce 1 MMO for these intrinsics.
1720   const int MemSize = (*MI.memoperands_begin())->getSize();
1721 
1722 
1723   Register RSrc = MI.getOperand(2).getReg();
1724   Register VOffset = MI.getOperand(3).getReg();
1725   Register SOffset = MI.getOperand(4).getReg();
1726   unsigned CachePolicy = MI.getOperand(5).getImm();
1727 
1728   unsigned ImmOffset;
1729   std::tie(VOffset, ImmOffset) = splitBufferOffsets(B, VOffset);
1730 
1731   const bool Offen = !isZero(VOffset, MRI);
1732 
1733   unsigned Opc = AMDGPU::BUFFER_STORE_DWORD_OFFEN_exact;
1734   switch (8 * MemSize) {
1735   case 8:
1736     Opc = Offen ? AMDGPU::BUFFER_STORE_BYTE_OFFEN_exact :
1737                   AMDGPU::BUFFER_STORE_BYTE_OFFSET_exact;
1738     break;
1739   case 16:
1740     Opc = Offen ? AMDGPU::BUFFER_STORE_SHORT_OFFEN_exact :
1741                   AMDGPU::BUFFER_STORE_SHORT_OFFSET_exact;
1742     break;
1743   default:
1744     Opc = Offen ? AMDGPU::BUFFER_STORE_DWORD_OFFEN_exact :
1745                   AMDGPU::BUFFER_STORE_DWORD_OFFSET_exact;
1746     if (Size > 32)
1747       Opc = AMDGPU::getMUBUFOpcode(Opc, Size / 32);
1748     break;
1749   }
1750 
1751 
1752   // Set the insertion point back to the instruction in case it was moved into a
1753   // loop.
1754   B.setInstr(MI);
1755 
1756   MachineInstrBuilder MIB = B.buildInstr(Opc)
1757     .addUse(VData);
1758 
1759   if (Offen)
1760     MIB.addUse(VOffset);
1761 
1762   MIB.addUse(RSrc)
1763      .addUse(SOffset)
1764      .addImm(ImmOffset)
1765      .addImm(extractGLC(CachePolicy))
1766      .addImm(extractSLC(CachePolicy))
1767      .addImm(0) // tfe: FIXME: Remove from inst
1768      .addImm(extractDLC(CachePolicy))
1769      .cloneMemRefs(MI);
1770 
1771   // FIXME: We need a way to report failure from applyMappingImpl.
1772   // Insert constrain copies before inserting the loop.
1773   if (!constrainSelectedInstRegOperands(*MIB, *TII, *TRI, *this))
1774     report_fatal_error("failed to constrain selected store intrinsic");
1775 
1776   return MIB;
1777 }
1778 
1779 bool AMDGPURegisterBankInfo::buildVCopy(MachineIRBuilder &B, Register DstReg,
1780                                         Register SrcReg) const {
1781   MachineRegisterInfo &MRI = *B.getMRI();
1782   LLT SrcTy = MRI.getType(SrcReg);
1783   if (SrcTy.getSizeInBits() == 32) {
1784     // Use a v_mov_b32 here to make the exec dependency explicit.
1785     B.buildInstr(AMDGPU::V_MOV_B32_e32)
1786       .addDef(DstReg)
1787       .addUse(SrcReg);
1788     return constrainGenericRegister(DstReg, AMDGPU::VGPR_32RegClass, MRI) &&
1789            constrainGenericRegister(SrcReg, AMDGPU::SReg_32RegClass, MRI);
1790   }
1791 
1792   Register TmpReg0 = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1793   Register TmpReg1 = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1794 
1795   B.buildInstr(AMDGPU::V_MOV_B32_e32)
1796     .addDef(TmpReg0)
1797     .addUse(SrcReg, 0, AMDGPU::sub0);
1798   B.buildInstr(AMDGPU::V_MOV_B32_e32)
1799     .addDef(TmpReg1)
1800     .addUse(SrcReg, 0, AMDGPU::sub1);
1801   B.buildInstr(AMDGPU::REG_SEQUENCE)
1802     .addDef(DstReg)
1803     .addUse(TmpReg0)
1804     .addImm(AMDGPU::sub0)
1805     .addUse(TmpReg1)
1806     .addImm(AMDGPU::sub1);
1807 
1808   return constrainGenericRegister(SrcReg, AMDGPU::SReg_64RegClass, MRI) &&
1809          constrainGenericRegister(DstReg, AMDGPU::VReg_64RegClass, MRI);
1810 }
1811 
1812 /// Utility function for pushing dynamic vector indexes with a constant offset
1813 /// into waterwall loops.
1814 static void reinsertVectorIndexAdd(MachineIRBuilder &B,
1815                                    MachineInstr &IdxUseInstr,
1816                                    unsigned OpIdx,
1817                                    unsigned ConstOffset) {
1818   MachineRegisterInfo &MRI = *B.getMRI();
1819   const LLT S32 = LLT::scalar(32);
1820   Register WaterfallIdx = IdxUseInstr.getOperand(OpIdx).getReg();
1821   B.setInsertPt(*IdxUseInstr.getParent(), IdxUseInstr.getIterator());
1822 
1823   auto MaterializedOffset = B.buildConstant(S32, ConstOffset);
1824 
1825   auto Add = B.buildAdd(S32, WaterfallIdx, MaterializedOffset);
1826   MRI.setRegBank(MaterializedOffset.getReg(0), AMDGPU::SGPRRegBank);
1827   MRI.setRegBank(Add.getReg(0), AMDGPU::SGPRRegBank);
1828   IdxUseInstr.getOperand(OpIdx).setReg(Add.getReg(0));
1829 }
1830 
1831 /// Implement extending a 32-bit value to a 64-bit value. \p Lo32Reg is the
1832 /// original 32-bit source value (to be inserted in the low part of the combined
1833 /// 64-bit result), and \p Hi32Reg is the high half of the combined 64-bit
1834 /// value.
1835 static void extendLow32IntoHigh32(MachineIRBuilder &B,
1836                                   Register Hi32Reg, Register Lo32Reg,
1837                                   unsigned ExtOpc,
1838                                   const RegisterBank &RegBank,
1839                                   bool IsBooleanSrc = false) {
1840   if (ExtOpc == AMDGPU::G_ZEXT) {
1841     B.buildConstant(Hi32Reg, 0);
1842   } else if (ExtOpc == AMDGPU::G_SEXT) {
1843     if (IsBooleanSrc) {
1844       // If we know the original source was an s1, the high half is the same as
1845       // the low.
1846       B.buildCopy(Hi32Reg, Lo32Reg);
1847     } else {
1848       // Replicate sign bit from 32-bit extended part.
1849       auto ShiftAmt = B.buildConstant(LLT::scalar(32), 31);
1850       B.getMRI()->setRegBank(ShiftAmt.getReg(0), RegBank);
1851       B.buildAShr(Hi32Reg, Lo32Reg, ShiftAmt);
1852     }
1853   } else {
1854     assert(ExtOpc == AMDGPU::G_ANYEXT && "not an integer extension");
1855     B.buildUndef(Hi32Reg);
1856   }
1857 }
1858 
1859 bool AMDGPURegisterBankInfo::foldExtractEltToCmpSelect(
1860   MachineInstr &MI, MachineRegisterInfo &MRI,
1861   const OperandsMapper &OpdMapper) const {
1862 
1863   Register VecReg = MI.getOperand(1).getReg();
1864   Register Idx = MI.getOperand(2).getReg();
1865 
1866   const RegisterBank &IdxBank =
1867     *OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
1868 
1869   bool IsDivergentIdx = IdxBank == AMDGPU::VGPRRegBank;
1870 
1871   LLT VecTy = MRI.getType(VecReg);
1872   unsigned EltSize = VecTy.getScalarSizeInBits();
1873   unsigned NumElem = VecTy.getNumElements();
1874 
1875   if (!SITargetLowering::shouldExpandVectorDynExt(EltSize, NumElem,
1876                                                   IsDivergentIdx))
1877     return false;
1878 
1879   MachineIRBuilder B(MI);
1880   LLT S32 = LLT::scalar(32);
1881 
1882   const RegisterBank &DstBank =
1883     *OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
1884   const RegisterBank &SrcBank =
1885     *OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
1886 
1887   const RegisterBank &CCBank =
1888     (DstBank == AMDGPU::SGPRRegBank &&
1889      SrcBank == AMDGPU::SGPRRegBank &&
1890      IdxBank == AMDGPU::SGPRRegBank) ? AMDGPU::SGPRRegBank
1891                                      : AMDGPU::VCCRegBank;
1892   LLT CCTy = (CCBank == AMDGPU::SGPRRegBank) ? S32 : LLT::scalar(1);
1893 
1894   if (CCBank == AMDGPU::VCCRegBank && IdxBank == AMDGPU::SGPRRegBank) {
1895     Idx = B.buildCopy(S32, Idx)->getOperand(0).getReg();
1896     MRI.setRegBank(Idx, AMDGPU::VGPRRegBank);
1897   }
1898 
1899   LLT EltTy = VecTy.getScalarType();
1900   SmallVector<Register, 2> DstRegs(OpdMapper.getVRegs(0));
1901   unsigned NumLanes = DstRegs.size();
1902   if (!NumLanes)
1903     NumLanes = 1;
1904   else
1905     EltTy = MRI.getType(DstRegs[0]);
1906 
1907   auto UnmergeToEltTy = B.buildUnmerge(EltTy, VecReg);
1908   SmallVector<Register, 2> Res(NumLanes);
1909   for (unsigned L = 0; L < NumLanes; ++L)
1910     Res[L] = UnmergeToEltTy.getReg(L);
1911 
1912   for (unsigned I = 1; I < NumElem; ++I) {
1913     auto IC = B.buildConstant(S32, I);
1914     MRI.setRegBank(IC->getOperand(0).getReg(), AMDGPU::SGPRRegBank);
1915     auto Cmp = B.buildICmp(CmpInst::ICMP_EQ, CCTy, Idx, IC);
1916     MRI.setRegBank(Cmp->getOperand(0).getReg(), CCBank);
1917 
1918     for (unsigned L = 0; L < NumLanes; ++L) {
1919       auto S = B.buildSelect(EltTy, Cmp,
1920                              UnmergeToEltTy.getReg(I * NumLanes + L), Res[L]);
1921 
1922       for (unsigned N : { 0, 2, 3 })
1923         MRI.setRegBank(S->getOperand(N).getReg(), DstBank);
1924 
1925       Res[L] = S->getOperand(0).getReg();
1926     }
1927   }
1928 
1929   for (unsigned L = 0; L < NumLanes; ++L) {
1930     Register DstReg = (NumLanes == 1) ? MI.getOperand(0).getReg() : DstRegs[L];
1931     B.buildCopy(DstReg, Res[L]);
1932     MRI.setRegBank(DstReg, DstBank);
1933   }
1934 
1935   MRI.setRegBank(MI.getOperand(0).getReg(), DstBank);
1936   MI.eraseFromParent();
1937 
1938   return true;
1939 }
1940 
1941 bool AMDGPURegisterBankInfo::foldInsertEltToCmpSelect(
1942   MachineInstr &MI, MachineRegisterInfo &MRI,
1943   const OperandsMapper &OpdMapper) const {
1944 
1945   Register VecReg = MI.getOperand(1).getReg();
1946   Register Idx = MI.getOperand(3).getReg();
1947 
1948   const RegisterBank &IdxBank =
1949     *OpdMapper.getInstrMapping().getOperandMapping(3).BreakDown[0].RegBank;
1950 
1951   bool IsDivergentIdx = IdxBank == AMDGPU::VGPRRegBank;
1952 
1953   LLT VecTy = MRI.getType(VecReg);
1954   unsigned EltSize = VecTy.getScalarSizeInBits();
1955   unsigned NumElem = VecTy.getNumElements();
1956 
1957   if (!SITargetLowering::shouldExpandVectorDynExt(EltSize, NumElem,
1958                                                   IsDivergentIdx))
1959     return false;
1960 
1961   MachineIRBuilder B(MI);
1962   LLT S32 = LLT::scalar(32);
1963 
1964   const RegisterBank &DstBank =
1965     *OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
1966   const RegisterBank &SrcBank =
1967     *OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
1968   const RegisterBank &InsBank =
1969     *OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
1970 
1971   const RegisterBank &CCBank =
1972     (DstBank == AMDGPU::SGPRRegBank &&
1973      SrcBank == AMDGPU::SGPRRegBank &&
1974      InsBank == AMDGPU::SGPRRegBank &&
1975      IdxBank == AMDGPU::SGPRRegBank) ? AMDGPU::SGPRRegBank
1976                                      : AMDGPU::VCCRegBank;
1977   LLT CCTy = (CCBank == AMDGPU::SGPRRegBank) ? S32 : LLT::scalar(1);
1978 
1979   if (CCBank == AMDGPU::VCCRegBank && IdxBank == AMDGPU::SGPRRegBank) {
1980     Idx = B.buildCopy(S32, Idx)->getOperand(0).getReg();
1981     MRI.setRegBank(Idx, AMDGPU::VGPRRegBank);
1982   }
1983 
1984   LLT EltTy = VecTy.getScalarType();
1985   SmallVector<Register, 2> InsRegs(OpdMapper.getVRegs(2));
1986   unsigned NumLanes = InsRegs.size();
1987   if (!NumLanes) {
1988     NumLanes = 1;
1989     InsRegs.push_back(MI.getOperand(2).getReg());
1990   } else {
1991     EltTy = MRI.getType(InsRegs[0]);
1992   }
1993 
1994   auto UnmergeToEltTy = B.buildUnmerge(EltTy, VecReg);
1995   SmallVector<Register, 16> Ops(NumElem * NumLanes);
1996 
1997   for (unsigned I = 0; I < NumElem; ++I) {
1998     auto IC = B.buildConstant(S32, I);
1999     MRI.setRegBank(IC->getOperand(0).getReg(), AMDGPU::SGPRRegBank);
2000     auto Cmp = B.buildICmp(CmpInst::ICMP_EQ, CCTy, Idx, IC);
2001     MRI.setRegBank(Cmp->getOperand(0).getReg(), CCBank);
2002 
2003     for (unsigned L = 0; L < NumLanes; ++L) {
2004       auto S = B.buildSelect(EltTy, Cmp, InsRegs[L],
2005                              UnmergeToEltTy.getReg(I * NumLanes + L));
2006 
2007       for (unsigned N : { 0, 2, 3 })
2008         MRI.setRegBank(S->getOperand(N).getReg(), DstBank);
2009 
2010       Ops[I * NumLanes + L] = S->getOperand(0).getReg();
2011     }
2012   }
2013 
2014   LLT MergeTy = LLT::vector(Ops.size(), EltTy);
2015   if (MergeTy == MRI.getType(MI.getOperand(0).getReg())) {
2016     B.buildBuildVector(MI.getOperand(0), Ops);
2017   } else {
2018     auto Vec = B.buildBuildVector(MergeTy, Ops);
2019     MRI.setRegBank(Vec->getOperand(0).getReg(), DstBank);
2020     B.buildBitcast(MI.getOperand(0).getReg(), Vec);
2021   }
2022 
2023   MRI.setRegBank(MI.getOperand(0).getReg(), DstBank);
2024   MI.eraseFromParent();
2025 
2026   return true;
2027 }
2028 
2029 void AMDGPURegisterBankInfo::applyMappingImpl(
2030     const OperandsMapper &OpdMapper) const {
2031   MachineInstr &MI = OpdMapper.getMI();
2032   unsigned Opc = MI.getOpcode();
2033   MachineRegisterInfo &MRI = OpdMapper.getMRI();
2034   switch (Opc) {
2035   case AMDGPU::G_PHI: {
2036     Register DstReg = MI.getOperand(0).getReg();
2037     LLT DstTy = MRI.getType(DstReg);
2038     if (DstTy != LLT::scalar(1))
2039       break;
2040 
2041     const LLT S32 = LLT::scalar(32);
2042     const RegisterBank *DstBank =
2043       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2044     if (DstBank == &AMDGPU::VCCRegBank) {
2045       applyDefaultMapping(OpdMapper);
2046       // The standard handling only considers the result register bank for
2047       // phis. For VCC, blindly inserting a copy when the phi is lowered will
2048       // produce an invalid copy. We can only copy with some kind of compare to
2049       // get a vector boolean result. Insert a regitser bank copy that will be
2050       // correctly lowered to a compare.
2051       MachineIRBuilder B(*MI.getParent()->getParent());
2052 
2053       for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
2054         Register SrcReg = MI.getOperand(I).getReg();
2055         const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI);
2056 
2057         if (SrcBank != &AMDGPU::VCCRegBank) {
2058           MachineBasicBlock *SrcMBB = MI.getOperand(I + 1).getMBB();
2059           B.setInsertPt(*SrcMBB, SrcMBB->getFirstTerminator());
2060 
2061           auto Copy = B.buildCopy(LLT::scalar(1), SrcReg);
2062           MRI.setRegBank(Copy.getReg(0), AMDGPU::VCCRegBank);
2063           MI.getOperand(I).setReg(Copy.getReg(0));
2064         }
2065       }
2066 
2067       return;
2068     }
2069 
2070     // Phi handling is strange and only considers the bank of the destination.
2071     substituteSimpleCopyRegs(OpdMapper, 0);
2072 
2073     // Promote SGPR/VGPR booleans to s32
2074     MachineFunction *MF = MI.getParent()->getParent();
2075     ApplyRegBankMapping ApplyBank(*this, MRI, DstBank);
2076     GISelObserverWrapper Observer(&ApplyBank);
2077     MachineIRBuilder B(MI);
2078     LegalizerHelper Helper(*MF, Observer, B);
2079 
2080     if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized)
2081       llvm_unreachable("widen scalar should have succeeded");
2082 
2083     return;
2084   }
2085   case AMDGPU::G_ICMP:
2086   case AMDGPU::G_UADDO:
2087   case AMDGPU::G_USUBO:
2088   case AMDGPU::G_UADDE:
2089   case AMDGPU::G_SADDE:
2090   case AMDGPU::G_USUBE:
2091   case AMDGPU::G_SSUBE: {
2092     unsigned BoolDstOp = Opc == AMDGPU::G_ICMP ? 0 : 1;
2093     Register DstReg = MI.getOperand(BoolDstOp).getReg();
2094 
2095     const RegisterBank *DstBank =
2096       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2097     if (DstBank != &AMDGPU::SGPRRegBank)
2098       break;
2099 
2100     const bool HasCarryIn = MI.getNumOperands() == 5;
2101 
2102     // If this is a scalar compare, promote the result to s32, as the selection
2103     // will end up using a copy to a 32-bit vreg.
2104     const LLT S32 = LLT::scalar(32);
2105     Register NewDstReg = MRI.createGenericVirtualRegister(S32);
2106     MRI.setRegBank(NewDstReg, AMDGPU::SGPRRegBank);
2107     MI.getOperand(BoolDstOp).setReg(NewDstReg);
2108     MachineIRBuilder B(MI);
2109 
2110     if (HasCarryIn) {
2111       Register NewSrcReg = MRI.createGenericVirtualRegister(S32);
2112       MRI.setRegBank(NewSrcReg, AMDGPU::SGPRRegBank);
2113       B.buildZExt(NewSrcReg, MI.getOperand(4).getReg());
2114       MI.getOperand(4).setReg(NewSrcReg);
2115     }
2116 
2117     MachineBasicBlock *MBB = MI.getParent();
2118     B.setInsertPt(*MBB, std::next(MI.getIterator()));
2119 
2120     // If we had a constrained VCC result register, a copy was inserted to VCC
2121     // from SGPR.
2122     SmallVector<Register, 1> DefRegs(OpdMapper.getVRegs(0));
2123     if (DefRegs.empty())
2124       DefRegs.push_back(DstReg);
2125     B.buildTrunc(DefRegs[0], NewDstReg);
2126     return;
2127   }
2128   case AMDGPU::G_SELECT: {
2129     Register DstReg = MI.getOperand(0).getReg();
2130     LLT DstTy = MRI.getType(DstReg);
2131 
2132     SmallVector<Register, 1> CondRegs(OpdMapper.getVRegs(1));
2133     if (CondRegs.empty())
2134       CondRegs.push_back(MI.getOperand(1).getReg());
2135     else {
2136       assert(CondRegs.size() == 1);
2137     }
2138 
2139     const RegisterBank *CondBank = getRegBank(CondRegs[0], MRI, *TRI);
2140     if (CondBank == &AMDGPU::SGPRRegBank) {
2141       MachineIRBuilder B(MI);
2142       const LLT S32 = LLT::scalar(32);
2143       Register NewCondReg = MRI.createGenericVirtualRegister(S32);
2144       MRI.setRegBank(NewCondReg, AMDGPU::SGPRRegBank);
2145 
2146       MI.getOperand(1).setReg(NewCondReg);
2147       B.buildZExt(NewCondReg, CondRegs[0]);
2148     }
2149 
2150     if (DstTy.getSizeInBits() != 64)
2151       break;
2152 
2153     MachineIRBuilder B(MI);
2154     LLT HalfTy = getHalfSizedType(DstTy);
2155 
2156     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
2157     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
2158     SmallVector<Register, 2> Src2Regs(OpdMapper.getVRegs(3));
2159 
2160     // All inputs are SGPRs, nothing special to do.
2161     if (DefRegs.empty()) {
2162       assert(Src1Regs.empty() && Src2Regs.empty());
2163       break;
2164     }
2165 
2166     if (Src1Regs.empty())
2167       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
2168     else {
2169       setRegsToType(MRI, Src1Regs, HalfTy);
2170     }
2171 
2172     if (Src2Regs.empty())
2173       split64BitValueForMapping(B, Src2Regs, HalfTy, MI.getOperand(3).getReg());
2174     else
2175       setRegsToType(MRI, Src2Regs, HalfTy);
2176 
2177     setRegsToType(MRI, DefRegs, HalfTy);
2178 
2179     B.buildSelect(DefRegs[0], CondRegs[0], Src1Regs[0], Src2Regs[0]);
2180     B.buildSelect(DefRegs[1], CondRegs[0], Src1Regs[1], Src2Regs[1]);
2181 
2182     MRI.setRegBank(DstReg, AMDGPU::VGPRRegBank);
2183     MI.eraseFromParent();
2184     return;
2185   }
2186   case AMDGPU::G_BRCOND: {
2187     Register CondReg = MI.getOperand(0).getReg();
2188     // FIXME: Should use legalizer helper, but should change bool ext type.
2189     const RegisterBank *CondBank =
2190       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2191 
2192     if (CondBank == &AMDGPU::SGPRRegBank) {
2193       MachineIRBuilder B(MI);
2194       const LLT S32 = LLT::scalar(32);
2195       Register NewCondReg = MRI.createGenericVirtualRegister(S32);
2196       MRI.setRegBank(NewCondReg, AMDGPU::SGPRRegBank);
2197 
2198       MI.getOperand(0).setReg(NewCondReg);
2199       B.buildZExt(NewCondReg, CondReg);
2200       return;
2201     }
2202 
2203     break;
2204   }
2205   case AMDGPU::G_AND:
2206   case AMDGPU::G_OR:
2207   case AMDGPU::G_XOR: {
2208     // 64-bit and is only available on the SALU, so split into 2 32-bit ops if
2209     // there is a VGPR input.
2210     Register DstReg = MI.getOperand(0).getReg();
2211     LLT DstTy = MRI.getType(DstReg);
2212 
2213     if (DstTy.getSizeInBits() == 1) {
2214       const RegisterBank *DstBank =
2215         OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2216       if (DstBank == &AMDGPU::VCCRegBank)
2217         break;
2218 
2219       MachineFunction *MF = MI.getParent()->getParent();
2220       ApplyRegBankMapping ApplyBank(*this, MRI, DstBank);
2221       GISelObserverWrapper Observer(&ApplyBank);
2222       MachineIRBuilder B(MI);
2223       LegalizerHelper Helper(*MF, Observer, B);
2224 
2225       if (Helper.widenScalar(MI, 0, LLT::scalar(32)) !=
2226           LegalizerHelper::Legalized)
2227         llvm_unreachable("widen scalar should have succeeded");
2228       return;
2229     }
2230 
2231     if (DstTy.getSizeInBits() != 64)
2232       break;
2233 
2234     LLT HalfTy = getHalfSizedType(DstTy);
2235     SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
2236     SmallVector<Register, 2> Src0Regs(OpdMapper.getVRegs(1));
2237     SmallVector<Register, 2> Src1Regs(OpdMapper.getVRegs(2));
2238 
2239     // All inputs are SGPRs, nothing special to do.
2240     if (DefRegs.empty()) {
2241       assert(Src0Regs.empty() && Src1Regs.empty());
2242       break;
2243     }
2244 
2245     assert(DefRegs.size() == 2);
2246     assert(Src0Regs.size() == Src1Regs.size() &&
2247            (Src0Regs.empty() || Src0Regs.size() == 2));
2248 
2249     // Depending on where the source registers came from, the generic code may
2250     // have decided to split the inputs already or not. If not, we still need to
2251     // extract the values.
2252     MachineIRBuilder B(MI);
2253 
2254     if (Src0Regs.empty())
2255       split64BitValueForMapping(B, Src0Regs, HalfTy, MI.getOperand(1).getReg());
2256     else
2257       setRegsToType(MRI, Src0Regs, HalfTy);
2258 
2259     if (Src1Regs.empty())
2260       split64BitValueForMapping(B, Src1Regs, HalfTy, MI.getOperand(2).getReg());
2261     else
2262       setRegsToType(MRI, Src1Regs, HalfTy);
2263 
2264     setRegsToType(MRI, DefRegs, HalfTy);
2265 
2266     B.buildInstr(Opc)
2267       .addDef(DefRegs[0])
2268       .addUse(Src0Regs[0])
2269       .addUse(Src1Regs[0]);
2270 
2271     B.buildInstr(Opc)
2272       .addDef(DefRegs[1])
2273       .addUse(Src0Regs[1])
2274       .addUse(Src1Regs[1]);
2275 
2276     MRI.setRegBank(DstReg, AMDGPU::VGPRRegBank);
2277     MI.eraseFromParent();
2278     return;
2279   }
2280   case AMDGPU::G_ADD:
2281   case AMDGPU::G_SUB:
2282   case AMDGPU::G_MUL:
2283   case AMDGPU::G_SHL:
2284   case AMDGPU::G_LSHR:
2285   case AMDGPU::G_ASHR: {
2286     Register DstReg = MI.getOperand(0).getReg();
2287     LLT DstTy = MRI.getType(DstReg);
2288 
2289     // 16-bit operations are VALU only, but can be promoted to 32-bit SALU.
2290     // Packed 16-bit operations need to be scalarized and promoted.
2291     if (DstTy != LLT::scalar(16) && DstTy != LLT::vector(2, 16))
2292       break;
2293 
2294     const RegisterBank *DstBank =
2295       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2296     if (DstBank == &AMDGPU::VGPRRegBank)
2297       break;
2298 
2299     const LLT S32 = LLT::scalar(32);
2300     MachineBasicBlock *MBB = MI.getParent();
2301     MachineFunction *MF = MBB->getParent();
2302     MachineIRBuilder B(MI);
2303     ApplyRegBankMapping ApplySALU(*this, MRI, &AMDGPU::SGPRRegBank);
2304     GISelObserverWrapper Observer(&ApplySALU);
2305 
2306     if (DstTy.isVector()) {
2307       B.setChangeObserver(Observer);
2308 
2309       Register WideSrc0Lo, WideSrc0Hi;
2310       Register WideSrc1Lo, WideSrc1Hi;
2311 
2312       std::tie(WideSrc0Lo, WideSrc0Hi)
2313         = unpackV2S16ToS32(B, MI.getOperand(1).getReg(), AMDGPU::G_ANYEXT);
2314       std::tie(WideSrc1Lo, WideSrc1Hi)
2315         = unpackV2S16ToS32(B, MI.getOperand(2).getReg(), AMDGPU::G_ANYEXT);
2316       auto Lo = B.buildInstr(MI.getOpcode(), {S32}, {WideSrc0Lo, WideSrc1Lo});
2317       auto Hi = B.buildInstr(MI.getOpcode(), {S32}, {WideSrc0Hi, WideSrc1Hi});
2318       B.buildBuildVectorTrunc(DstReg, {Lo.getReg(0), Hi.getReg(0)});
2319       MI.eraseFromParent();
2320     } else {
2321       LegalizerHelper Helper(*MF, Observer, B);
2322 
2323       if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized)
2324         llvm_unreachable("widen scalar should have succeeded");
2325 
2326       // FIXME: s16 shift amounts should be legal.
2327       if (Opc == AMDGPU::G_SHL || Opc == AMDGPU::G_LSHR ||
2328           Opc == AMDGPU::G_ASHR) {
2329         B.setInsertPt(*MBB, MI.getIterator());
2330         if (Helper.widenScalar(MI, 1, S32) != LegalizerHelper::Legalized)
2331           llvm_unreachable("widen scalar should have succeeded");
2332       }
2333     }
2334 
2335     return;
2336   }
2337   case AMDGPU::G_SMIN:
2338   case AMDGPU::G_SMAX:
2339   case AMDGPU::G_UMIN:
2340   case AMDGPU::G_UMAX: {
2341     Register DstReg = MI.getOperand(0).getReg();
2342     const RegisterBank *DstBank =
2343       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2344     if (DstBank == &AMDGPU::VGPRRegBank)
2345       break;
2346 
2347     MachineFunction *MF = MI.getParent()->getParent();
2348     MachineIRBuilder B(MI);
2349 
2350     // Turn scalar min/max into a compare and select.
2351     LLT Ty = MRI.getType(DstReg);
2352     const LLT S32 = LLT::scalar(32);
2353     const LLT S16 = LLT::scalar(16);
2354     const LLT V2S16 = LLT::vector(2, 16);
2355 
2356     if (Ty == V2S16) {
2357       ApplyRegBankMapping ApplySALU(*this, MRI, &AMDGPU::SGPRRegBank);
2358       GISelObserverWrapper Observer(&ApplySALU);
2359       B.setChangeObserver(Observer);
2360 
2361       // Need to widen to s32, and expand as cmp + select, and avoid producing
2362       // illegal vector extends or unmerges that would need further
2363       // legalization.
2364       //
2365       // TODO: Should we just readfirstlane? That should probably be handled
2366       // with a UniformVGPR register bank that wouldn't need special
2367       // consideration here.
2368 
2369       Register Dst = MI.getOperand(0).getReg();
2370       Register Src0 = MI.getOperand(1).getReg();
2371       Register Src1 = MI.getOperand(2).getReg();
2372 
2373       Register WideSrc0Lo, WideSrc0Hi;
2374       Register WideSrc1Lo, WideSrc1Hi;
2375 
2376       unsigned ExtendOp = minMaxToExtend(MI.getOpcode());
2377 
2378       std::tie(WideSrc0Lo, WideSrc0Hi) = unpackV2S16ToS32(B, Src0, ExtendOp);
2379       std::tie(WideSrc1Lo, WideSrc1Hi) = unpackV2S16ToS32(B, Src1, ExtendOp);
2380 
2381       Register Lo = MRI.createGenericVirtualRegister(S32);
2382       Register Hi = MRI.createGenericVirtualRegister(S32);
2383       const CmpInst::Predicate Pred = minMaxToCompare(MI.getOpcode());
2384       buildExpandedScalarMinMax(B, Pred, Lo, WideSrc0Lo, WideSrc1Lo);
2385       buildExpandedScalarMinMax(B, Pred, Hi, WideSrc0Hi, WideSrc1Hi);
2386 
2387       B.buildBuildVectorTrunc(Dst, {Lo, Hi});
2388       MI.eraseFromParent();
2389     } else if (Ty == S16) {
2390       ApplyRegBankMapping ApplySALU(*this, MRI, &AMDGPU::SGPRRegBank);
2391       GISelObserverWrapper Observer(&ApplySALU);
2392       LegalizerHelper Helper(*MF, Observer, B);
2393 
2394       // Need to widen to s32, and expand as cmp + select.
2395       if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized)
2396         llvm_unreachable("widenScalar should have succeeded");
2397 
2398       // FIXME: This is relying on widenScalar leaving MI in place.
2399       lowerScalarMinMax(B, MI);
2400     } else
2401       lowerScalarMinMax(B, MI);
2402 
2403     return;
2404   }
2405   case AMDGPU::G_SEXT_INREG: {
2406     SmallVector<Register, 2> SrcRegs(OpdMapper.getVRegs(1));
2407     if (SrcRegs.empty())
2408       break; // Nothing to repair
2409 
2410     const LLT S32 = LLT::scalar(32);
2411     MachineIRBuilder B(MI);
2412     ApplyRegBankMapping O(*this, MRI, &AMDGPU::VGPRRegBank);
2413     GISelObserverWrapper Observer(&O);
2414     B.setChangeObserver(Observer);
2415 
2416     // Don't use LegalizerHelper's narrowScalar. It produces unwanted G_SEXTs
2417     // we would need to further expand, and doesn't let us directly set the
2418     // result registers.
2419     SmallVector<Register, 2> DstRegs(OpdMapper.getVRegs(0));
2420 
2421     int Amt = MI.getOperand(2).getImm();
2422     if (Amt <= 32) {
2423       if (Amt == 32) {
2424         // The low bits are unchanged.
2425         B.buildCopy(DstRegs[0], SrcRegs[0]);
2426       } else {
2427         // Extend in the low bits and propagate the sign bit to the high half.
2428         B.buildSExtInReg(DstRegs[0], SrcRegs[0], Amt);
2429       }
2430 
2431       B.buildAShr(DstRegs[1], DstRegs[0], B.buildConstant(S32, 31));
2432     } else {
2433       // The low bits are unchanged, and extend in the high bits.
2434       B.buildCopy(DstRegs[0], SrcRegs[0]);
2435       B.buildSExtInReg(DstRegs[1], DstRegs[0], Amt - 32);
2436     }
2437 
2438     Register DstReg = MI.getOperand(0).getReg();
2439     MRI.setRegBank(DstReg, AMDGPU::VGPRRegBank);
2440     MI.eraseFromParent();
2441     return;
2442   }
2443   case AMDGPU::G_CTPOP:
2444   case AMDGPU::G_CTLZ_ZERO_UNDEF:
2445   case AMDGPU::G_CTTZ_ZERO_UNDEF: {
2446     MachineIRBuilder B(MI);
2447     MachineFunction &MF = B.getMF();
2448 
2449     const RegisterBank *DstBank =
2450       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2451     if (DstBank == &AMDGPU::SGPRRegBank)
2452       break;
2453 
2454     Register SrcReg = MI.getOperand(1).getReg();
2455     const LLT S32 = LLT::scalar(32);
2456     LLT Ty = MRI.getType(SrcReg);
2457     if (Ty == S32)
2458       break;
2459 
2460     ApplyRegBankMapping ApplyVALU(*this, MRI, &AMDGPU::VGPRRegBank);
2461     GISelObserverWrapper Observer(&ApplyVALU);
2462     LegalizerHelper Helper(MF, Observer, B);
2463 
2464     if (Helper.narrowScalar(MI, 1, S32) != LegalizerHelper::Legalized)
2465       llvm_unreachable("narrowScalar should have succeeded");
2466     return;
2467   }
2468   case AMDGPU::G_SEXT:
2469   case AMDGPU::G_ZEXT:
2470   case AMDGPU::G_ANYEXT: {
2471     Register SrcReg = MI.getOperand(1).getReg();
2472     LLT SrcTy = MRI.getType(SrcReg);
2473     const bool Signed = Opc == AMDGPU::G_SEXT;
2474 
2475     assert(empty(OpdMapper.getVRegs(1)));
2476 
2477     MachineIRBuilder B(MI);
2478     const RegisterBank *SrcBank =
2479       OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
2480 
2481     Register DstReg = MI.getOperand(0).getReg();
2482     LLT DstTy = MRI.getType(DstReg);
2483     if (DstTy.isScalar() &&
2484         SrcBank != &AMDGPU::SGPRRegBank &&
2485         SrcBank != &AMDGPU::VCCRegBank &&
2486         // FIXME: Should handle any type that round to s64 when irregular
2487         // breakdowns supported.
2488         DstTy.getSizeInBits() == 64 &&
2489         SrcTy.getSizeInBits() <= 32) {
2490       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
2491 
2492       // Extend to 32-bit, and then extend the low half.
2493       if (Signed) {
2494         // TODO: Should really be buildSExtOrCopy
2495         B.buildSExtOrTrunc(DefRegs[0], SrcReg);
2496       } else if (Opc == AMDGPU::G_ZEXT) {
2497         B.buildZExtOrTrunc(DefRegs[0], SrcReg);
2498       } else {
2499         B.buildAnyExtOrTrunc(DefRegs[0], SrcReg);
2500       }
2501 
2502       extendLow32IntoHigh32(B, DefRegs[1], DefRegs[0], Opc, *SrcBank);
2503       MRI.setRegBank(DstReg, *SrcBank);
2504       MI.eraseFromParent();
2505       return;
2506     }
2507 
2508     if (SrcTy != LLT::scalar(1))
2509       return;
2510 
2511     // It is not legal to have a legalization artifact with a VCC source. Rather
2512     // than introducing a copy, insert the select we would have to select the
2513     // copy to.
2514     if (SrcBank == &AMDGPU::VCCRegBank) {
2515       SmallVector<Register, 2> DefRegs(OpdMapper.getVRegs(0));
2516 
2517       const RegisterBank *DstBank = &AMDGPU::VGPRRegBank;
2518 
2519       unsigned DstSize = DstTy.getSizeInBits();
2520       // 64-bit select is SGPR only
2521       const bool UseSel64 = DstSize > 32 &&
2522         SrcBank->getID() == AMDGPU::SGPRRegBankID;
2523 
2524       // TODO: Should s16 select be legal?
2525       LLT SelType = UseSel64 ? LLT::scalar(64) : LLT::scalar(32);
2526       auto True = B.buildConstant(SelType, Signed ? -1 : 1);
2527       auto False = B.buildConstant(SelType, 0);
2528 
2529       MRI.setRegBank(True.getReg(0), *DstBank);
2530       MRI.setRegBank(False.getReg(0), *DstBank);
2531       MRI.setRegBank(DstReg, *DstBank);
2532 
2533       if (DstSize > 32) {
2534         B.buildSelect(DefRegs[0], SrcReg, True, False);
2535         extendLow32IntoHigh32(B, DefRegs[1], DefRegs[0], Opc, *SrcBank, true);
2536       } else if (DstSize < 32) {
2537         auto Sel = B.buildSelect(SelType, SrcReg, True, False);
2538         MRI.setRegBank(Sel.getReg(0), *DstBank);
2539         B.buildTrunc(DstReg, Sel);
2540       } else {
2541         B.buildSelect(DstReg, SrcReg, True, False);
2542       }
2543 
2544       MI.eraseFromParent();
2545       return;
2546     }
2547 
2548     break;
2549   }
2550   case AMDGPU::G_BUILD_VECTOR:
2551   case AMDGPU::G_BUILD_VECTOR_TRUNC: {
2552     Register DstReg = MI.getOperand(0).getReg();
2553     LLT DstTy = MRI.getType(DstReg);
2554     if (DstTy != LLT::vector(2, 16))
2555       break;
2556 
2557     assert(MI.getNumOperands() == 3 && OpdMapper.getVRegs(0).empty());
2558     substituteSimpleCopyRegs(OpdMapper, 1);
2559     substituteSimpleCopyRegs(OpdMapper, 2);
2560 
2561     const RegisterBank *DstBank =
2562       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2563     if (DstBank == &AMDGPU::SGPRRegBank)
2564       break; // Can use S_PACK_* instructions.
2565 
2566     MachineIRBuilder B(MI);
2567 
2568     Register Lo = MI.getOperand(1).getReg();
2569     Register Hi = MI.getOperand(2).getReg();
2570     const LLT S32 = LLT::scalar(32);
2571 
2572     const RegisterBank *BankLo =
2573       OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
2574     const RegisterBank *BankHi =
2575       OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
2576 
2577     Register ZextLo;
2578     Register ShiftHi;
2579 
2580     if (Opc == AMDGPU::G_BUILD_VECTOR) {
2581       ZextLo = B.buildZExt(S32, Lo).getReg(0);
2582       MRI.setRegBank(ZextLo, *BankLo);
2583 
2584       Register ZextHi = B.buildZExt(S32, Hi).getReg(0);
2585       MRI.setRegBank(ZextHi, *BankHi);
2586 
2587       auto ShiftAmt = B.buildConstant(S32, 16);
2588       MRI.setRegBank(ShiftAmt.getReg(0), *BankHi);
2589 
2590       ShiftHi = B.buildShl(S32, ZextHi, ShiftAmt).getReg(0);
2591       MRI.setRegBank(ShiftHi, *BankHi);
2592     } else {
2593       Register MaskLo = B.buildConstant(S32, 0xffff).getReg(0);
2594       MRI.setRegBank(MaskLo, *BankLo);
2595 
2596       auto ShiftAmt = B.buildConstant(S32, 16);
2597       MRI.setRegBank(ShiftAmt.getReg(0), *BankHi);
2598 
2599       ShiftHi = B.buildShl(S32, Hi, ShiftAmt).getReg(0);
2600       MRI.setRegBank(ShiftHi, *BankHi);
2601 
2602       ZextLo = B.buildAnd(S32, Lo, MaskLo).getReg(0);
2603       MRI.setRegBank(ZextLo, *BankLo);
2604     }
2605 
2606     auto Or = B.buildOr(S32, ZextLo, ShiftHi);
2607     MRI.setRegBank(Or.getReg(0), *DstBank);
2608 
2609     B.buildBitcast(DstReg, Or);
2610     MI.eraseFromParent();
2611     return;
2612   }
2613   case AMDGPU::G_EXTRACT_VECTOR_ELT: {
2614     SmallVector<Register, 2> DstRegs(OpdMapper.getVRegs(0));
2615 
2616     assert(OpdMapper.getVRegs(1).empty() && OpdMapper.getVRegs(2).empty());
2617 
2618     Register DstReg = MI.getOperand(0).getReg();
2619     Register SrcReg = MI.getOperand(1).getReg();
2620 
2621     const LLT S32 = LLT::scalar(32);
2622     LLT DstTy = MRI.getType(DstReg);
2623     LLT SrcTy = MRI.getType(SrcReg);
2624 
2625     if (foldExtractEltToCmpSelect(MI, MRI, OpdMapper))
2626       return;
2627 
2628     MachineIRBuilder B(MI);
2629 
2630     const ValueMapping &DstMapping
2631       = OpdMapper.getInstrMapping().getOperandMapping(0);
2632     const RegisterBank *DstBank = DstMapping.BreakDown[0].RegBank;
2633     const RegisterBank *SrcBank =
2634       OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
2635     const RegisterBank *IdxBank =
2636         OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
2637 
2638     Register BaseIdxReg;
2639     unsigned ConstOffset;
2640     MachineInstr *OffsetDef;
2641     std::tie(BaseIdxReg, ConstOffset, OffsetDef) =
2642         AMDGPU::getBaseWithConstantOffset(MRI, MI.getOperand(2).getReg());
2643 
2644     // See if the index is an add of a constant which will be foldable by moving
2645     // the base register of the index later if this is going to be executed in a
2646     // waterfall loop. This is essentially to reassociate the add of a constant
2647     // with the readfirstlane.
2648     bool ShouldMoveIndexIntoLoop = IdxBank != &AMDGPU::SGPRRegBank &&
2649                                    ConstOffset > 0 &&
2650                                    ConstOffset < SrcTy.getNumElements();
2651 
2652     // Move the base register. We'll re-insert the add later.
2653     if (ShouldMoveIndexIntoLoop)
2654       MI.getOperand(2).setReg(BaseIdxReg);
2655 
2656     // If this is a VGPR result only because the index was a VGPR result, the
2657     // actual indexing will be done on the SGPR source vector, which will
2658     // produce a scalar result. We need to copy to the VGPR result inside the
2659     // waterfall loop.
2660     const bool NeedCopyToVGPR = DstBank == &AMDGPU::VGPRRegBank &&
2661                                 SrcBank == &AMDGPU::SGPRRegBank;
2662     if (DstRegs.empty()) {
2663       applyDefaultMapping(OpdMapper);
2664 
2665       executeInWaterfallLoop(MI, MRI, { 2 });
2666 
2667       if (NeedCopyToVGPR) {
2668         // We don't want a phi for this temporary reg.
2669         Register TmpReg = MRI.createGenericVirtualRegister(DstTy);
2670         MRI.setRegBank(TmpReg, AMDGPU::SGPRRegBank);
2671         MI.getOperand(0).setReg(TmpReg);
2672         B.setInsertPt(*MI.getParent(), ++MI.getIterator());
2673 
2674         // Use a v_mov_b32 here to make the exec dependency explicit.
2675         buildVCopy(B, DstReg, TmpReg);
2676       }
2677 
2678       // Re-insert the constant offset add inside the waterfall loop.
2679       if (ShouldMoveIndexIntoLoop)
2680         reinsertVectorIndexAdd(B, MI, 2, ConstOffset);
2681 
2682       return;
2683     }
2684 
2685     assert(DstTy.getSizeInBits() == 64);
2686 
2687     LLT Vec32 = LLT::vector(2 * SrcTy.getNumElements(), 32);
2688 
2689     auto CastSrc = B.buildBitcast(Vec32, SrcReg);
2690     auto One = B.buildConstant(S32, 1);
2691 
2692     MachineBasicBlock::iterator MII = MI.getIterator();
2693 
2694     // Split the vector index into 32-bit pieces. Prepare to move all of the
2695     // new instructions into a waterfall loop if necessary.
2696     //
2697     // Don't put the bitcast or constant in the loop.
2698     MachineInstrSpan Span(MII, &B.getMBB());
2699 
2700     // Compute 32-bit element indices, (2 * OrigIdx, 2 * OrigIdx + 1).
2701     auto IdxLo = B.buildShl(S32, BaseIdxReg, One);
2702     auto IdxHi = B.buildAdd(S32, IdxLo, One);
2703 
2704     auto Extract0 = B.buildExtractVectorElement(DstRegs[0], CastSrc, IdxLo);
2705     auto Extract1 = B.buildExtractVectorElement(DstRegs[1], CastSrc, IdxHi);
2706 
2707     MRI.setRegBank(DstReg, *DstBank);
2708     MRI.setRegBank(CastSrc.getReg(0), *SrcBank);
2709     MRI.setRegBank(One.getReg(0), AMDGPU::SGPRRegBank);
2710     MRI.setRegBank(IdxLo.getReg(0), AMDGPU::SGPRRegBank);
2711     MRI.setRegBank(IdxHi.getReg(0), AMDGPU::SGPRRegBank);
2712 
2713     SmallSet<Register, 4> OpsToWaterfall;
2714     if (!collectWaterfallOperands(OpsToWaterfall, MI, MRI, { 2 })) {
2715       MI.eraseFromParent();
2716       return;
2717     }
2718 
2719     // Remove the original instruction to avoid potentially confusing the
2720     // waterfall loop logic.
2721     B.setInstr(*Span.begin());
2722     MI.eraseFromParent();
2723     executeInWaterfallLoop(B, make_range(Span.begin(), Span.end()),
2724                            OpsToWaterfall, MRI);
2725 
2726     if (NeedCopyToVGPR) {
2727       MachineBasicBlock *LoopBB = Extract1->getParent();
2728       Register TmpReg0 = MRI.createGenericVirtualRegister(S32);
2729       Register TmpReg1 = MRI.createGenericVirtualRegister(S32);
2730       MRI.setRegBank(TmpReg0, AMDGPU::SGPRRegBank);
2731       MRI.setRegBank(TmpReg1, AMDGPU::SGPRRegBank);
2732 
2733       Extract0->getOperand(0).setReg(TmpReg0);
2734       Extract1->getOperand(0).setReg(TmpReg1);
2735 
2736       B.setInsertPt(*LoopBB, ++Extract1->getIterator());
2737 
2738       buildVCopy(B, DstRegs[0], TmpReg0);
2739       buildVCopy(B, DstRegs[1], TmpReg1);
2740     }
2741 
2742     if (ShouldMoveIndexIntoLoop)
2743       reinsertVectorIndexAdd(B, *IdxLo, 1, ConstOffset);
2744 
2745     return;
2746   }
2747   case AMDGPU::G_INSERT_VECTOR_ELT: {
2748     SmallVector<Register, 2> InsRegs(OpdMapper.getVRegs(2));
2749 
2750     Register DstReg = MI.getOperand(0).getReg();
2751     LLT VecTy = MRI.getType(DstReg);
2752 
2753     assert(OpdMapper.getVRegs(0).empty());
2754     assert(OpdMapper.getVRegs(3).empty());
2755 
2756     if (substituteSimpleCopyRegs(OpdMapper, 1))
2757       MRI.setType(MI.getOperand(1).getReg(), VecTy);
2758 
2759     if (foldInsertEltToCmpSelect(MI, MRI, OpdMapper))
2760       return;
2761 
2762     const RegisterBank *IdxBank =
2763       OpdMapper.getInstrMapping().getOperandMapping(3).BreakDown[0].RegBank;
2764 
2765     Register SrcReg = MI.getOperand(1).getReg();
2766     Register InsReg = MI.getOperand(2).getReg();
2767     LLT InsTy = MRI.getType(InsReg);
2768     (void)InsTy;
2769 
2770     Register BaseIdxReg;
2771     unsigned ConstOffset;
2772     MachineInstr *OffsetDef;
2773     std::tie(BaseIdxReg, ConstOffset, OffsetDef) =
2774       AMDGPU::getBaseWithConstantOffset(MRI, MI.getOperand(3).getReg());
2775 
2776     // See if the index is an add of a constant which will be foldable by moving
2777     // the base register of the index later if this is going to be executed in a
2778     // waterfall loop. This is essentially to reassociate the add of a constant
2779     // with the readfirstlane.
2780     bool ShouldMoveIndexIntoLoop = IdxBank != &AMDGPU::SGPRRegBank &&
2781       ConstOffset > 0 &&
2782       ConstOffset < VecTy.getNumElements();
2783 
2784     // Move the base register. We'll re-insert the add later.
2785     if (ShouldMoveIndexIntoLoop)
2786       MI.getOperand(3).setReg(BaseIdxReg);
2787 
2788 
2789     if (InsRegs.empty()) {
2790       executeInWaterfallLoop(MI, MRI, { 3 });
2791 
2792       // Re-insert the constant offset add inside the waterfall loop.
2793       if (ShouldMoveIndexIntoLoop) {
2794         MachineIRBuilder B(MI);
2795         reinsertVectorIndexAdd(B, MI, 3, ConstOffset);
2796       }
2797 
2798       return;
2799     }
2800 
2801 
2802     assert(InsTy.getSizeInBits() == 64);
2803 
2804     const LLT S32 = LLT::scalar(32);
2805     LLT Vec32 = LLT::vector(2 * VecTy.getNumElements(), 32);
2806 
2807     MachineIRBuilder B(MI);
2808     auto CastSrc = B.buildBitcast(Vec32, SrcReg);
2809     auto One = B.buildConstant(S32, 1);
2810 
2811     // Split the vector index into 32-bit pieces. Prepare to move all of the
2812     // new instructions into a waterfall loop if necessary.
2813     //
2814     // Don't put the bitcast or constant in the loop.
2815     MachineInstrSpan Span(MachineBasicBlock::iterator(&MI), &B.getMBB());
2816 
2817     // Compute 32-bit element indices, (2 * OrigIdx, 2 * OrigIdx + 1).
2818     auto IdxLo = B.buildShl(S32, BaseIdxReg, One);
2819     auto IdxHi = B.buildAdd(S32, IdxLo, One);
2820 
2821     auto InsLo = B.buildInsertVectorElement(Vec32, CastSrc, InsRegs[0], IdxLo);
2822     auto InsHi = B.buildInsertVectorElement(Vec32, InsLo, InsRegs[1], IdxHi);
2823 
2824     const RegisterBank *DstBank =
2825       OpdMapper.getInstrMapping().getOperandMapping(0).BreakDown[0].RegBank;
2826     const RegisterBank *SrcBank =
2827       OpdMapper.getInstrMapping().getOperandMapping(1).BreakDown[0].RegBank;
2828     const RegisterBank *InsSrcBank =
2829       OpdMapper.getInstrMapping().getOperandMapping(2).BreakDown[0].RegBank;
2830 
2831     MRI.setRegBank(InsReg, *InsSrcBank);
2832     MRI.setRegBank(CastSrc.getReg(0), *SrcBank);
2833     MRI.setRegBank(InsLo.getReg(0), *DstBank);
2834     MRI.setRegBank(InsHi.getReg(0), *DstBank);
2835     MRI.setRegBank(One.getReg(0), AMDGPU::SGPRRegBank);
2836     MRI.setRegBank(IdxLo.getReg(0), AMDGPU::SGPRRegBank);
2837     MRI.setRegBank(IdxHi.getReg(0), AMDGPU::SGPRRegBank);
2838 
2839 
2840     SmallSet<Register, 4> OpsToWaterfall;
2841     if (!collectWaterfallOperands(OpsToWaterfall, MI, MRI, { 3 })) {
2842       B.setInsertPt(B.getMBB(), MI);
2843       B.buildBitcast(DstReg, InsHi);
2844       MI.eraseFromParent();
2845       return;
2846     }
2847 
2848     B.setInstr(*Span.begin());
2849     MI.eraseFromParent();
2850 
2851     // Figure out the point after the waterfall loop before mangling the control
2852     // flow.
2853     executeInWaterfallLoop(B, make_range(Span.begin(), Span.end()),
2854                            OpsToWaterfall, MRI);
2855 
2856     // The insertion point is now right after the original instruction.
2857     //
2858     // Keep the bitcast to the original vector type out of the loop. Doing this
2859     // saved an extra phi we don't need inside the loop.
2860     B.buildBitcast(DstReg, InsHi);
2861 
2862     // Re-insert the constant offset add inside the waterfall loop.
2863     if (ShouldMoveIndexIntoLoop)
2864       reinsertVectorIndexAdd(B, *IdxLo, 1, ConstOffset);
2865 
2866     return;
2867   }
2868   case AMDGPU::G_AMDGPU_BUFFER_LOAD:
2869   case AMDGPU::G_AMDGPU_BUFFER_LOAD_USHORT:
2870   case AMDGPU::G_AMDGPU_BUFFER_LOAD_SSHORT:
2871   case AMDGPU::G_AMDGPU_BUFFER_LOAD_UBYTE:
2872   case AMDGPU::G_AMDGPU_BUFFER_LOAD_SBYTE:
2873   case AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT:
2874   case AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT_D16:
2875   case AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT:
2876   case AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT_D16:
2877   case AMDGPU::G_AMDGPU_BUFFER_STORE:
2878   case AMDGPU::G_AMDGPU_BUFFER_STORE_BYTE:
2879   case AMDGPU::G_AMDGPU_BUFFER_STORE_SHORT:
2880   case AMDGPU::G_AMDGPU_BUFFER_STORE_FORMAT:
2881   case AMDGPU::G_AMDGPU_BUFFER_STORE_FORMAT_D16:
2882   case AMDGPU::G_AMDGPU_TBUFFER_STORE_FORMAT:
2883   case AMDGPU::G_AMDGPU_TBUFFER_STORE_FORMAT_D16: {
2884     applyDefaultMapping(OpdMapper);
2885     executeInWaterfallLoop(MI, MRI, {1, 4});
2886     return;
2887   }
2888   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SWAP:
2889   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_ADD:
2890   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SUB:
2891   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMIN:
2892   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMIN:
2893   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMAX:
2894   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMAX:
2895   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_AND:
2896   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_OR:
2897   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_XOR:
2898   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_INC:
2899   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_DEC: {
2900     applyDefaultMapping(OpdMapper);
2901     executeInWaterfallLoop(MI, MRI, {2, 5});
2902     return;
2903   }
2904   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_CMPSWAP: {
2905     applyDefaultMapping(OpdMapper);
2906     executeInWaterfallLoop(MI, MRI, {3, 6});
2907     return;
2908   }
2909   case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: {
2910     applyMappingSBufferLoad(OpdMapper);
2911     return;
2912   }
2913   case AMDGPU::G_INTRINSIC: {
2914     switch (MI.getIntrinsicID()) {
2915     case Intrinsic::amdgcn_readlane: {
2916       substituteSimpleCopyRegs(OpdMapper, 2);
2917 
2918       assert(OpdMapper.getVRegs(0).empty());
2919       assert(OpdMapper.getVRegs(3).empty());
2920 
2921       // Make sure the index is an SGPR. It doesn't make sense to run this in a
2922       // waterfall loop, so assume it's a uniform value.
2923       constrainOpWithReadfirstlane(MI, MRI, 3); // Index
2924       return;
2925     }
2926     case Intrinsic::amdgcn_writelane: {
2927       assert(OpdMapper.getVRegs(0).empty());
2928       assert(OpdMapper.getVRegs(2).empty());
2929       assert(OpdMapper.getVRegs(3).empty());
2930 
2931       substituteSimpleCopyRegs(OpdMapper, 4); // VGPR input val
2932       constrainOpWithReadfirstlane(MI, MRI, 2); // Source value
2933       constrainOpWithReadfirstlane(MI, MRI, 3); // Index
2934       return;
2935     }
2936     case Intrinsic::amdgcn_interp_p1:
2937     case Intrinsic::amdgcn_interp_p2:
2938     case Intrinsic::amdgcn_interp_mov:
2939     case Intrinsic::amdgcn_interp_p1_f16:
2940     case Intrinsic::amdgcn_interp_p2_f16: {
2941       applyDefaultMapping(OpdMapper);
2942 
2943       // Readlane for m0 value, which is always the last operand.
2944       // FIXME: Should this be a waterfall loop instead?
2945       constrainOpWithReadfirstlane(MI, MRI, MI.getNumOperands() - 1); // Index
2946       return;
2947     }
2948     case Intrinsic::amdgcn_permlane16:
2949     case Intrinsic::amdgcn_permlanex16: {
2950       // Doing a waterfall loop over these wouldn't make any sense.
2951       substituteSimpleCopyRegs(OpdMapper, 2);
2952       substituteSimpleCopyRegs(OpdMapper, 3);
2953       constrainOpWithReadfirstlane(MI, MRI, 4);
2954       constrainOpWithReadfirstlane(MI, MRI, 5);
2955       return;
2956     }
2957     case Intrinsic::amdgcn_sbfe:
2958       applyMappingBFEIntrinsic(OpdMapper, true);
2959       return;
2960     case Intrinsic::amdgcn_ubfe:
2961       applyMappingBFEIntrinsic(OpdMapper, false);
2962       return;
2963     }
2964     break;
2965   }
2966   case AMDGPU::G_AMDGPU_INTRIN_IMAGE_LOAD:
2967   case AMDGPU::G_AMDGPU_INTRIN_IMAGE_STORE: {
2968     const AMDGPU::RsrcIntrinsic *RSrcIntrin
2969       = AMDGPU::lookupRsrcIntrinsic(MI.getIntrinsicID());
2970     assert(RSrcIntrin && RSrcIntrin->IsImage);
2971     // Non-images can have complications from operands that allow both SGPR
2972     // and VGPR. For now it's too complicated to figure out the final opcode
2973     // to derive the register bank from the MCInstrDesc.
2974     applyMappingImage(MI, OpdMapper, MRI, RSrcIntrin->RsrcArg);
2975     return;
2976   }
2977   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
2978     auto IntrID = MI.getIntrinsicID();
2979     switch (IntrID) {
2980     case Intrinsic::amdgcn_ds_ordered_add:
2981     case Intrinsic::amdgcn_ds_ordered_swap: {
2982       // This is only allowed to execute with 1 lane, so readfirstlane is safe.
2983       assert(OpdMapper.getVRegs(0).empty());
2984       substituteSimpleCopyRegs(OpdMapper, 3);
2985       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
2986       return;
2987     }
2988     case Intrinsic::amdgcn_ds_gws_init:
2989     case Intrinsic::amdgcn_ds_gws_barrier:
2990     case Intrinsic::amdgcn_ds_gws_sema_br: {
2991       // Only the first lane is executes, so readfirstlane is safe.
2992       substituteSimpleCopyRegs(OpdMapper, 1);
2993       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
2994       return;
2995     }
2996     case Intrinsic::amdgcn_ds_gws_sema_v:
2997     case Intrinsic::amdgcn_ds_gws_sema_p:
2998     case Intrinsic::amdgcn_ds_gws_sema_release_all: {
2999       // Only the first lane is executes, so readfirstlane is safe.
3000       constrainOpWithReadfirstlane(MI, MRI, 1); // M0
3001       return;
3002     }
3003     case Intrinsic::amdgcn_ds_append:
3004     case Intrinsic::amdgcn_ds_consume: {
3005       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
3006       return;
3007     }
3008     case Intrinsic::amdgcn_s_sendmsg:
3009     case Intrinsic::amdgcn_s_sendmsghalt: {
3010       // FIXME: Should this use a waterfall loop?
3011       constrainOpWithReadfirstlane(MI, MRI, 2); // M0
3012       return;
3013     }
3014     case Intrinsic::amdgcn_s_setreg: {
3015       constrainOpWithReadfirstlane(MI, MRI, 2);
3016       return;
3017     }
3018     default: {
3019       if (const AMDGPU::RsrcIntrinsic *RSrcIntrin =
3020               AMDGPU::lookupRsrcIntrinsic(IntrID)) {
3021         // Non-images can have complications from operands that allow both SGPR
3022         // and VGPR. For now it's too complicated to figure out the final opcode
3023         // to derive the register bank from the MCInstrDesc.
3024         if (RSrcIntrin->IsImage) {
3025           applyMappingImage(MI, OpdMapper, MRI, RSrcIntrin->RsrcArg);
3026           return;
3027         }
3028       }
3029 
3030       break;
3031     }
3032     }
3033     break;
3034   }
3035   case AMDGPU::G_LOAD:
3036   case AMDGPU::G_ZEXTLOAD:
3037   case AMDGPU::G_SEXTLOAD: {
3038     if (applyMappingWideLoad(MI, OpdMapper, MRI))
3039       return;
3040     break;
3041   }
3042   case AMDGPU::G_DYN_STACKALLOC:
3043     applyMappingDynStackAlloc(MI, OpdMapper, MRI);
3044     return;
3045   default:
3046     break;
3047   }
3048 
3049   return applyDefaultMapping(OpdMapper);
3050 }
3051 
3052 bool AMDGPURegisterBankInfo::isSALUMapping(const MachineInstr &MI) const {
3053   const MachineFunction &MF = *MI.getParent()->getParent();
3054   const MachineRegisterInfo &MRI = MF.getRegInfo();
3055   for (unsigned i = 0, e = MI.getNumOperands();i != e; ++i) {
3056     if (!MI.getOperand(i).isReg())
3057       continue;
3058     Register Reg = MI.getOperand(i).getReg();
3059     if (const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI)) {
3060       if (Bank->getID() != AMDGPU::SGPRRegBankID)
3061         return false;
3062     }
3063   }
3064   return true;
3065 }
3066 
3067 const RegisterBankInfo::InstructionMapping &
3068 AMDGPURegisterBankInfo::getDefaultMappingSOP(const MachineInstr &MI) const {
3069   const MachineFunction &MF = *MI.getParent()->getParent();
3070   const MachineRegisterInfo &MRI = MF.getRegInfo();
3071   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
3072 
3073   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
3074     const MachineOperand &SrcOp = MI.getOperand(i);
3075     if (!SrcOp.isReg())
3076       continue;
3077 
3078     unsigned Size = getSizeInBits(SrcOp.getReg(), MRI, *TRI);
3079     OpdsMapping[i] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
3080   }
3081   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
3082                                MI.getNumOperands());
3083 }
3084 
3085 const RegisterBankInfo::InstructionMapping &
3086 AMDGPURegisterBankInfo::getDefaultMappingVOP(const MachineInstr &MI) const {
3087   const MachineFunction &MF = *MI.getParent()->getParent();
3088   const MachineRegisterInfo &MRI = MF.getRegInfo();
3089   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
3090 
3091   // Even though we technically could use SGPRs, this would require knowledge of
3092   // the constant bus restriction. Force all sources to VGPR (except for VCC).
3093   //
3094   // TODO: Unary ops are trivially OK, so accept SGPRs?
3095   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
3096     const MachineOperand &Src = MI.getOperand(i);
3097     if (!Src.isReg())
3098       continue;
3099 
3100     unsigned Size = getSizeInBits(Src.getReg(), MRI, *TRI);
3101     unsigned BankID = Size == 1 ? AMDGPU::VCCRegBankID : AMDGPU::VGPRRegBankID;
3102     OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size);
3103   }
3104 
3105   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
3106                                MI.getNumOperands());
3107 }
3108 
3109 const RegisterBankInfo::InstructionMapping &
3110 AMDGPURegisterBankInfo::getDefaultMappingAllVGPR(const MachineInstr &MI) const {
3111   const MachineFunction &MF = *MI.getParent()->getParent();
3112   const MachineRegisterInfo &MRI = MF.getRegInfo();
3113   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
3114 
3115   for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) {
3116     const MachineOperand &Op = MI.getOperand(I);
3117     if (!Op.isReg())
3118       continue;
3119 
3120     unsigned Size = getSizeInBits(Op.getReg(), MRI, *TRI);
3121     OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3122   }
3123 
3124   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping),
3125                                MI.getNumOperands());
3126 }
3127 
3128 const RegisterBankInfo::InstructionMapping &
3129 AMDGPURegisterBankInfo::getImageMapping(const MachineRegisterInfo &MRI,
3130                                         const MachineInstr &MI,
3131                                         int RsrcIdx) const {
3132   // The reported argument index is relative to the IR intrinsic call arguments,
3133   // so we need to shift by the number of defs and the intrinsic ID.
3134   RsrcIdx += MI.getNumExplicitDefs() + 1;
3135 
3136   const int NumOps = MI.getNumOperands();
3137   SmallVector<const ValueMapping *, 8> OpdsMapping(NumOps);
3138 
3139   // TODO: Should packed/unpacked D16 difference be reported here as part of
3140   // the value mapping?
3141   for (int I = 0; I != NumOps; ++I) {
3142     if (!MI.getOperand(I).isReg())
3143       continue;
3144 
3145     Register OpReg = MI.getOperand(I).getReg();
3146     // We replace some dead address operands with $noreg
3147     if (!OpReg)
3148       continue;
3149 
3150     unsigned Size = getSizeInBits(OpReg, MRI, *TRI);
3151 
3152     // FIXME: Probably need a new intrinsic register bank searchable table to
3153     // handle arbitrary intrinsics easily.
3154     //
3155     // If this has a sampler, it immediately follows rsrc.
3156     const bool MustBeSGPR = I == RsrcIdx || I == RsrcIdx + 1;
3157 
3158     if (MustBeSGPR) {
3159       // If this must be an SGPR, so we must report whatever it is as legal.
3160       unsigned NewBank = getRegBankID(OpReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
3161       OpdsMapping[I] = AMDGPU::getValueMapping(NewBank, Size);
3162     } else {
3163       // Some operands must be VGPR, and these are easy to copy to.
3164       OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3165     }
3166   }
3167 
3168   return getInstructionMapping(1, 1, getOperandsMapping(OpdsMapping), NumOps);
3169 }
3170 
3171 /// Return the mapping for a pointer arugment.
3172 const RegisterBankInfo::ValueMapping *
3173 AMDGPURegisterBankInfo::getValueMappingForPtr(const MachineRegisterInfo &MRI,
3174                                               Register PtrReg) const {
3175   LLT PtrTy = MRI.getType(PtrReg);
3176   unsigned Size = PtrTy.getSizeInBits();
3177   if (Subtarget.useFlatForGlobal() ||
3178       !SITargetLowering::isFlatGlobalAddrSpace(PtrTy.getAddressSpace()))
3179     return AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3180 
3181   // If we're using MUBUF instructions for global memory, an SGPR base register
3182   // is possible. Otherwise this needs to be a VGPR.
3183   const RegisterBank *PtrBank = getRegBank(PtrReg, MRI, *TRI);
3184   return AMDGPU::getValueMapping(PtrBank->getID(), Size);
3185 }
3186 
3187 const RegisterBankInfo::InstructionMapping &
3188 AMDGPURegisterBankInfo::getInstrMappingForLoad(const MachineInstr &MI) const {
3189 
3190   const MachineFunction &MF = *MI.getParent()->getParent();
3191   const MachineRegisterInfo &MRI = MF.getRegInfo();
3192   SmallVector<const ValueMapping*, 2> OpdsMapping(2);
3193   unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
3194   Register PtrReg = MI.getOperand(1).getReg();
3195   LLT PtrTy = MRI.getType(PtrReg);
3196   unsigned AS = PtrTy.getAddressSpace();
3197   unsigned PtrSize = PtrTy.getSizeInBits();
3198 
3199   const ValueMapping *ValMapping;
3200   const ValueMapping *PtrMapping;
3201 
3202   const RegisterBank *PtrBank = getRegBank(PtrReg, MRI, *TRI);
3203 
3204   if (PtrBank == &AMDGPU::SGPRRegBank &&
3205       SITargetLowering::isFlatGlobalAddrSpace(AS)) {
3206     if (isScalarLoadLegal(MI)) {
3207       // We have a uniform instruction so we want to use an SMRD load
3208       ValMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
3209       PtrMapping = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, PtrSize);
3210     } else {
3211       ValMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3212 
3213       // If we're using MUBUF instructions for global memory, an SGPR base
3214       // register is possible. Otherwise this needs to be a VGPR.
3215       unsigned PtrBankID = Subtarget.useFlatForGlobal() ?
3216         AMDGPU::VGPRRegBankID : AMDGPU::SGPRRegBankID;
3217 
3218       PtrMapping = AMDGPU::getValueMapping(PtrBankID, PtrSize);
3219     }
3220   } else {
3221     ValMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3222     PtrMapping = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, PtrSize);
3223   }
3224 
3225   OpdsMapping[0] = ValMapping;
3226   OpdsMapping[1] = PtrMapping;
3227   const RegisterBankInfo::InstructionMapping &Mapping = getInstructionMapping(
3228       1, 1, getOperandsMapping(OpdsMapping), MI.getNumOperands());
3229   return Mapping;
3230 
3231   // FIXME: Do we want to add a mapping for FLAT load, or should we just
3232   // handle that during instruction selection?
3233 }
3234 
3235 unsigned
3236 AMDGPURegisterBankInfo::getRegBankID(Register Reg,
3237                                      const MachineRegisterInfo &MRI,
3238                                      const TargetRegisterInfo &TRI,
3239                                      unsigned Default) const {
3240   const RegisterBank *Bank = getRegBank(Reg, MRI, TRI);
3241   return Bank ? Bank->getID() : Default;
3242 }
3243 
3244 
3245 static unsigned regBankUnion(unsigned RB0, unsigned RB1) {
3246   return (RB0 == AMDGPU::SGPRRegBankID && RB1 == AMDGPU::SGPRRegBankID) ?
3247     AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
3248 }
3249 
3250 static int regBankBoolUnion(int RB0, int RB1) {
3251   if (RB0 == -1)
3252     return RB1;
3253   if (RB1 == -1)
3254     return RB0;
3255 
3256   // vcc, vcc -> vcc
3257   // vcc, sgpr -> vcc
3258   // vcc, vgpr -> vcc
3259   if (RB0 == AMDGPU::VCCRegBankID || RB1 == AMDGPU::VCCRegBankID)
3260     return AMDGPU::VCCRegBankID;
3261 
3262   // vcc, vgpr -> vgpr
3263   return regBankUnion(RB0, RB1);
3264 }
3265 
3266 const RegisterBankInfo::ValueMapping *
3267 AMDGPURegisterBankInfo::getSGPROpMapping(Register Reg,
3268                                          const MachineRegisterInfo &MRI,
3269                                          const TargetRegisterInfo &TRI) const {
3270   // Lie and claim anything is legal, even though this needs to be an SGPR
3271   // applyMapping will have to deal with it as a waterfall loop.
3272   unsigned Bank = getRegBankID(Reg, MRI, TRI, AMDGPU::SGPRRegBankID);
3273   unsigned Size = getSizeInBits(Reg, MRI, TRI);
3274   return AMDGPU::getValueMapping(Bank, Size);
3275 }
3276 
3277 const RegisterBankInfo::ValueMapping *
3278 AMDGPURegisterBankInfo::getVGPROpMapping(Register Reg,
3279                                          const MachineRegisterInfo &MRI,
3280                                          const TargetRegisterInfo &TRI) const {
3281   unsigned Size = getSizeInBits(Reg, MRI, TRI);
3282   return AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3283 }
3284 
3285 const RegisterBankInfo::ValueMapping *
3286 AMDGPURegisterBankInfo::getAGPROpMapping(Register Reg,
3287                                          const MachineRegisterInfo &MRI,
3288                                          const TargetRegisterInfo &TRI) const {
3289   unsigned Size = getSizeInBits(Reg, MRI, TRI);
3290   return AMDGPU::getValueMapping(AMDGPU::AGPRRegBankID, Size);
3291 }
3292 
3293 ///
3294 /// This function must return a legal mapping, because
3295 /// AMDGPURegisterBankInfo::getInstrAlternativeMappings() is not called
3296 /// in RegBankSelect::Mode::Fast.  Any mapping that would cause a
3297 /// VGPR to SGPR generated is illegal.
3298 ///
3299 // Operands that must be SGPRs must accept potentially divergent VGPRs as
3300 // legal. These will be dealt with in applyMappingImpl.
3301 //
3302 const RegisterBankInfo::InstructionMapping &
3303 AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
3304   const MachineFunction &MF = *MI.getParent()->getParent();
3305   const MachineRegisterInfo &MRI = MF.getRegInfo();
3306 
3307   if (MI.isCopy()) {
3308     // The default logic bothers to analyze impossible alternative mappings. We
3309     // want the most straightforward mapping, so just directly handle this.
3310     const RegisterBank *DstBank = getRegBank(MI.getOperand(0).getReg(), MRI,
3311                                              *TRI);
3312     const RegisterBank *SrcBank = getRegBank(MI.getOperand(1).getReg(), MRI,
3313                                              *TRI);
3314     assert(SrcBank && "src bank should have been assigned already");
3315     if (!DstBank)
3316       DstBank = SrcBank;
3317 
3318     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
3319     if (cannotCopy(*DstBank, *SrcBank, Size))
3320       return getInvalidInstructionMapping();
3321 
3322     const ValueMapping &ValMap = getValueMapping(0, Size, *DstBank);
3323     return getInstructionMapping(
3324         1, /*Cost*/ 1,
3325         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
3326   }
3327 
3328   if (MI.isRegSequence()) {
3329     // If any input is a VGPR, the result must be a VGPR. The default handling
3330     // assumes any copy between banks is legal.
3331     unsigned BankID = AMDGPU::SGPRRegBankID;
3332 
3333     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
3334       auto OpBank = getRegBankID(MI.getOperand(I).getReg(), MRI, *TRI);
3335       // It doesn't make sense to use vcc or scc banks here, so just ignore
3336       // them.
3337       if (OpBank != AMDGPU::SGPRRegBankID) {
3338         BankID = AMDGPU::VGPRRegBankID;
3339         break;
3340       }
3341     }
3342     unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
3343 
3344     const ValueMapping &ValMap = getValueMapping(0, Size, getRegBank(BankID));
3345     return getInstructionMapping(
3346         1, /*Cost*/ 1,
3347         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
3348   }
3349 
3350   // The default handling is broken and doesn't handle illegal SGPR->VGPR copies
3351   // properly.
3352   //
3353   // TODO: There are additional exec masking dependencies to analyze.
3354   if (MI.getOpcode() == TargetOpcode::G_PHI) {
3355     // TODO: Generate proper invalid bank enum.
3356     int ResultBank = -1;
3357     Register DstReg = MI.getOperand(0).getReg();
3358 
3359     // Sometimes the result may have already been assigned a bank.
3360     if (const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI))
3361       ResultBank = DstBank->getID();
3362 
3363     for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
3364       Register Reg = MI.getOperand(I).getReg();
3365       const RegisterBank *Bank = getRegBank(Reg, MRI, *TRI);
3366 
3367       // FIXME: Assuming VGPR for any undetermined inputs.
3368       if (!Bank || Bank->getID() == AMDGPU::VGPRRegBankID) {
3369         ResultBank = AMDGPU::VGPRRegBankID;
3370         break;
3371       }
3372 
3373       // FIXME: Need to promote SGPR case to s32
3374       unsigned OpBank = Bank->getID();
3375       ResultBank = regBankBoolUnion(ResultBank, OpBank);
3376     }
3377 
3378     assert(ResultBank != -1);
3379 
3380     unsigned Size = MRI.getType(DstReg).getSizeInBits();
3381 
3382     const ValueMapping &ValMap =
3383         getValueMapping(0, Size, getRegBank(ResultBank));
3384     return getInstructionMapping(
3385         1, /*Cost*/ 1,
3386         /*OperandsMapping*/ getOperandsMapping({&ValMap}), 1);
3387   }
3388 
3389   const RegisterBankInfo::InstructionMapping &Mapping = getInstrMappingImpl(MI);
3390   if (Mapping.isValid())
3391     return Mapping;
3392 
3393   SmallVector<const ValueMapping*, 8> OpdsMapping(MI.getNumOperands());
3394 
3395   switch (MI.getOpcode()) {
3396   default:
3397     return getInvalidInstructionMapping();
3398 
3399   case AMDGPU::G_AND:
3400   case AMDGPU::G_OR:
3401   case AMDGPU::G_XOR: {
3402     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3403     if (Size == 1) {
3404       const RegisterBank *DstBank
3405         = getRegBank(MI.getOperand(0).getReg(), MRI, *TRI);
3406 
3407       unsigned TargetBankID = -1;
3408       unsigned BankLHS = -1;
3409       unsigned BankRHS = -1;
3410       if (DstBank) {
3411         TargetBankID = DstBank->getID();
3412         if (DstBank == &AMDGPU::VCCRegBank) {
3413           TargetBankID = AMDGPU::VCCRegBankID;
3414           BankLHS = AMDGPU::VCCRegBankID;
3415           BankRHS = AMDGPU::VCCRegBankID;
3416         } else {
3417           BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
3418                                  AMDGPU::SGPRRegBankID);
3419           BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
3420                                  AMDGPU::SGPRRegBankID);
3421         }
3422       } else {
3423         BankLHS = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
3424                                AMDGPU::VCCRegBankID);
3425         BankRHS = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
3426                                AMDGPU::VCCRegBankID);
3427 
3428         // Both inputs should be true booleans to produce a boolean result.
3429         if (BankLHS == AMDGPU::VGPRRegBankID || BankRHS == AMDGPU::VGPRRegBankID) {
3430           TargetBankID = AMDGPU::VGPRRegBankID;
3431         } else if (BankLHS == AMDGPU::VCCRegBankID || BankRHS == AMDGPU::VCCRegBankID) {
3432           TargetBankID = AMDGPU::VCCRegBankID;
3433           BankLHS = AMDGPU::VCCRegBankID;
3434           BankRHS = AMDGPU::VCCRegBankID;
3435         } else if (BankLHS == AMDGPU::SGPRRegBankID && BankRHS == AMDGPU::SGPRRegBankID) {
3436           TargetBankID = AMDGPU::SGPRRegBankID;
3437         }
3438       }
3439 
3440       OpdsMapping[0] = AMDGPU::getValueMapping(TargetBankID, Size);
3441       OpdsMapping[1] = AMDGPU::getValueMapping(BankLHS, Size);
3442       OpdsMapping[2] = AMDGPU::getValueMapping(BankRHS, Size);
3443       break;
3444     }
3445 
3446     if (Size == 64) {
3447 
3448       if (isSALUMapping(MI)) {
3449         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::SGPRRegBankID, Size);
3450         OpdsMapping[1] = OpdsMapping[2] = OpdsMapping[0];
3451       } else {
3452         OpdsMapping[0] = getValueMappingSGPR64Only(AMDGPU::VGPRRegBankID, Size);
3453         unsigned Bank1 = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI/*, DefaultBankID*/);
3454         OpdsMapping[1] = AMDGPU::getValueMapping(Bank1, Size);
3455 
3456         unsigned Bank2 = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI/*, DefaultBankID*/);
3457         OpdsMapping[2] = AMDGPU::getValueMapping(Bank2, Size);
3458       }
3459 
3460       break;
3461     }
3462 
3463     LLVM_FALLTHROUGH;
3464   }
3465   case AMDGPU::G_PTR_ADD:
3466   case AMDGPU::G_PTRMASK:
3467   case AMDGPU::G_ADD:
3468   case AMDGPU::G_SUB:
3469   case AMDGPU::G_MUL:
3470   case AMDGPU::G_SHL:
3471   case AMDGPU::G_LSHR:
3472   case AMDGPU::G_ASHR:
3473   case AMDGPU::G_UADDO:
3474   case AMDGPU::G_USUBO:
3475   case AMDGPU::G_UADDE:
3476   case AMDGPU::G_SADDE:
3477   case AMDGPU::G_USUBE:
3478   case AMDGPU::G_SSUBE:
3479   case AMDGPU::G_SMIN:
3480   case AMDGPU::G_SMAX:
3481   case AMDGPU::G_UMIN:
3482   case AMDGPU::G_UMAX:
3483   case AMDGPU::G_SHUFFLE_VECTOR:
3484     if (isSALUMapping(MI))
3485       return getDefaultMappingSOP(MI);
3486     LLVM_FALLTHROUGH;
3487 
3488   case AMDGPU::G_FADD:
3489   case AMDGPU::G_FSUB:
3490   case AMDGPU::G_FPTOSI:
3491   case AMDGPU::G_FPTOUI:
3492   case AMDGPU::G_FMUL:
3493   case AMDGPU::G_FMA:
3494   case AMDGPU::G_FMAD:
3495   case AMDGPU::G_FSQRT:
3496   case AMDGPU::G_FFLOOR:
3497   case AMDGPU::G_FCEIL:
3498   case AMDGPU::G_FRINT:
3499   case AMDGPU::G_SITOFP:
3500   case AMDGPU::G_UITOFP:
3501   case AMDGPU::G_FPTRUNC:
3502   case AMDGPU::G_FPEXT:
3503   case AMDGPU::G_FEXP2:
3504   case AMDGPU::G_FLOG2:
3505   case AMDGPU::G_FMINNUM:
3506   case AMDGPU::G_FMAXNUM:
3507   case AMDGPU::G_FMINNUM_IEEE:
3508   case AMDGPU::G_FMAXNUM_IEEE:
3509   case AMDGPU::G_FCANONICALIZE:
3510   case AMDGPU::G_INTRINSIC_TRUNC:
3511   case AMDGPU::G_BSWAP: // TODO: Somehow expand for scalar?
3512   case AMDGPU::G_FSHR: // TODO: Expand for scalar
3513   case AMDGPU::G_AMDGPU_FFBH_U32:
3514   case AMDGPU::G_AMDGPU_FMIN_LEGACY:
3515   case AMDGPU::G_AMDGPU_FMAX_LEGACY:
3516   case AMDGPU::G_AMDGPU_RCP_IFLAG:
3517   case AMDGPU::G_AMDGPU_CVT_F32_UBYTE0:
3518   case AMDGPU::G_AMDGPU_CVT_F32_UBYTE1:
3519   case AMDGPU::G_AMDGPU_CVT_F32_UBYTE2:
3520   case AMDGPU::G_AMDGPU_CVT_F32_UBYTE3:
3521     return getDefaultMappingVOP(MI);
3522   case AMDGPU::G_UMULH:
3523   case AMDGPU::G_SMULH: {
3524     if (Subtarget.hasScalarMulHiInsts() && isSALUMapping(MI))
3525       return getDefaultMappingSOP(MI);
3526     return getDefaultMappingVOP(MI);
3527   }
3528   case AMDGPU::G_IMPLICIT_DEF: {
3529     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3530     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
3531     break;
3532   }
3533   case AMDGPU::G_FCONSTANT:
3534   case AMDGPU::G_CONSTANT:
3535   case AMDGPU::G_GLOBAL_VALUE:
3536   case AMDGPU::G_BLOCK_ADDR:
3537   case AMDGPU::G_READCYCLECOUNTER: {
3538     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3539     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
3540     break;
3541   }
3542   case AMDGPU::G_FRAME_INDEX: {
3543     // TODO: This should be the same as other constants, but eliminateFrameIndex
3544     // currently assumes VALU uses.
3545     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3546     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3547     break;
3548   }
3549   case AMDGPU::G_DYN_STACKALLOC: {
3550     // Result is always uniform, and a wave reduction is needed for the source.
3551     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, 32);
3552     unsigned SrcBankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3553     OpdsMapping[1] = AMDGPU::getValueMapping(SrcBankID, 32);
3554     break;
3555   }
3556   case AMDGPU::G_INSERT: {
3557     unsigned BankID = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
3558                                           AMDGPU::VGPRRegBankID;
3559     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
3560     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
3561     unsigned EltSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, *TRI);
3562     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
3563     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
3564     OpdsMapping[2] = AMDGPU::getValueMapping(BankID, EltSize);
3565     OpdsMapping[3] = nullptr;
3566     break;
3567   }
3568   case AMDGPU::G_EXTRACT: {
3569     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3570     unsigned DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
3571     unsigned SrcSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
3572     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, DstSize);
3573     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, SrcSize);
3574     OpdsMapping[2] = nullptr;
3575     break;
3576   }
3577   case AMDGPU::G_BUILD_VECTOR:
3578   case AMDGPU::G_BUILD_VECTOR_TRUNC: {
3579     LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
3580     if (DstTy == LLT::vector(2, 16)) {
3581       unsigned DstSize = DstTy.getSizeInBits();
3582       unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
3583       unsigned Src0BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3584       unsigned Src1BankID = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
3585       unsigned DstBankID = regBankUnion(Src0BankID, Src1BankID);
3586 
3587       OpdsMapping[0] = AMDGPU::getValueMapping(DstBankID, DstSize);
3588       OpdsMapping[1] = AMDGPU::getValueMapping(Src0BankID, SrcSize);
3589       OpdsMapping[2] = AMDGPU::getValueMapping(Src1BankID, SrcSize);
3590       break;
3591     }
3592 
3593     LLVM_FALLTHROUGH;
3594   }
3595   case AMDGPU::G_MERGE_VALUES:
3596   case AMDGPU::G_CONCAT_VECTORS: {
3597     unsigned Bank = isSALUMapping(MI) ?
3598       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
3599     unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3600     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
3601 
3602     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
3603     // Op1 and Dst should use the same register bank.
3604     for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i)
3605       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, SrcSize);
3606     break;
3607   }
3608   case AMDGPU::G_BITCAST:
3609   case AMDGPU::G_INTTOPTR:
3610   case AMDGPU::G_PTRTOINT:
3611   case AMDGPU::G_BITREVERSE:
3612   case AMDGPU::G_FABS:
3613   case AMDGPU::G_FNEG: {
3614     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3615     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3616     OpdsMapping[0] = OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size);
3617     break;
3618   }
3619   case AMDGPU::G_CTLZ_ZERO_UNDEF:
3620   case AMDGPU::G_CTTZ_ZERO_UNDEF:
3621   case AMDGPU::G_CTPOP: {
3622     unsigned Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
3623     unsigned BankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3624     OpdsMapping[0] = AMDGPU::getValueMapping(BankID, 32);
3625 
3626     // This should really be getValueMappingSGPR64Only, but allowing the generic
3627     // code to handle the register split just makes using LegalizerHelper more
3628     // difficult.
3629     OpdsMapping[1] = AMDGPU::getValueMapping(BankID, Size);
3630     break;
3631   }
3632   case AMDGPU::G_TRUNC: {
3633     Register Dst = MI.getOperand(0).getReg();
3634     Register Src = MI.getOperand(1).getReg();
3635     unsigned Bank = getRegBankID(Src, MRI, *TRI);
3636     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
3637     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
3638     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, DstSize);
3639     OpdsMapping[1] = AMDGPU::getValueMapping(Bank, SrcSize);
3640     break;
3641   }
3642   case AMDGPU::G_ZEXT:
3643   case AMDGPU::G_SEXT:
3644   case AMDGPU::G_ANYEXT:
3645   case AMDGPU::G_SEXT_INREG: {
3646     Register Dst = MI.getOperand(0).getReg();
3647     Register Src = MI.getOperand(1).getReg();
3648     unsigned DstSize = getSizeInBits(Dst, MRI, *TRI);
3649     unsigned SrcSize = getSizeInBits(Src, MRI, *TRI);
3650 
3651     unsigned DstBank;
3652     const RegisterBank *SrcBank = getRegBank(Src, MRI, *TRI);
3653     assert(SrcBank);
3654     switch (SrcBank->getID()) {
3655     case AMDGPU::SGPRRegBankID:
3656       DstBank = AMDGPU::SGPRRegBankID;
3657       break;
3658     default:
3659       DstBank = AMDGPU::VGPRRegBankID;
3660       break;
3661     }
3662 
3663     // Scalar extend can use 64-bit BFE, but VGPRs require extending to
3664     // 32-bits, and then to 64.
3665     OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(DstBank, DstSize);
3666     OpdsMapping[1] = AMDGPU::getValueMappingSGPR64Only(SrcBank->getID(),
3667                                                        SrcSize);
3668     break;
3669   }
3670   case AMDGPU::G_FCMP: {
3671     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
3672     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
3673     OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
3674     OpdsMapping[1] = nullptr; // Predicate Operand.
3675     OpdsMapping[2] = AMDGPU::getValueMapping(Op2Bank, Size);
3676     OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3677     break;
3678   }
3679   case AMDGPU::G_STORE: {
3680     assert(MI.getOperand(0).isReg());
3681     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3682 
3683     // FIXME: We need to specify a different reg bank once scalar stores are
3684     // supported.
3685     const ValueMapping *ValMapping =
3686         AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
3687     OpdsMapping[0] = ValMapping;
3688     OpdsMapping[1] = getValueMappingForPtr(MRI, MI.getOperand(1).getReg());
3689     break;
3690   }
3691   case AMDGPU::G_ICMP: {
3692     auto Pred = static_cast<CmpInst::Predicate>(MI.getOperand(1).getPredicate());
3693     unsigned Size = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
3694 
3695     // See if the result register has already been constrained to vcc, which may
3696     // happen due to control flow intrinsic lowering.
3697     unsigned DstBank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI,
3698                                     AMDGPU::SGPRRegBankID);
3699     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
3700     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
3701 
3702     bool CanUseSCC = DstBank == AMDGPU::SGPRRegBankID &&
3703                      Op2Bank == AMDGPU::SGPRRegBankID &&
3704                      Op3Bank == AMDGPU::SGPRRegBankID &&
3705       (Size == 32 || (Size == 64 &&
3706                       (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) &&
3707                       Subtarget.hasScalarCompareEq64()));
3708 
3709     DstBank = CanUseSCC ? AMDGPU::SGPRRegBankID : AMDGPU::VCCRegBankID;
3710     unsigned SrcBank = CanUseSCC ? AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
3711 
3712     // TODO: Use 32-bit for scalar output size.
3713     // SCC results will need to be copied to a 32-bit SGPR virtual register.
3714     const unsigned ResultSize = 1;
3715 
3716     OpdsMapping[0] = AMDGPU::getValueMapping(DstBank, ResultSize);
3717     OpdsMapping[2] = AMDGPU::getValueMapping(SrcBank, Size);
3718     OpdsMapping[3] = AMDGPU::getValueMapping(SrcBank, Size);
3719     break;
3720   }
3721   case AMDGPU::G_EXTRACT_VECTOR_ELT: {
3722     // VGPR index can be used for waterfall when indexing a SGPR vector.
3723     unsigned SrcBankID = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI);
3724     unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3725     unsigned SrcSize = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
3726     unsigned IdxSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
3727     unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI);
3728     unsigned OutputBankID = regBankUnion(SrcBankID, IdxBank);
3729 
3730     OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(OutputBankID, DstSize);
3731     OpdsMapping[1] = AMDGPU::getValueMapping(SrcBankID, SrcSize);
3732 
3733     // The index can be either if the source vector is VGPR.
3734     OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, IdxSize);
3735     break;
3736   }
3737   case AMDGPU::G_INSERT_VECTOR_ELT: {
3738     unsigned OutputBankID = isSALUMapping(MI) ?
3739       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
3740 
3741     unsigned VecSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3742     unsigned InsertSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
3743     unsigned IdxSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
3744     unsigned InsertEltBankID = getRegBankID(MI.getOperand(2).getReg(),
3745                                             MRI, *TRI);
3746     unsigned IdxBankID = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI);
3747 
3748     OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, VecSize);
3749     OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, VecSize);
3750 
3751     // This is a weird case, because we need to break down the mapping based on
3752     // the register bank of a different operand.
3753     if (InsertSize == 64 && OutputBankID == AMDGPU::VGPRRegBankID) {
3754       OpdsMapping[2] = AMDGPU::getValueMappingSplit64(InsertEltBankID,
3755                                                       InsertSize);
3756     } else {
3757       assert(InsertSize == 32 || InsertSize == 64);
3758       OpdsMapping[2] = AMDGPU::getValueMapping(InsertEltBankID, InsertSize);
3759     }
3760 
3761     // The index can be either if the source vector is VGPR.
3762     OpdsMapping[3] = AMDGPU::getValueMapping(IdxBankID, IdxSize);
3763     break;
3764   }
3765   case AMDGPU::G_UNMERGE_VALUES: {
3766     unsigned Bank = isSALUMapping(MI) ? AMDGPU::SGPRRegBankID :
3767       AMDGPU::VGPRRegBankID;
3768 
3769     // Op1 and Dst should use the same register bank.
3770     // FIXME: Shouldn't this be the default? Why do we need to handle this?
3771     for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
3772       unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI);
3773       OpdsMapping[i] = AMDGPU::getValueMapping(Bank, Size);
3774     }
3775     break;
3776   }
3777   case AMDGPU::G_AMDGPU_BUFFER_LOAD:
3778   case AMDGPU::G_AMDGPU_BUFFER_LOAD_UBYTE:
3779   case AMDGPU::G_AMDGPU_BUFFER_LOAD_SBYTE:
3780   case AMDGPU::G_AMDGPU_BUFFER_LOAD_USHORT:
3781   case AMDGPU::G_AMDGPU_BUFFER_LOAD_SSHORT:
3782   case AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT:
3783   case AMDGPU::G_AMDGPU_BUFFER_LOAD_FORMAT_D16:
3784   case AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT:
3785   case AMDGPU::G_AMDGPU_TBUFFER_LOAD_FORMAT_D16:
3786   case AMDGPU::G_AMDGPU_BUFFER_STORE:
3787   case AMDGPU::G_AMDGPU_BUFFER_STORE_BYTE:
3788   case AMDGPU::G_AMDGPU_BUFFER_STORE_SHORT:
3789   case AMDGPU::G_AMDGPU_BUFFER_STORE_FORMAT:
3790   case AMDGPU::G_AMDGPU_BUFFER_STORE_FORMAT_D16: {
3791     OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
3792 
3793     // rsrc
3794     OpdsMapping[1] = getSGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
3795 
3796     // vindex
3797     OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
3798 
3799     // voffset
3800     OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
3801 
3802     // soffset
3803     OpdsMapping[4] = getSGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
3804 
3805     // Any remaining operands are immediates and were correctly null
3806     // initialized.
3807     break;
3808   }
3809   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SWAP:
3810   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_ADD:
3811   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SUB:
3812   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMIN:
3813   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMIN:
3814   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_SMAX:
3815   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_UMAX:
3816   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_AND:
3817   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_OR:
3818   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_XOR:
3819   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_INC:
3820   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_DEC: {
3821     // vdata_out
3822     OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
3823 
3824     // vdata_in
3825     OpdsMapping[1] = getVGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
3826 
3827     // rsrc
3828     OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
3829 
3830     // vindex
3831     OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
3832 
3833     // voffset
3834     OpdsMapping[4] = getVGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
3835 
3836     // soffset
3837     OpdsMapping[5] = getSGPROpMapping(MI.getOperand(5).getReg(), MRI, *TRI);
3838 
3839     // Any remaining operands are immediates and were correctly null
3840     // initialized.
3841     break;
3842   }
3843   case AMDGPU::G_AMDGPU_BUFFER_ATOMIC_CMPSWAP: {
3844     // vdata_out
3845     OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
3846 
3847     // vdata_in
3848     OpdsMapping[1] = getVGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
3849 
3850     // cmp
3851     OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
3852 
3853     // rsrc
3854     OpdsMapping[3] = getSGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
3855 
3856     // vindex
3857     OpdsMapping[4] = getVGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
3858 
3859     // voffset
3860     OpdsMapping[5] = getVGPROpMapping(MI.getOperand(5).getReg(), MRI, *TRI);
3861 
3862     // soffset
3863     OpdsMapping[6] = getSGPROpMapping(MI.getOperand(6).getReg(), MRI, *TRI);
3864 
3865     // Any remaining operands are immediates and were correctly null
3866     // initialized.
3867     break;
3868   }
3869   case AMDGPU::G_AMDGPU_S_BUFFER_LOAD: {
3870     // Lie and claim everything is legal, even though some need to be
3871     // SGPRs. applyMapping will have to deal with it as a waterfall loop.
3872     OpdsMapping[1] = getSGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
3873     OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
3874 
3875     // We need to convert this to a MUBUF if either the resource of offset is
3876     // VGPR.
3877     unsigned RSrcBank = OpdsMapping[1]->BreakDown[0].RegBank->getID();
3878     unsigned OffsetBank = OpdsMapping[2]->BreakDown[0].RegBank->getID();
3879     unsigned ResultBank = regBankUnion(RSrcBank, OffsetBank);
3880 
3881     unsigned Size0 = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3882     OpdsMapping[0] = AMDGPU::getValueMapping(ResultBank, Size0);
3883     break;
3884   }
3885   case AMDGPU::G_INTRINSIC: {
3886     switch (MI.getIntrinsicID()) {
3887     default:
3888       return getInvalidInstructionMapping();
3889     case Intrinsic::amdgcn_div_fmas:
3890     case Intrinsic::amdgcn_div_fixup:
3891     case Intrinsic::amdgcn_trig_preop:
3892     case Intrinsic::amdgcn_sin:
3893     case Intrinsic::amdgcn_cos:
3894     case Intrinsic::amdgcn_log_clamp:
3895     case Intrinsic::amdgcn_rcp:
3896     case Intrinsic::amdgcn_rcp_legacy:
3897     case Intrinsic::amdgcn_rsq:
3898     case Intrinsic::amdgcn_rsq_legacy:
3899     case Intrinsic::amdgcn_rsq_clamp:
3900     case Intrinsic::amdgcn_fmul_legacy:
3901     case Intrinsic::amdgcn_ldexp:
3902     case Intrinsic::amdgcn_frexp_mant:
3903     case Intrinsic::amdgcn_frexp_exp:
3904     case Intrinsic::amdgcn_fract:
3905     case Intrinsic::amdgcn_cvt_pkrtz:
3906     case Intrinsic::amdgcn_cvt_pknorm_i16:
3907     case Intrinsic::amdgcn_cvt_pknorm_u16:
3908     case Intrinsic::amdgcn_cvt_pk_i16:
3909     case Intrinsic::amdgcn_cvt_pk_u16:
3910     case Intrinsic::amdgcn_fmed3:
3911     case Intrinsic::amdgcn_cubeid:
3912     case Intrinsic::amdgcn_cubema:
3913     case Intrinsic::amdgcn_cubesc:
3914     case Intrinsic::amdgcn_cubetc:
3915     case Intrinsic::amdgcn_sffbh:
3916     case Intrinsic::amdgcn_fmad_ftz:
3917     case Intrinsic::amdgcn_mbcnt_lo:
3918     case Intrinsic::amdgcn_mbcnt_hi:
3919     case Intrinsic::amdgcn_mul_u24:
3920     case Intrinsic::amdgcn_mul_i24:
3921     case Intrinsic::amdgcn_lerp:
3922     case Intrinsic::amdgcn_sad_u8:
3923     case Intrinsic::amdgcn_msad_u8:
3924     case Intrinsic::amdgcn_sad_hi_u8:
3925     case Intrinsic::amdgcn_sad_u16:
3926     case Intrinsic::amdgcn_qsad_pk_u16_u8:
3927     case Intrinsic::amdgcn_mqsad_pk_u16_u8:
3928     case Intrinsic::amdgcn_mqsad_u32_u8:
3929     case Intrinsic::amdgcn_cvt_pk_u8_f32:
3930     case Intrinsic::amdgcn_alignbit:
3931     case Intrinsic::amdgcn_alignbyte:
3932     case Intrinsic::amdgcn_fdot2:
3933     case Intrinsic::amdgcn_sdot2:
3934     case Intrinsic::amdgcn_udot2:
3935     case Intrinsic::amdgcn_sdot4:
3936     case Intrinsic::amdgcn_udot4:
3937     case Intrinsic::amdgcn_sdot8:
3938     case Intrinsic::amdgcn_udot8:
3939       return getDefaultMappingVOP(MI);
3940     case Intrinsic::amdgcn_sbfe:
3941     case Intrinsic::amdgcn_ubfe:
3942       if (isSALUMapping(MI))
3943         return getDefaultMappingSOP(MI);
3944       return getDefaultMappingVOP(MI);
3945     case Intrinsic::amdgcn_ds_swizzle:
3946     case Intrinsic::amdgcn_ds_permute:
3947     case Intrinsic::amdgcn_ds_bpermute:
3948     case Intrinsic::amdgcn_update_dpp:
3949     case Intrinsic::amdgcn_mov_dpp8:
3950     case Intrinsic::amdgcn_mov_dpp:
3951     case Intrinsic::amdgcn_wwm:
3952     case Intrinsic::amdgcn_wqm:
3953     case Intrinsic::amdgcn_softwqm:
3954       return getDefaultMappingAllVGPR(MI);
3955     case Intrinsic::amdgcn_kernarg_segment_ptr:
3956     case Intrinsic::amdgcn_s_getpc:
3957     case Intrinsic::amdgcn_groupstaticsize: {
3958       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3959       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
3960       break;
3961     }
3962     case Intrinsic::amdgcn_wqm_vote: {
3963       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3964       OpdsMapping[0] = OpdsMapping[2]
3965         = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Size);
3966       break;
3967     }
3968     case Intrinsic::amdgcn_ps_live: {
3969       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
3970       break;
3971     }
3972     case Intrinsic::amdgcn_div_scale: {
3973       unsigned Dst0Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3974       unsigned Dst1Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
3975       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Dst0Size);
3976       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, Dst1Size);
3977 
3978       unsigned SrcSize = MRI.getType(MI.getOperand(3).getReg()).getSizeInBits();
3979       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
3980       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
3981       break;
3982     }
3983     case Intrinsic::amdgcn_class: {
3984       Register Src0Reg = MI.getOperand(2).getReg();
3985       Register Src1Reg = MI.getOperand(3).getReg();
3986       unsigned Src0Size = MRI.getType(Src0Reg).getSizeInBits();
3987       unsigned Src1Size = MRI.getType(Src1Reg).getSizeInBits();
3988       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3989       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, DstSize);
3990       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Src0Size);
3991       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Src1Size);
3992       break;
3993     }
3994     case Intrinsic::amdgcn_icmp:
3995     case Intrinsic::amdgcn_fcmp: {
3996       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3997       // This is not VCCRegBank because this is not used in boolean contexts.
3998       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize);
3999       unsigned OpSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
4000       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, OpSize);
4001       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, OpSize);
4002       break;
4003     }
4004     case Intrinsic::amdgcn_readlane: {
4005       // This must be an SGPR, but accept a VGPR.
4006       Register IdxReg = MI.getOperand(3).getReg();
4007       unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits();
4008       unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
4009       OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
4010       LLVM_FALLTHROUGH;
4011     }
4012     case Intrinsic::amdgcn_readfirstlane: {
4013       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4014       unsigned SrcSize = MRI.getType(MI.getOperand(2).getReg()).getSizeInBits();
4015       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, DstSize);
4016       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
4017       break;
4018     }
4019     case Intrinsic::amdgcn_writelane: {
4020       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4021       Register SrcReg = MI.getOperand(2).getReg();
4022       unsigned SrcSize = MRI.getType(SrcReg).getSizeInBits();
4023       unsigned SrcBank = getRegBankID(SrcReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
4024       Register IdxReg = MI.getOperand(3).getReg();
4025       unsigned IdxSize = MRI.getType(IdxReg).getSizeInBits();
4026       unsigned IdxBank = getRegBankID(IdxReg, MRI, *TRI, AMDGPU::SGPRRegBankID);
4027       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
4028 
4029       // These 2 must be SGPRs, but accept VGPRs. Readfirstlane will be inserted
4030       // to legalize.
4031       OpdsMapping[2] = AMDGPU::getValueMapping(SrcBank, SrcSize);
4032       OpdsMapping[3] = AMDGPU::getValueMapping(IdxBank, IdxSize);
4033       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, SrcSize);
4034       break;
4035     }
4036     case Intrinsic::amdgcn_if_break: {
4037       unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
4038       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4039       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
4040       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4041       break;
4042     }
4043     case Intrinsic::amdgcn_permlane16:
4044     case Intrinsic::amdgcn_permlanex16: {
4045       unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
4046       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
4047       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
4048       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, Size);
4049       OpdsMapping[4] = getSGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4050       OpdsMapping[5] = getSGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4051       break;
4052     }
4053     case Intrinsic::amdgcn_mfma_f32_4x4x1f32:
4054     case Intrinsic::amdgcn_mfma_f32_4x4x4f16:
4055     case Intrinsic::amdgcn_mfma_i32_4x4x4i8:
4056     case Intrinsic::amdgcn_mfma_f32_4x4x2bf16:
4057     case Intrinsic::amdgcn_mfma_f32_16x16x1f32:
4058     case Intrinsic::amdgcn_mfma_f32_16x16x4f32:
4059     case Intrinsic::amdgcn_mfma_f32_16x16x4f16:
4060     case Intrinsic::amdgcn_mfma_f32_16x16x16f16:
4061     case Intrinsic::amdgcn_mfma_i32_16x16x4i8:
4062     case Intrinsic::amdgcn_mfma_i32_16x16x16i8:
4063     case Intrinsic::amdgcn_mfma_f32_16x16x2bf16:
4064     case Intrinsic::amdgcn_mfma_f32_16x16x8bf16:
4065     case Intrinsic::amdgcn_mfma_f32_32x32x1f32:
4066     case Intrinsic::amdgcn_mfma_f32_32x32x2f32:
4067     case Intrinsic::amdgcn_mfma_f32_32x32x4f16:
4068     case Intrinsic::amdgcn_mfma_f32_32x32x8f16:
4069     case Intrinsic::amdgcn_mfma_i32_32x32x4i8:
4070     case Intrinsic::amdgcn_mfma_i32_32x32x8i8:
4071     case Intrinsic::amdgcn_mfma_f32_32x32x2bf16:
4072     case Intrinsic::amdgcn_mfma_f32_32x32x4bf16: {
4073       // Default for MAI intrinsics.
4074       // srcC can also be an immediate which can be folded later.
4075       // FIXME: Should we eventually add an alternative mapping with AGPR src
4076       // for srcA/srcB?
4077       //
4078       // vdst, srcA, srcB, srcC
4079       OpdsMapping[0] = getAGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
4080       OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4081       OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4082       OpdsMapping[4] = getAGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4083       break;
4084     }
4085     case Intrinsic::amdgcn_interp_p1:
4086     case Intrinsic::amdgcn_interp_p2:
4087     case Intrinsic::amdgcn_interp_mov:
4088     case Intrinsic::amdgcn_interp_p1_f16:
4089     case Intrinsic::amdgcn_interp_p2_f16: {
4090       const int M0Idx = MI.getNumOperands() - 1;
4091       Register M0Reg = MI.getOperand(M0Idx).getReg();
4092       unsigned M0Bank = getRegBankID(M0Reg, MRI, *TRI, AMDGPU::SGPRRegBankID);
4093       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4094 
4095       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
4096       for (int I = 2; I != M0Idx && MI.getOperand(I).isReg(); ++I)
4097         OpdsMapping[I] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4098 
4099       // Must be SGPR, but we must take whatever the original bank is and fix it
4100       // later.
4101       OpdsMapping[M0Idx] = AMDGPU::getValueMapping(M0Bank, 32);
4102       break;
4103     }
4104     }
4105     break;
4106   }
4107   case AMDGPU::G_AMDGPU_INTRIN_IMAGE_LOAD:
4108   case AMDGPU::G_AMDGPU_INTRIN_IMAGE_STORE: {
4109     auto IntrID = MI.getIntrinsicID();
4110     const AMDGPU::RsrcIntrinsic *RSrcIntrin = AMDGPU::lookupRsrcIntrinsic(IntrID);
4111     assert(RSrcIntrin && "missing RsrcIntrinsic for image intrinsic");
4112     // Non-images can have complications from operands that allow both SGPR
4113     // and VGPR. For now it's too complicated to figure out the final opcode
4114     // to derive the register bank from the MCInstrDesc.
4115     assert(RSrcIntrin->IsImage);
4116     return getImageMapping(MRI, MI, RSrcIntrin->RsrcArg);
4117   }
4118   case AMDGPU::G_INTRINSIC_W_SIDE_EFFECTS: {
4119     auto IntrID = MI.getIntrinsicID();
4120     switch (IntrID) {
4121     case Intrinsic::amdgcn_s_getreg:
4122     case Intrinsic::amdgcn_s_memtime:
4123     case Intrinsic::amdgcn_s_memrealtime:
4124     case Intrinsic::amdgcn_s_get_waveid_in_workgroup: {
4125       unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4126       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4127       break;
4128     }
4129     case Intrinsic::amdgcn_ds_fadd:
4130     case Intrinsic::amdgcn_ds_fmin:
4131     case Intrinsic::amdgcn_ds_fmax:
4132       return getDefaultMappingAllVGPR(MI);
4133     case Intrinsic::amdgcn_ds_ordered_add:
4134     case Intrinsic::amdgcn_ds_ordered_swap: {
4135       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4136       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
4137       unsigned M0Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
4138                                  AMDGPU::SGPRRegBankID);
4139       OpdsMapping[2] = AMDGPU::getValueMapping(M0Bank, 32);
4140       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4141       break;
4142     }
4143     case Intrinsic::amdgcn_ds_append:
4144     case Intrinsic::amdgcn_ds_consume: {
4145       unsigned DstSize = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4146       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, DstSize);
4147       OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4148       break;
4149     }
4150     case Intrinsic::amdgcn_exp_compr:
4151       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4152       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4153       break;
4154     case Intrinsic::amdgcn_exp:
4155       // FIXME: Could we support packed types here?
4156       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4157       OpdsMapping[4] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4158       OpdsMapping[5] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4159       OpdsMapping[6] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4160       break;
4161     case Intrinsic::amdgcn_s_sendmsg:
4162     case Intrinsic::amdgcn_s_sendmsghalt: {
4163       // This must be an SGPR, but accept a VGPR.
4164       unsigned Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
4165                                    AMDGPU::SGPRRegBankID);
4166       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, 32);
4167       break;
4168     }
4169     case Intrinsic::amdgcn_s_setreg: {
4170       // This must be an SGPR, but accept a VGPR.
4171       unsigned Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
4172                                    AMDGPU::SGPRRegBankID);
4173       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, 32);
4174       break;
4175     }
4176     case Intrinsic::amdgcn_end_cf:
4177     case Intrinsic::amdgcn_init_exec: {
4178       unsigned Size = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
4179       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4180       break;
4181     }
4182     case Intrinsic::amdgcn_else: {
4183       unsigned WaveSize = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
4184       OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
4185       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize);
4186       OpdsMapping[3] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, WaveSize);
4187       break;
4188     }
4189     case Intrinsic::amdgcn_kill: {
4190       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VCCRegBankID, 1);
4191       break;
4192     }
4193     case Intrinsic::amdgcn_raw_buffer_load:
4194     case Intrinsic::amdgcn_raw_tbuffer_load: {
4195       // FIXME: Should make intrinsic ID the last operand of the instruction,
4196       // then this would be the same as store
4197       OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
4198       OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4199       OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4200       OpdsMapping[4] = getSGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4201       break;
4202     }
4203     case Intrinsic::amdgcn_raw_buffer_store:
4204     case Intrinsic::amdgcn_raw_buffer_store_format:
4205     case Intrinsic::amdgcn_raw_tbuffer_store: {
4206       OpdsMapping[1] = getVGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
4207       OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4208       OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4209       OpdsMapping[4] = getSGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4210       break;
4211     }
4212     case Intrinsic::amdgcn_struct_buffer_load:
4213     case Intrinsic::amdgcn_struct_tbuffer_load: {
4214       OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
4215       OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4216       OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4217       OpdsMapping[4] = getVGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4218       OpdsMapping[5] = getSGPROpMapping(MI.getOperand(5).getReg(), MRI, *TRI);
4219       break;
4220     }
4221     case Intrinsic::amdgcn_struct_buffer_store:
4222     case Intrinsic::amdgcn_struct_tbuffer_store: {
4223       OpdsMapping[1] = getVGPROpMapping(MI.getOperand(1).getReg(), MRI, *TRI);
4224       OpdsMapping[2] = getSGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4225       OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4226       OpdsMapping[4] = getVGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
4227       OpdsMapping[5] = getSGPROpMapping(MI.getOperand(5).getReg(), MRI, *TRI);
4228       break;
4229     }
4230     case Intrinsic::amdgcn_init_exec_from_input: {
4231       unsigned Size = getSizeInBits(MI.getOperand(1).getReg(), MRI, *TRI);
4232       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4233       OpdsMapping[2] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size);
4234       break;
4235     }
4236     case Intrinsic::amdgcn_ds_gws_init:
4237     case Intrinsic::amdgcn_ds_gws_barrier:
4238     case Intrinsic::amdgcn_ds_gws_sema_br: {
4239       OpdsMapping[1] = AMDGPU::getValueMapping(AMDGPU::VGPRRegBankID, 32);
4240 
4241       // This must be an SGPR, but accept a VGPR.
4242       unsigned Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
4243                                    AMDGPU::SGPRRegBankID);
4244       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, 32);
4245       break;
4246     }
4247     case Intrinsic::amdgcn_ds_gws_sema_v:
4248     case Intrinsic::amdgcn_ds_gws_sema_p:
4249     case Intrinsic::amdgcn_ds_gws_sema_release_all: {
4250       // This must be an SGPR, but accept a VGPR.
4251       unsigned Bank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
4252                                    AMDGPU::SGPRRegBankID);
4253       OpdsMapping[1] = AMDGPU::getValueMapping(Bank, 32);
4254       break;
4255     }
4256     default:
4257       return getInvalidInstructionMapping();
4258     }
4259     break;
4260   }
4261   case AMDGPU::G_SELECT: {
4262     unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
4263     unsigned Op2Bank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI,
4264                                     AMDGPU::SGPRRegBankID);
4265     unsigned Op3Bank = getRegBankID(MI.getOperand(3).getReg(), MRI, *TRI,
4266                                     AMDGPU::SGPRRegBankID);
4267     bool SGPRSrcs = Op2Bank == AMDGPU::SGPRRegBankID &&
4268                     Op3Bank == AMDGPU::SGPRRegBankID;
4269 
4270     unsigned CondBankDefault = SGPRSrcs ?
4271       AMDGPU::SGPRRegBankID : AMDGPU::VCCRegBankID;
4272     unsigned CondBank = getRegBankID(MI.getOperand(1).getReg(), MRI, *TRI,
4273                                      CondBankDefault);
4274     if (CondBank == AMDGPU::SGPRRegBankID)
4275       CondBank = SGPRSrcs ? AMDGPU::SGPRRegBankID : AMDGPU::VCCRegBankID;
4276     else if (CondBank == AMDGPU::VGPRRegBankID)
4277       CondBank = AMDGPU::VCCRegBankID;
4278 
4279     unsigned Bank = SGPRSrcs && CondBank == AMDGPU::SGPRRegBankID ?
4280       AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
4281 
4282     assert(CondBank == AMDGPU::VCCRegBankID || CondBank == AMDGPU::SGPRRegBankID);
4283 
4284     // TODO: Should report 32-bit for scalar condition type.
4285     if (Size == 64) {
4286       OpdsMapping[0] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
4287       OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1);
4288       OpdsMapping[2] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
4289       OpdsMapping[3] = AMDGPU::getValueMappingSGPR64Only(Bank, Size);
4290     } else {
4291       OpdsMapping[0] = AMDGPU::getValueMapping(Bank, Size);
4292       OpdsMapping[1] = AMDGPU::getValueMapping(CondBank, 1);
4293       OpdsMapping[2] = AMDGPU::getValueMapping(Bank, Size);
4294       OpdsMapping[3] = AMDGPU::getValueMapping(Bank, Size);
4295     }
4296 
4297     break;
4298   }
4299 
4300   case AMDGPU::G_LOAD:
4301   case AMDGPU::G_ZEXTLOAD:
4302   case AMDGPU::G_SEXTLOAD:
4303     return getInstrMappingForLoad(MI);
4304 
4305   case AMDGPU::G_ATOMICRMW_XCHG:
4306   case AMDGPU::G_ATOMICRMW_ADD:
4307   case AMDGPU::G_ATOMICRMW_SUB:
4308   case AMDGPU::G_ATOMICRMW_AND:
4309   case AMDGPU::G_ATOMICRMW_OR:
4310   case AMDGPU::G_ATOMICRMW_XOR:
4311   case AMDGPU::G_ATOMICRMW_MAX:
4312   case AMDGPU::G_ATOMICRMW_MIN:
4313   case AMDGPU::G_ATOMICRMW_UMAX:
4314   case AMDGPU::G_ATOMICRMW_UMIN:
4315   case AMDGPU::G_ATOMICRMW_FADD:
4316   case AMDGPU::G_AMDGPU_ATOMIC_CMPXCHG:
4317   case AMDGPU::G_AMDGPU_ATOMIC_INC:
4318   case AMDGPU::G_AMDGPU_ATOMIC_DEC: {
4319     OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
4320     OpdsMapping[1] = getValueMappingForPtr(MRI, MI.getOperand(1).getReg());
4321     OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4322     break;
4323   }
4324   case AMDGPU::G_ATOMIC_CMPXCHG: {
4325     OpdsMapping[0] = getVGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
4326     OpdsMapping[1] = getValueMappingForPtr(MRI, MI.getOperand(1).getReg());
4327     OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
4328     OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
4329     break;
4330   }
4331   case AMDGPU::G_BRCOND: {
4332     unsigned Bank = getRegBankID(MI.getOperand(0).getReg(), MRI, *TRI,
4333                                  AMDGPU::SGPRRegBankID);
4334     assert(MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() == 1);
4335     if (Bank != AMDGPU::SGPRRegBankID)
4336       Bank = AMDGPU::VCCRegBankID;
4337 
4338     OpdsMapping[0] = AMDGPU::getValueMapping(Bank, 1);
4339     break;
4340   }
4341   }
4342 
4343   return getInstructionMapping(/*ID*/1, /*Cost*/1,
4344                                getOperandsMapping(OpdsMapping),
4345                                MI.getNumOperands());
4346 }
4347