Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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/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.
  65.     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.
  71.     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.
  154.     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.
  159.     ValueMapping(const PartialMapping *BreakDown, unsigned NumBreakDowns)
  160.         : BreakDown(BreakDown), NumBreakDowns(NumBreakDowns) {}
  161.  
  162.     /// Iterators through the PartialMappings.
  163.     const PartialMapping *begin() const { return BreakDown; }
  164.     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.
  171.     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.  
  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.
  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.     /// Default constructor.
  223.     /// Use this constructor to express that the mapping is invalid.
  224.     InstructionMapping() = default;
  225.  
  226.     /// Get the cost.
  227.     unsigned getCost() const { return Cost; }
  228.  
  229.     /// Get the ID.
  230.     unsigned getID() const { return ID; }
  231.  
  232.     /// Get the number of operands.
  233.     unsigned getNumOperands() const { return NumOperands; }
  234.  
  235.     /// Get the value mapping of the ith operand.
  236.     /// \pre The mapping for the ith operand has been set.
  237.     /// \pre The ith operand is a register.
  238.     const ValueMapping &getOperandMapping(unsigned i) const {
  239.       const ValueMapping &ValMapping =
  240.           const_cast<InstructionMapping *>(this)->getOperandMapping(i);
  241.       return ValMapping;
  242.     }
  243.  
  244.     /// Set the mapping for all the operands.
  245.     /// In other words, OpdsMapping should hold at least getNumOperands
  246.     /// ValueMapping.
  247.     void setOperandsMapping(const ValueMapping *OpdsMapping) {
  248.       OperandsMapping = OpdsMapping;
  249.     }
  250.  
  251.     /// Check whether this object is valid.
  252.     /// This is a lightweight check for obvious wrong instance.
  253.     bool isValid() const {
  254.       return getID() != InvalidMappingID && OperandsMapping;
  255.     }
  256.  
  257.     /// Verifiy that this mapping makes sense for \p MI.
  258.     /// \pre \p MI must be connected to a MachineFunction.
  259.     ///
  260.     /// \note This method does not check anything when assertions are disabled.
  261.     ///
  262.     /// \return True is the check was successful.
  263.     bool verify(const MachineInstr &MI) const;
  264.  
  265.     /// Print this on dbgs() stream.
  266.     void dump() const;
  267.  
  268.     /// Print this on \p OS;
  269.     void print(raw_ostream &OS) const;
  270.   };
  271.  
  272.   /// Convenient type to represent the alternatives for mapping an
  273.   /// instruction.
  274.   /// \todo When we move to TableGen this should be an array ref.
  275.   using InstructionMappings = SmallVector<const InstructionMapping *, 4>;
  276.  
  277.   /// Helper class used to get/create the virtual registers that will be used
  278.   /// to replace the MachineOperand when applying a mapping.
  279.   class OperandsMapper {
  280.     /// The OpIdx-th cell contains the index in NewVRegs where the VRegs of the
  281.     /// OpIdx-th operand starts. -1 means we do not have such mapping yet.
  282.     /// Note: We use a SmallVector to avoid heap allocation for most cases.
  283.     SmallVector<int, 8> OpToNewVRegIdx;
  284.  
  285.     /// Hold the registers that will be used to map MI with InstrMapping.
  286.     SmallVector<Register, 8> NewVRegs;
  287.  
  288.     /// Current MachineRegisterInfo, used to create new virtual registers.
  289.     MachineRegisterInfo &MRI;
  290.  
  291.     /// Instruction being remapped.
  292.     MachineInstr &MI;
  293.  
  294.     /// New mapping of the instruction.
  295.     const InstructionMapping &InstrMapping;
  296.  
  297.     /// Constant value identifying that the index in OpToNewVRegIdx
  298.     /// for an operand has not been set yet.
  299.     static const int DontKnowIdx;
  300.  
  301.     /// Get the range in NewVRegs to store all the partial
  302.     /// values for the \p OpIdx-th operand.
  303.     ///
  304.     /// \return The iterator range for the space created.
  305.     //
  306.     /// \pre getMI().getOperand(OpIdx).isReg()
  307.     iterator_range<SmallVectorImpl<Register>::iterator>
  308.     getVRegsMem(unsigned OpIdx);
  309.  
  310.     /// Get the end iterator for a range starting at \p StartIdx and
  311.     /// spannig \p NumVal in NewVRegs.
  312.     /// \pre StartIdx + NumVal <= NewVRegs.size()
  313.     SmallVectorImpl<Register>::const_iterator
  314.     getNewVRegsEnd(unsigned StartIdx, unsigned NumVal) const;
  315.     SmallVectorImpl<Register>::iterator getNewVRegsEnd(unsigned StartIdx,
  316.                                                        unsigned NumVal);
  317.  
  318.   public:
  319.     /// Create an OperandsMapper that will hold the information to apply \p
  320.     /// InstrMapping to \p MI.
  321.     /// \pre InstrMapping.verify(MI)
  322.     OperandsMapper(MachineInstr &MI, const InstructionMapping &InstrMapping,
  323.                    MachineRegisterInfo &MRI);
  324.  
  325.     /// \name Getters.
  326.     /// @{
  327.     /// The MachineInstr being remapped.
  328.     MachineInstr &getMI() const { return MI; }
  329.  
  330.     /// The final mapping of the instruction.
  331.     const InstructionMapping &getInstrMapping() const { return InstrMapping; }
  332.  
  333.     /// The MachineRegisterInfo we used to realize the mapping.
  334.     MachineRegisterInfo &getMRI() const { return MRI; }
  335.     /// @}
  336.  
  337.     /// Create as many new virtual registers as needed for the mapping of the \p
  338.     /// OpIdx-th operand.
  339.     /// The number of registers is determined by the number of breakdown for the
  340.     /// related operand in the instruction mapping.
  341.     /// The type of the new registers is a plain scalar of the right size.
  342.     /// The proper type is expected to be set when the mapping is applied to
  343.     /// the instruction(s) that realizes the mapping.
  344.     ///
  345.     /// \pre getMI().getOperand(OpIdx).isReg()
  346.     ///
  347.     /// \post All the partial mapping of the \p OpIdx-th operand have been
  348.     /// assigned a new virtual register.
  349.     void createVRegs(unsigned OpIdx);
  350.  
  351.     /// Set the virtual register of the \p PartialMapIdx-th partial mapping of
  352.     /// the OpIdx-th operand to \p NewVReg.
  353.     ///
  354.     /// \pre getMI().getOperand(OpIdx).isReg()
  355.     /// \pre getInstrMapping().getOperandMapping(OpIdx).BreakDown.size() >
  356.     /// PartialMapIdx
  357.     /// \pre NewReg != 0
  358.     ///
  359.     /// \post the \p PartialMapIdx-th register of the value mapping of the \p
  360.     /// OpIdx-th operand has been set.
  361.     void setVRegs(unsigned OpIdx, unsigned PartialMapIdx, Register NewVReg);
  362.  
  363.     /// Get all the virtual registers required to map the \p OpIdx-th operand of
  364.     /// the instruction.
  365.     ///
  366.     /// This return an empty range when createVRegs or setVRegs has not been
  367.     /// called.
  368.     /// The iterator may be invalidated by a call to setVRegs or createVRegs.
  369.     ///
  370.     /// When \p ForDebug is true, we will not check that the list of new virtual
  371.     /// registers does not contain uninitialized values.
  372.     ///
  373.     /// \pre getMI().getOperand(OpIdx).isReg()
  374.     /// \pre ForDebug || All partial mappings have been set a register
  375.     iterator_range<SmallVectorImpl<Register>::const_iterator>
  376.     getVRegs(unsigned OpIdx, bool ForDebug = false) const;
  377.  
  378.     /// Print this operands mapper on dbgs() stream.
  379.     void dump() const;
  380.  
  381.     /// Print this operands mapper on \p OS stream.
  382.     void print(raw_ostream &OS, bool ForDebug = false) const;
  383.   };
  384.  
  385. protected:
  386.   /// Hold the set of supported register banks.
  387.   RegisterBank **RegBanks;
  388.  
  389.   /// Total number of register banks.
  390.   unsigned NumRegBanks;
  391.  
  392.   /// Keep dynamically allocated PartialMapping in a separate map.
  393.   /// This shouldn't be needed when everything gets TableGen'ed.
  394.   mutable DenseMap<unsigned, std::unique_ptr<const PartialMapping>>
  395.       MapOfPartialMappings;
  396.  
  397.   /// Keep dynamically allocated ValueMapping in a separate map.
  398.   /// This shouldn't be needed when everything gets TableGen'ed.
  399.   mutable DenseMap<unsigned, std::unique_ptr<const ValueMapping>>
  400.       MapOfValueMappings;
  401.  
  402.   /// Keep dynamically allocated array of ValueMapping in a separate map.
  403.   /// This shouldn't be needed when everything gets TableGen'ed.
  404.   mutable DenseMap<unsigned, std::unique_ptr<ValueMapping[]>>
  405.       MapOfOperandsMappings;
  406.  
  407.   /// Keep dynamically allocated InstructionMapping in a separate map.
  408.   /// This shouldn't be needed when everything gets TableGen'ed.
  409.   mutable DenseMap<unsigned, std::unique_ptr<const InstructionMapping>>
  410.       MapOfInstructionMappings;
  411.  
  412.   /// Getting the minimal register class of a physreg is expensive.
  413.   /// Cache this information as we get it.
  414.   mutable DenseMap<unsigned, const TargetRegisterClass *> PhysRegMinimalRCs;
  415.  
  416.   /// Create a RegisterBankInfo that can accommodate up to \p NumRegBanks
  417.   /// RegisterBank instances.
  418.   RegisterBankInfo(RegisterBank **RegBanks, unsigned NumRegBanks);
  419.  
  420.   /// This constructor is meaningless.
  421.   /// It just provides a default constructor that can be used at link time
  422.   /// when GlobalISel is not built.
  423.   /// That way, targets can still inherit from this class without doing
  424.   /// crazy gymnastic to avoid link time failures.
  425.   /// \note That works because the constructor is inlined.
  426.   RegisterBankInfo() {
  427.     llvm_unreachable("This constructor should not be executed");
  428.   }
  429.  
  430.   /// Get the register bank identified by \p ID.
  431.   RegisterBank &getRegBank(unsigned ID) {
  432.     assert(ID < getNumRegBanks() && "Accessing an unknown register bank");
  433.     return *RegBanks[ID];
  434.   }
  435.  
  436.   /// Get the MinimalPhysRegClass for Reg.
  437.   /// \pre Reg is a physical register.
  438.   const TargetRegisterClass &
  439.   getMinimalPhysRegClass(Register Reg, const TargetRegisterInfo &TRI) const;
  440.  
  441.   /// Try to get the mapping of \p MI.
  442.   /// See getInstrMapping for more details on what a mapping represents.
  443.   ///
  444.   /// Unlike getInstrMapping the returned InstructionMapping may be invalid
  445.   /// (isValid() == false).
  446.   /// This means that the target independent code is not smart enough
  447.   /// to get the mapping of \p MI and thus, the target has to provide the
  448.   /// information for \p MI.
  449.   ///
  450.   /// This implementation is able to get the mapping of:
  451.   /// - Target specific instructions by looking at the encoding constraints.
  452.   /// - Any instruction if all the register operands have already been assigned
  453.   ///   a register, a register class, or a register bank.
  454.   /// - Copies and phis if at least one of the operands has been assigned a
  455.   ///   register, a register class, or a register bank.
  456.   /// In other words, this method will likely fail to find a mapping for
  457.   /// any generic opcode that has not been lowered by target specific code.
  458.   const InstructionMapping &getInstrMappingImpl(const MachineInstr &MI) const;
  459.  
  460.   /// Get the uniquely generated PartialMapping for the
  461.   /// given arguments.
  462.   const PartialMapping &getPartialMapping(unsigned StartIdx, unsigned Length,
  463.                                           const RegisterBank &RegBank) const;
  464.  
  465.   /// \name Methods to get a uniquely generated ValueMapping.
  466.   /// @{
  467.  
  468.   /// The most common ValueMapping consists of a single PartialMapping.
  469.   /// Feature a method for that.
  470.   const ValueMapping &getValueMapping(unsigned StartIdx, unsigned Length,
  471.                                       const RegisterBank &RegBank) const;
  472.  
  473.   /// Get the ValueMapping for the given arguments.
  474.   const ValueMapping &getValueMapping(const PartialMapping *BreakDown,
  475.                                       unsigned NumBreakDowns) const;
  476.   /// @}
  477.  
  478.   /// \name Methods to get a uniquely generated array of ValueMapping.
  479.   /// @{
  480.  
  481.   /// Get the uniquely generated array of ValueMapping for the
  482.   /// elements of between \p Begin and \p End.
  483.   ///
  484.   /// Elements that are nullptr will be replaced by
  485.   /// invalid ValueMapping (ValueMapping::isValid == false).
  486.   ///
  487.   /// \pre The pointers on ValueMapping between \p Begin and \p End
  488.   /// must uniquely identify a ValueMapping. Otherwise, there is no
  489.   /// guarantee that the return instance will be unique, i.e., another
  490.   /// OperandsMapping could have the same content.
  491.   template <typename Iterator>
  492.   const ValueMapping *getOperandsMapping(Iterator Begin, Iterator End) const;
  493.  
  494.   /// Get the uniquely generated array of ValueMapping for the
  495.   /// elements of \p OpdsMapping.
  496.   ///
  497.   /// Elements of \p OpdsMapping that are nullptr will be replaced by
  498.   /// invalid ValueMapping (ValueMapping::isValid == false).
  499.   const ValueMapping *getOperandsMapping(
  500.       const SmallVectorImpl<const ValueMapping *> &OpdsMapping) const;
  501.  
  502.   /// Get the uniquely generated array of ValueMapping for the
  503.   /// given arguments.
  504.   ///
  505.   /// Arguments that are nullptr will be replaced by invalid
  506.   /// ValueMapping (ValueMapping::isValid == false).
  507.   const ValueMapping *getOperandsMapping(
  508.       std::initializer_list<const ValueMapping *> OpdsMapping) const;
  509.   /// @}
  510.  
  511.   /// \name Methods to get a uniquely generated InstructionMapping.
  512.   /// @{
  513.  
  514. private:
  515.   /// Method to get a uniquely generated InstructionMapping.
  516.   const InstructionMapping &
  517.   getInstructionMappingImpl(bool IsInvalid, unsigned ID = InvalidMappingID,
  518.                             unsigned Cost = 0,
  519.                             const ValueMapping *OperandsMapping = nullptr,
  520.                             unsigned NumOperands = 0) const;
  521.  
  522. public:
  523.   /// Method to get a uniquely generated InstructionMapping.
  524.   const InstructionMapping &
  525.   getInstructionMapping(unsigned ID, unsigned Cost,
  526.                         const ValueMapping *OperandsMapping,
  527.                         unsigned NumOperands) const {
  528.     return getInstructionMappingImpl(/*IsInvalid*/ false, ID, Cost,
  529.                                      OperandsMapping, NumOperands);
  530.   }
  531.  
  532.   /// Method to get a uniquely generated invalid InstructionMapping.
  533.   const InstructionMapping &getInvalidInstructionMapping() const {
  534.     return getInstructionMappingImpl(/*IsInvalid*/ true);
  535.   }
  536.   /// @}
  537.  
  538.   /// Get the register bank for the \p OpIdx-th operand of \p MI form
  539.   /// the encoding constraints, if any.
  540.   ///
  541.   /// \return A register bank that covers the register class of the
  542.   /// related encoding constraints or nullptr if \p MI did not provide
  543.   /// enough information to deduce it.
  544.   const RegisterBank *
  545.   getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx,
  546.                             const TargetInstrInfo &TII,
  547.                             const MachineRegisterInfo &MRI) const;
  548.  
  549.   /// Helper method to apply something that is like the default mapping.
  550.   /// Basically, that means that \p OpdMapper.getMI() is left untouched
  551.   /// aside from the reassignment of the register operand that have been
  552.   /// remapped.
  553.   ///
  554.   /// The type of all the new registers that have been created by the
  555.   /// mapper are properly remapped to the type of the original registers
  556.   /// they replace. In other words, the semantic of the instruction does
  557.   /// not change, only the register banks.
  558.   ///
  559.   /// If the mapping of one of the operand spans several registers, this
  560.   /// method will abort as this is not like a default mapping anymore.
  561.   ///
  562.   /// \pre For OpIdx in {0..\p OpdMapper.getMI().getNumOperands())
  563.   ///        the range OpdMapper.getVRegs(OpIdx) is empty or of size 1.
  564.   static void applyDefaultMapping(const OperandsMapper &OpdMapper);
  565.  
  566.   /// See ::applyMapping.
  567.   virtual void applyMappingImpl(const OperandsMapper &OpdMapper) const {
  568.     llvm_unreachable("The target has to implement that part");
  569.   }
  570.  
  571. public:
  572.   virtual ~RegisterBankInfo() = default;
  573.  
  574.   /// Get the register bank identified by \p ID.
  575.   const RegisterBank &getRegBank(unsigned ID) const {
  576.     return const_cast<RegisterBankInfo *>(this)->getRegBank(ID);
  577.   }
  578.  
  579.   /// Get the register bank of \p Reg.
  580.   /// If Reg has not been assigned a register, a register class,
  581.   /// or a register bank, then this returns nullptr.
  582.   ///
  583.   /// \pre Reg != 0 (NoRegister)
  584.   const RegisterBank *getRegBank(Register Reg, const MachineRegisterInfo &MRI,
  585.                                  const TargetRegisterInfo &TRI) const;
  586.  
  587.   /// Get the total number of register banks.
  588.   unsigned getNumRegBanks() const { return NumRegBanks; }
  589.  
  590.   /// Get a register bank that covers \p RC.
  591.   ///
  592.   /// \pre \p RC is a user-defined register class (as opposed as one
  593.   /// generated by TableGen).
  594.   ///
  595.   /// \note The mapping RC -> RegBank could be built while adding the
  596.   /// coverage for the register banks. However, we do not do it, because,
  597.   /// at least for now, we only need this information for register classes
  598.   /// that are used in the description of instruction. In other words,
  599.   /// there are just a handful of them and we do not want to waste space.
  600.   ///
  601.   /// \todo This should be TableGen'ed.
  602.   virtual const RegisterBank &
  603.   getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const {
  604.     llvm_unreachable("The target must override this method");
  605.   }
  606.  
  607.   /// Get the cost of a copy from \p B to \p A, or put differently,
  608.   /// get the cost of A = COPY B. Since register banks may cover
  609.   /// different size, \p Size specifies what will be the size in bits
  610.   /// that will be copied around.
  611.   ///
  612.   /// \note Since this is a copy, both registers have the same size.
  613.   virtual unsigned copyCost(const RegisterBank &A, const RegisterBank &B,
  614.                             unsigned Size) const {
  615.     // Optimistically assume that copies are coalesced. I.e., when
  616.     // they are on the same bank, they are free.
  617.     // Otherwise assume a non-zero cost of 1. The targets are supposed
  618.     // to override that properly anyway if they care.
  619.     return &A != &B;
  620.   }
  621.  
  622.   /// \returns true if emitting a copy from \p Src to \p Dst is impossible.
  623.   bool cannotCopy(const RegisterBank &Dst, const RegisterBank &Src,
  624.                   unsigned Size) const {
  625.     return copyCost(Dst, Src, Size) == std::numeric_limits<unsigned>::max();
  626.   }
  627.  
  628.   /// Get the cost of using \p ValMapping to decompose a register. This is
  629.   /// similar to ::copyCost, except for cases where multiple copy-like
  630.   /// operations need to be inserted. If the register is used as a source
  631.   /// operand and already has a bank assigned, \p CurBank is non-null.
  632.   virtual unsigned
  633.   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.
  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_REGISTERBANKINFO_H
  776.