xref: /netbsd-src/external/apache2/llvm/dist/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 //===- llvm/CodeGen/GlobalISel/RegisterBankInfo.h ---------------*- 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 //
9 /// \file This file declares the API for the register bank info.
10 /// This API is responsible for handling the register banks.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H
15 #define LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H
16 
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/Hashing.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/ADT/iterator_range.h"
21 #include "llvm/CodeGen/Register.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Support/LowLevelTypeImpl.h"
24 #include <cassert>
25 #include <initializer_list>
26 #include <memory>
27 
28 namespace llvm {
29 
30 class MachineInstr;
31 class MachineRegisterInfo;
32 class raw_ostream;
33 class RegisterBank;
34 class TargetInstrInfo;
35 class TargetRegisterClass;
36 class TargetRegisterInfo;
37 
38 /// Holds all the information related to register banks.
39 class RegisterBankInfo {
40 public:
41   /// Helper struct that represents how a value is partially mapped
42   /// into a register.
43   /// The StartIdx and Length represent what region of the orginal
44   /// value this partial mapping covers.
45   /// This can be represented as a Mask of contiguous bit starting
46   /// at StartIdx bit and spanning Length bits.
47   /// StartIdx is the number of bits from the less significant bits.
48   struct PartialMapping {
49     /// Number of bits at which this partial mapping starts in the
50     /// original value.  The bits are counted from less significant
51     /// bits to most significant bits.
52     unsigned StartIdx;
53 
54     /// Length of this mapping in bits. This is how many bits this
55     /// partial mapping covers in the original value:
56     /// from StartIdx to StartIdx + Length -1.
57     unsigned Length;
58 
59     /// Register bank where the partial value lives.
60     const RegisterBank *RegBank;
61 
62     PartialMapping() = default;
63 
64     /// Provide a shortcut for quickly building PartialMapping.
PartialMappingPartialMapping65     PartialMapping(unsigned StartIdx, unsigned Length,
66                    const RegisterBank &RegBank)
67         : StartIdx(StartIdx), Length(Length), RegBank(&RegBank) {}
68 
69     /// \return the index of in the original value of the most
70     /// significant bit that this partial mapping covers.
getHighBitIdxPartialMapping71     unsigned getHighBitIdx() const { return StartIdx + Length - 1; }
72 
73     /// Print this partial mapping on dbgs() stream.
74     void dump() const;
75 
76     /// Print this partial mapping on \p OS;
77     void print(raw_ostream &OS) const;
78 
79     /// Check that the Mask is compatible with the RegBank.
80     /// Indeed, if the RegBank cannot accomadate the "active bits" of the mask,
81     /// there is no way this mapping is valid.
82     ///
83     /// \note This method does not check anything when assertions are disabled.
84     ///
85     /// \return True is the check was successful.
86     bool verify() const;
87   };
88 
89   /// Helper struct that represents how a value is mapped through
90   /// different register banks.
91   ///
92   /// \note: So far we do not have any users of the complex mappings
93   /// (mappings with more than one partial mapping), but when we do,
94   /// we would have needed to duplicate partial mappings.
95   /// The alternative could be to use an array of pointers of partial
96   /// mapping (i.e., PartialMapping **BreakDown) and duplicate the
97   /// pointers instead.
98   ///
99   /// E.g.,
100   /// Let say we have a 32-bit add and a <2 x 32-bit> vadd. We
101   /// can expand the
102   /// <2 x 32-bit> add into 2 x 32-bit add.
103   ///
104   /// Currently the TableGen-like file would look like:
105   /// \code
106   /// PartialMapping[] = {
107   /// /*32-bit add*/      {0, 32, GPR}, // Scalar entry repeated for first
108   ///                                   // vec elt.
109   /// /*2x32-bit add*/    {0, 32, GPR}, {32, 32, GPR},
110   /// /*<2x32-bit> vadd*/ {0, 64, VPR}
111   /// }; // PartialMapping duplicated.
112   ///
113   /// ValueMapping[] {
114   ///   /*plain 32-bit add*/       {&PartialMapping[0], 1},
115   ///   /*expanded vadd on 2xadd*/ {&PartialMapping[1], 2},
116   ///   /*plain <2x32-bit> vadd*/  {&PartialMapping[3], 1}
117   /// };
118   /// \endcode
119   ///
120   /// With the array of pointer, we would have:
121   /// \code
122   /// PartialMapping[] = {
123   /// /*32-bit add lower */ { 0, 32, GPR},
124   /// /*32-bit add upper */ {32, 32, GPR},
125   /// /*<2x32-bit> vadd */  { 0, 64, VPR}
126   /// }; // No more duplication.
127   ///
128   /// BreakDowns[] = {
129   /// /*AddBreakDown*/   &PartialMapping[0],
130   /// /*2xAddBreakDown*/ &PartialMapping[0], &PartialMapping[1],
131   /// /*VAddBreakDown*/  &PartialMapping[2]
132   /// }; // Addresses of PartialMapping duplicated (smaller).
133   ///
134   /// ValueMapping[] {
135   ///   /*plain 32-bit add*/       {&BreakDowns[0], 1},
136   ///   /*expanded vadd on 2xadd*/ {&BreakDowns[1], 2},
137   ///   /*plain <2x32-bit> vadd*/  {&BreakDowns[3], 1}
138   /// };
139   /// \endcode
140   ///
141   /// Given that a PartialMapping is actually small, the code size
142   /// impact is actually a degradation. Moreover the compile time will
143   /// be hit by the additional indirection.
144   /// If PartialMapping gets bigger we may reconsider.
145   struct ValueMapping {
146     /// How the value is broken down between the different register banks.
147     const PartialMapping *BreakDown;
148 
149     /// Number of partial mapping to break down this value.
150     unsigned NumBreakDowns;
151 
152     /// The default constructor creates an invalid (isValid() == false)
153     /// instance.
ValueMappingValueMapping154     ValueMapping() : ValueMapping(nullptr, 0) {}
155 
156     /// Initialize a ValueMapping with the given parameter.
157     /// \p BreakDown needs to have a life time at least as long
158     /// as this instance.
ValueMappingValueMapping159     ValueMapping(const PartialMapping *BreakDown, unsigned NumBreakDowns)
160         : BreakDown(BreakDown), NumBreakDowns(NumBreakDowns) {}
161 
162     /// Iterators through the PartialMappings.
beginValueMapping163     const PartialMapping *begin() const { return BreakDown; }
endValueMapping164     const PartialMapping *end() const { return BreakDown + NumBreakDowns; }
165 
166     /// \return true if all partial mappings are the same size and register
167     /// bank.
168     bool partsAllUniform() const;
169 
170     /// Check if this ValueMapping is valid.
isValidValueMapping171     bool isValid() const { return BreakDown && NumBreakDowns; }
172 
173     /// Verify that this mapping makes sense for a value of
174     /// \p MeaningfulBitWidth.
175     /// \note This method does not check anything when assertions are disabled.
176     ///
177     /// \return True is the check was successful.
178     bool verify(unsigned MeaningfulBitWidth) const;
179 
180     /// Print this on dbgs() stream.
181     void dump() const;
182 
183     /// Print this on \p OS;
184     void print(raw_ostream &OS) const;
185   };
186 
187   /// Helper class that represents how the value of an instruction may be
188   /// mapped and what is the related cost of such mapping.
189   class InstructionMapping {
190     /// Identifier of the mapping.
191     /// This is used to communicate between the target and the optimizers
192     /// which mapping should be realized.
193     unsigned ID = InvalidMappingID;
194 
195     /// Cost of this mapping.
196     unsigned Cost = 0;
197 
198     /// Mapping of all the operands.
199     const ValueMapping *OperandsMapping = nullptr;
200 
201     /// Number of operands.
202     unsigned NumOperands = 0;
203 
getOperandMapping(unsigned i)204     const ValueMapping &getOperandMapping(unsigned i) {
205       assert(i < getNumOperands() && "Out of bound operand");
206       return OperandsMapping[i];
207     }
208 
209   public:
210     /// Constructor for the mapping of an instruction.
211     /// \p NumOperands must be equal to number of all the operands of
212     /// the related instruction.
213     /// The rationale is that it is more efficient for the optimizers
214     /// to be able to assume that the mapping of the ith operand is
215     /// at the index i.
InstructionMapping(unsigned ID,unsigned Cost,const ValueMapping * OperandsMapping,unsigned NumOperands)216     InstructionMapping(unsigned ID, unsigned Cost,
217                        const ValueMapping *OperandsMapping,
218                        unsigned NumOperands)
219         : ID(ID), Cost(Cost), OperandsMapping(OperandsMapping),
220           NumOperands(NumOperands) {
221     }
222 
223     /// Default constructor.
224     /// Use this constructor to express that the mapping is invalid.
225     InstructionMapping() = default;
226 
227     /// Get the cost.
getCost()228     unsigned getCost() const { return Cost; }
229 
230     /// Get the ID.
getID()231     unsigned getID() const { return ID; }
232 
233     /// Get the number of operands.
getNumOperands()234     unsigned getNumOperands() const { return NumOperands; }
235 
236     /// Get the value mapping of the ith operand.
237     /// \pre The mapping for the ith operand has been set.
238     /// \pre The ith operand is a register.
getOperandMapping(unsigned i)239     const ValueMapping &getOperandMapping(unsigned i) const {
240       const ValueMapping &ValMapping =
241           const_cast<InstructionMapping *>(this)->getOperandMapping(i);
242       return ValMapping;
243     }
244 
245     /// Set the mapping for all the operands.
246     /// In other words, OpdsMapping should hold at least getNumOperands
247     /// ValueMapping.
setOperandsMapping(const ValueMapping * OpdsMapping)248     void setOperandsMapping(const ValueMapping *OpdsMapping) {
249       OperandsMapping = OpdsMapping;
250     }
251 
252     /// Check whether this object is valid.
253     /// This is a lightweight check for obvious wrong instance.
isValid()254     bool isValid() const {
255       return getID() != InvalidMappingID && OperandsMapping;
256     }
257 
258     /// Verifiy that this mapping makes sense for \p MI.
259     /// \pre \p MI must be connected to a MachineFunction.
260     ///
261     /// \note This method does not check anything when assertions are disabled.
262     ///
263     /// \return True is the check was successful.
264     bool verify(const MachineInstr &MI) const;
265 
266     /// Print this on dbgs() stream.
267     void dump() const;
268 
269     /// Print this on \p OS;
270     void print(raw_ostream &OS) const;
271   };
272 
273   /// Convenient type to represent the alternatives for mapping an
274   /// instruction.
275   /// \todo When we move to TableGen this should be an array ref.
276   using InstructionMappings = SmallVector<const InstructionMapping *, 4>;
277 
278   /// Helper class used to get/create the virtual registers that will be used
279   /// to replace the MachineOperand when applying a mapping.
280   class OperandsMapper {
281     /// The OpIdx-th cell contains the index in NewVRegs where the VRegs of the
282     /// OpIdx-th operand starts. -1 means we do not have such mapping yet.
283     /// Note: We use a SmallVector to avoid heap allocation for most cases.
284     SmallVector<int, 8> OpToNewVRegIdx;
285 
286     /// Hold the registers that will be used to map MI with InstrMapping.
287     SmallVector<Register, 8> NewVRegs;
288 
289     /// Current MachineRegisterInfo, used to create new virtual registers.
290     MachineRegisterInfo &MRI;
291 
292     /// Instruction being remapped.
293     MachineInstr &MI;
294 
295     /// New mapping of the instruction.
296     const InstructionMapping &InstrMapping;
297 
298     /// Constant value identifying that the index in OpToNewVRegIdx
299     /// for an operand has not been set yet.
300     static const int DontKnowIdx;
301 
302     /// Get the range in NewVRegs to store all the partial
303     /// values for the \p OpIdx-th operand.
304     ///
305     /// \return The iterator range for the space created.
306     //
307     /// \pre getMI().getOperand(OpIdx).isReg()
308     iterator_range<SmallVectorImpl<Register>::iterator>
309     getVRegsMem(unsigned OpIdx);
310 
311     /// Get the end iterator for a range starting at \p StartIdx and
312     /// spannig \p NumVal in NewVRegs.
313     /// \pre StartIdx + NumVal <= NewVRegs.size()
314     SmallVectorImpl<Register>::const_iterator
315     getNewVRegsEnd(unsigned StartIdx, unsigned NumVal) const;
316     SmallVectorImpl<Register>::iterator getNewVRegsEnd(unsigned StartIdx,
317                                                        unsigned NumVal);
318 
319   public:
320     /// Create an OperandsMapper that will hold the information to apply \p
321     /// InstrMapping to \p MI.
322     /// \pre InstrMapping.verify(MI)
323     OperandsMapper(MachineInstr &MI, const InstructionMapping &InstrMapping,
324                    MachineRegisterInfo &MRI);
325 
326     /// \name Getters.
327     /// @{
328     /// The MachineInstr being remapped.
getMI()329     MachineInstr &getMI() const { return MI; }
330 
331     /// The final mapping of the instruction.
getInstrMapping()332     const InstructionMapping &getInstrMapping() const { return InstrMapping; }
333 
334     /// The MachineRegisterInfo we used to realize the mapping.
getMRI()335     MachineRegisterInfo &getMRI() const { return MRI; }
336     /// @}
337 
338     /// Create as many new virtual registers as needed for the mapping of the \p
339     /// OpIdx-th operand.
340     /// The number of registers is determined by the number of breakdown for the
341     /// related operand in the instruction mapping.
342     /// The type of the new registers is a plain scalar of the right size.
343     /// The proper type is expected to be set when the mapping is applied to
344     /// the instruction(s) that realizes the mapping.
345     ///
346     /// \pre getMI().getOperand(OpIdx).isReg()
347     ///
348     /// \post All the partial mapping of the \p OpIdx-th operand have been
349     /// assigned a new virtual register.
350     void createVRegs(unsigned OpIdx);
351 
352     /// Set the virtual register of the \p PartialMapIdx-th partial mapping of
353     /// the OpIdx-th operand to \p NewVReg.
354     ///
355     /// \pre getMI().getOperand(OpIdx).isReg()
356     /// \pre getInstrMapping().getOperandMapping(OpIdx).BreakDown.size() >
357     /// PartialMapIdx
358     /// \pre NewReg != 0
359     ///
360     /// \post the \p PartialMapIdx-th register of the value mapping of the \p
361     /// OpIdx-th operand has been set.
362     void setVRegs(unsigned OpIdx, unsigned PartialMapIdx, Register NewVReg);
363 
364     /// Get all the virtual registers required to map the \p OpIdx-th operand of
365     /// the instruction.
366     ///
367     /// This return an empty range when createVRegs or setVRegs has not been
368     /// called.
369     /// The iterator may be invalidated by a call to setVRegs or createVRegs.
370     ///
371     /// When \p ForDebug is true, we will not check that the list of new virtual
372     /// registers does not contain uninitialized values.
373     ///
374     /// \pre getMI().getOperand(OpIdx).isReg()
375     /// \pre ForDebug || All partial mappings have been set a register
376     iterator_range<SmallVectorImpl<Register>::const_iterator>
377     getVRegs(unsigned OpIdx, bool ForDebug = false) const;
378 
379     /// Print this operands mapper on dbgs() stream.
380     void dump() const;
381 
382     /// Print this operands mapper on \p OS stream.
383     void print(raw_ostream &OS, bool ForDebug = false) const;
384   };
385 
386 protected:
387   /// Hold the set of supported register banks.
388   RegisterBank **RegBanks;
389 
390   /// Total number of register banks.
391   unsigned NumRegBanks;
392 
393   /// Keep dynamically allocated PartialMapping in a separate map.
394   /// This shouldn't be needed when everything gets TableGen'ed.
395   mutable DenseMap<unsigned, std::unique_ptr<const PartialMapping>>
396       MapOfPartialMappings;
397 
398   /// Keep dynamically allocated ValueMapping in a separate map.
399   /// This shouldn't be needed when everything gets TableGen'ed.
400   mutable DenseMap<unsigned, std::unique_ptr<const ValueMapping>>
401       MapOfValueMappings;
402 
403   /// Keep dynamically allocated array of ValueMapping in a separate map.
404   /// This shouldn't be needed when everything gets TableGen'ed.
405   mutable DenseMap<unsigned, std::unique_ptr<ValueMapping[]>>
406       MapOfOperandsMappings;
407 
408   /// Keep dynamically allocated InstructionMapping in a separate map.
409   /// This shouldn't be needed when everything gets TableGen'ed.
410   mutable DenseMap<unsigned, std::unique_ptr<const InstructionMapping>>
411       MapOfInstructionMappings;
412 
413   /// Getting the minimal register class of a physreg is expensive.
414   /// Cache this information as we get it.
415   mutable DenseMap<unsigned, const TargetRegisterClass *> PhysRegMinimalRCs;
416 
417   /// Create a RegisterBankInfo that can accommodate up to \p NumRegBanks
418   /// RegisterBank instances.
419   RegisterBankInfo(RegisterBank **RegBanks, unsigned NumRegBanks);
420 
421   /// This constructor is meaningless.
422   /// It just provides a default constructor that can be used at link time
423   /// when GlobalISel is not built.
424   /// That way, targets can still inherit from this class without doing
425   /// crazy gymnastic to avoid link time failures.
426   /// \note That works because the constructor is inlined.
RegisterBankInfo()427   RegisterBankInfo() {
428     llvm_unreachable("This constructor should not be executed");
429   }
430 
431   /// Get the register bank identified by \p ID.
getRegBank(unsigned ID)432   RegisterBank &getRegBank(unsigned ID) {
433     assert(ID < getNumRegBanks() && "Accessing an unknown register bank");
434     return *RegBanks[ID];
435   }
436 
437   /// Get the MinimalPhysRegClass for Reg.
438   /// \pre Reg is a physical register.
439   const TargetRegisterClass &
440   getMinimalPhysRegClass(Register Reg, const TargetRegisterInfo &TRI) const;
441 
442   /// Try to get the mapping of \p MI.
443   /// See getInstrMapping for more details on what a mapping represents.
444   ///
445   /// Unlike getInstrMapping the returned InstructionMapping may be invalid
446   /// (isValid() == false).
447   /// This means that the target independent code is not smart enough
448   /// to get the mapping of \p MI and thus, the target has to provide the
449   /// information for \p MI.
450   ///
451   /// This implementation is able to get the mapping of:
452   /// - Target specific instructions by looking at the encoding constraints.
453   /// - Any instruction if all the register operands have already been assigned
454   ///   a register, a register class, or a register bank.
455   /// - Copies and phis if at least one of the operands has been assigned a
456   ///   register, a register class, or a register bank.
457   /// In other words, this method will likely fail to find a mapping for
458   /// any generic opcode that has not been lowered by target specific code.
459   const InstructionMapping &getInstrMappingImpl(const MachineInstr &MI) const;
460 
461   /// Get the uniquely generated PartialMapping for the
462   /// given arguments.
463   const PartialMapping &getPartialMapping(unsigned StartIdx, unsigned Length,
464                                           const RegisterBank &RegBank) const;
465 
466   /// \name Methods to get a uniquely generated ValueMapping.
467   /// @{
468 
469   /// The most common ValueMapping consists of a single PartialMapping.
470   /// Feature a method for that.
471   const ValueMapping &getValueMapping(unsigned StartIdx, unsigned Length,
472                                       const RegisterBank &RegBank) const;
473 
474   /// Get the ValueMapping for the given arguments.
475   const ValueMapping &getValueMapping(const PartialMapping *BreakDown,
476                                       unsigned NumBreakDowns) const;
477   /// @}
478 
479   /// \name Methods to get a uniquely generated array of ValueMapping.
480   /// @{
481 
482   /// Get the uniquely generated array of ValueMapping for the
483   /// elements of between \p Begin and \p End.
484   ///
485   /// Elements that are nullptr will be replaced by
486   /// invalid ValueMapping (ValueMapping::isValid == false).
487   ///
488   /// \pre The pointers on ValueMapping between \p Begin and \p End
489   /// must uniquely identify a ValueMapping. Otherwise, there is no
490   /// guarantee that the return instance will be unique, i.e., another
491   /// OperandsMapping could have the same content.
492   template <typename Iterator>
493   const ValueMapping *getOperandsMapping(Iterator Begin, Iterator End) const;
494 
495   /// Get the uniquely generated array of ValueMapping for the
496   /// elements of \p OpdsMapping.
497   ///
498   /// Elements of \p OpdsMapping that are nullptr will be replaced by
499   /// invalid ValueMapping (ValueMapping::isValid == false).
500   const ValueMapping *getOperandsMapping(
501       const SmallVectorImpl<const ValueMapping *> &OpdsMapping) const;
502 
503   /// Get the uniquely generated array of ValueMapping for the
504   /// given arguments.
505   ///
506   /// Arguments that are nullptr will be replaced by invalid
507   /// ValueMapping (ValueMapping::isValid == false).
508   const ValueMapping *getOperandsMapping(
509       std::initializer_list<const ValueMapping *> OpdsMapping) const;
510   /// @}
511 
512   /// \name Methods to get a uniquely generated InstructionMapping.
513   /// @{
514 
515 private:
516   /// Method to get a uniquely generated InstructionMapping.
517   const InstructionMapping &
518   getInstructionMappingImpl(bool IsInvalid, unsigned ID = InvalidMappingID,
519                             unsigned Cost = 0,
520                             const ValueMapping *OperandsMapping = nullptr,
521                             unsigned NumOperands = 0) const;
522 
523 public:
524   /// Method to get a uniquely generated InstructionMapping.
525   const InstructionMapping &
getInstructionMapping(unsigned ID,unsigned Cost,const ValueMapping * OperandsMapping,unsigned NumOperands)526   getInstructionMapping(unsigned ID, unsigned Cost,
527                         const ValueMapping *OperandsMapping,
528                         unsigned NumOperands) const {
529     return getInstructionMappingImpl(/*IsInvalid*/ false, ID, Cost,
530                                      OperandsMapping, NumOperands);
531   }
532 
533   /// Method to get a uniquely generated invalid InstructionMapping.
getInvalidInstructionMapping()534   const InstructionMapping &getInvalidInstructionMapping() const {
535     return getInstructionMappingImpl(/*IsInvalid*/ true);
536   }
537   /// @}
538 
539   /// Get the register bank for the \p OpIdx-th operand of \p MI form
540   /// the encoding constraints, if any.
541   ///
542   /// \return A register bank that covers the register class of the
543   /// related encoding constraints or nullptr if \p MI did not provide
544   /// enough information to deduce it.
545   const RegisterBank *
546   getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx,
547                             const TargetInstrInfo &TII,
548                             const MachineRegisterInfo &MRI) const;
549 
550   /// Helper method to apply something that is like the default mapping.
551   /// Basically, that means that \p OpdMapper.getMI() is left untouched
552   /// aside from the reassignment of the register operand that have been
553   /// remapped.
554   ///
555   /// The type of all the new registers that have been created by the
556   /// mapper are properly remapped to the type of the original registers
557   /// they replace. In other words, the semantic of the instruction does
558   /// not change, only the register banks.
559   ///
560   /// If the mapping of one of the operand spans several registers, this
561   /// method will abort as this is not like a default mapping anymore.
562   ///
563   /// \pre For OpIdx in {0..\p OpdMapper.getMI().getNumOperands())
564   ///        the range OpdMapper.getVRegs(OpIdx) is empty or of size 1.
565   static void applyDefaultMapping(const OperandsMapper &OpdMapper);
566 
567   /// See ::applyMapping.
applyMappingImpl(const OperandsMapper & OpdMapper)568   virtual void applyMappingImpl(const OperandsMapper &OpdMapper) const {
569     llvm_unreachable("The target has to implement that part");
570   }
571 
572 public:
573   virtual ~RegisterBankInfo() = default;
574 
575   /// Get the register bank identified by \p ID.
getRegBank(unsigned ID)576   const RegisterBank &getRegBank(unsigned ID) const {
577     return const_cast<RegisterBankInfo *>(this)->getRegBank(ID);
578   }
579 
580   /// Get the register bank of \p Reg.
581   /// If Reg has not been assigned a register, a register class,
582   /// or a register bank, then this returns nullptr.
583   ///
584   /// \pre Reg != 0 (NoRegister)
585   const RegisterBank *getRegBank(Register Reg, const MachineRegisterInfo &MRI,
586                                  const TargetRegisterInfo &TRI) const;
587 
588   /// Get the total number of register banks.
getNumRegBanks()589   unsigned getNumRegBanks() const { return NumRegBanks; }
590 
591   /// Get a register bank that covers \p RC.
592   ///
593   /// \pre \p RC is a user-defined register class (as opposed as one
594   /// generated by TableGen).
595   ///
596   /// \note The mapping RC -> RegBank could be built while adding the
597   /// coverage for the register banks. However, we do not do it, because,
598   /// at least for now, we only need this information for register classes
599   /// that are used in the description of instruction. In other words,
600   /// there are just a handful of them and we do not want to waste space.
601   ///
602   /// \todo This should be TableGen'ed.
603   virtual const RegisterBank &
getRegBankFromRegClass(const TargetRegisterClass & RC,LLT Ty)604   getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const {
605     llvm_unreachable("The target must override this method");
606   }
607 
608   /// Get the cost of a copy from \p B to \p A, or put differently,
609   /// get the cost of A = COPY B. Since register banks may cover
610   /// different size, \p Size specifies what will be the size in bits
611   /// that will be copied around.
612   ///
613   /// \note Since this is a copy, both registers have the same size.
copyCost(const RegisterBank & A,const RegisterBank & B,unsigned Size)614   virtual unsigned copyCost(const RegisterBank &A, const RegisterBank &B,
615                             unsigned Size) const {
616     // Optimistically assume that copies are coalesced. I.e., when
617     // they are on the same bank, they are free.
618     // Otherwise assume a non-zero cost of 1. The targets are supposed
619     // to override that properly anyway if they care.
620     return &A != &B;
621   }
622 
623   /// \returns true if emitting a copy from \p Src to \p Dst is impossible.
cannotCopy(const RegisterBank & Dst,const RegisterBank & Src,unsigned Size)624   bool cannotCopy(const RegisterBank &Dst, const RegisterBank &Src,
625                   unsigned Size) const {
626     return copyCost(Dst, Src, Size) == std::numeric_limits<unsigned>::max();
627   }
628 
629   /// Get the cost of using \p ValMapping to decompose a register. This is
630   /// similar to ::copyCost, except for cases where multiple copy-like
631   /// operations need to be inserted. If the register is used as a source
632   /// operand and already has a bank assigned, \p CurBank is non-null.
633   virtual unsigned getBreakDownCost(const ValueMapping &ValMapping,
634                                     const RegisterBank *CurBank = nullptr) const {
635     return std::numeric_limits<unsigned>::max();
636   }
637 
638   /// Constrain the (possibly generic) virtual register \p Reg to \p RC.
639   ///
640   /// \pre \p Reg is a virtual register that either has a bank or a class.
641   /// \returns The constrained register class, or nullptr if there is none.
642   /// \note This is a generic variant of MachineRegisterInfo::constrainRegClass
643   /// \note Use MachineRegisterInfo::constrainRegAttrs instead for any non-isel
644   /// purpose, including non-select passes of GlobalISel
645   static const TargetRegisterClass *
646   constrainGenericRegister(Register Reg, const TargetRegisterClass &RC,
647                            MachineRegisterInfo &MRI);
648 
649   /// Identifier used when the related instruction mapping instance
650   /// is generated by target independent code.
651   /// Make sure not to use that identifier to avoid possible collision.
652   static const unsigned DefaultMappingID;
653 
654   /// Identifier used when the related instruction mapping instance
655   /// is generated by the default constructor.
656   /// Make sure not to use that identifier.
657   static const unsigned InvalidMappingID;
658 
659   /// Get the mapping of the different operands of \p MI
660   /// on the register bank.
661   /// This mapping should be the direct translation of \p MI.
662   /// In other words, when \p MI is mapped with the returned mapping,
663   /// only the register banks of the operands of \p MI need to be updated.
664   /// In particular, neither the opcode nor the type of \p MI needs to be
665   /// updated for this direct mapping.
666   ///
667   /// The target independent implementation gives a mapping based on
668   /// the register classes for the target specific opcode.
669   /// It uses the ID RegisterBankInfo::DefaultMappingID for that mapping.
670   /// Make sure you do not use that ID for the alternative mapping
671   /// for MI. See getInstrAlternativeMappings for the alternative
672   /// mappings.
673   ///
674   /// For instance, if \p MI is a vector add, the mapping should
675   /// not be a scalarization of the add.
676   ///
677   /// \post returnedVal.verify(MI).
678   ///
679   /// \note If returnedVal does not verify MI, this would probably mean
680   /// that the target does not support that instruction.
681   virtual const InstructionMapping &
682   getInstrMapping(const MachineInstr &MI) const;
683 
684   /// Get the alternative mappings for \p MI.
685   /// Alternative in the sense different from getInstrMapping.
686   virtual InstructionMappings
687   getInstrAlternativeMappings(const MachineInstr &MI) const;
688 
689   /// Get the possible mapping for \p MI.
690   /// A mapping defines where the different operands may live and at what cost.
691   /// For instance, let us consider:
692   /// v0(16) = G_ADD <2 x i8> v1, v2
693   /// The possible mapping could be:
694   ///
695   /// {/*ID*/VectorAdd, /*Cost*/1, /*v0*/{(0xFFFF, VPR)}, /*v1*/{(0xFFFF, VPR)},
696   ///                              /*v2*/{(0xFFFF, VPR)}}
697   /// {/*ID*/ScalarAddx2, /*Cost*/2, /*v0*/{(0x00FF, GPR),(0xFF00, GPR)},
698   ///                                /*v1*/{(0x00FF, GPR),(0xFF00, GPR)},
699   ///                                /*v2*/{(0x00FF, GPR),(0xFF00, GPR)}}
700   ///
701   /// \note The first alternative of the returned mapping should be the
702   /// direct translation of \p MI current form.
703   ///
704   /// \post !returnedVal.empty().
705   InstructionMappings getInstrPossibleMappings(const MachineInstr &MI) const;
706 
707   /// Apply \p OpdMapper.getInstrMapping() to \p OpdMapper.getMI().
708   /// After this call \p OpdMapper.getMI() may not be valid anymore.
709   /// \p OpdMapper.getInstrMapping().getID() carries the information of
710   /// what has been chosen to map \p OpdMapper.getMI(). This ID is set
711   /// by the various getInstrXXXMapping method.
712   ///
713   /// Therefore, getting the mapping and applying it should be kept in
714   /// sync.
applyMapping(const OperandsMapper & OpdMapper)715   void applyMapping(const OperandsMapper &OpdMapper) const {
716     // The only mapping we know how to handle is the default mapping.
717     if (OpdMapper.getInstrMapping().getID() == DefaultMappingID)
718       return applyDefaultMapping(OpdMapper);
719     // For other mapping, the target needs to do the right thing.
720     // If that means calling applyDefaultMapping, fine, but this
721     // must be explicitly stated.
722     applyMappingImpl(OpdMapper);
723   }
724 
725   /// Get the size in bits of \p Reg.
726   /// Utility method to get the size of any registers. Unlike
727   /// MachineRegisterInfo::getSize, the register does not need to be a
728   /// virtual register.
729   ///
730   /// \pre \p Reg != 0 (NoRegister).
731   unsigned getSizeInBits(Register Reg, const MachineRegisterInfo &MRI,
732                          const TargetRegisterInfo &TRI) const;
733 
734   /// Check that information hold by this instance make sense for the
735   /// given \p TRI.
736   ///
737   /// \note This method does not check anything when assertions are disabled.
738   ///
739   /// \return True is the check was successful.
740   bool verify(const TargetRegisterInfo &TRI) const;
741 };
742 
743 inline raw_ostream &
744 operator<<(raw_ostream &OS,
745            const RegisterBankInfo::PartialMapping &PartMapping) {
746   PartMapping.print(OS);
747   return OS;
748 }
749 
750 inline raw_ostream &
751 operator<<(raw_ostream &OS, const RegisterBankInfo::ValueMapping &ValMapping) {
752   ValMapping.print(OS);
753   return OS;
754 }
755 
756 inline raw_ostream &
757 operator<<(raw_ostream &OS,
758            const RegisterBankInfo::InstructionMapping &InstrMapping) {
759   InstrMapping.print(OS);
760   return OS;
761 }
762 
763 inline raw_ostream &
764 operator<<(raw_ostream &OS, const RegisterBankInfo::OperandsMapper &OpdMapper) {
765   OpdMapper.print(OS, /*ForDebug*/ false);
766   return OS;
767 }
768 
769 /// Hashing function for PartialMapping.
770 /// It is required for the hashing of ValueMapping.
771 hash_code hash_value(const RegisterBankInfo::PartialMapping &PartMapping);
772 
773 } // end namespace llvm
774 
775 #endif // LLVM_CODEGEN_GLOBALISEL_REGISTERBANKINFO_H
776