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