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