Home | History | Annotate | Download | only in TableGen
      1 //===- CodeGenRegisters.h - Register and RegisterClass Info -----*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines structures to encapsulate information gleaned from the
     11 // target register and register class definitions.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef CODEGEN_REGISTERS_H
     16 #define CODEGEN_REGISTERS_H
     17 
     18 #include "SetTheory.h"
     19 #include "llvm/TableGen/Record.h"
     20 #include "llvm/CodeGen/ValueTypes.h"
     21 #include "llvm/ADT/ArrayRef.h"
     22 #include "llvm/ADT/BitVector.h"
     23 #include "llvm/ADT/DenseMap.h"
     24 #include "llvm/ADT/SetVector.h"
     25 #include <cstdlib>
     26 #include <map>
     27 #include <string>
     28 #include <set>
     29 #include <vector>
     30 
     31 namespace llvm {
     32   class CodeGenRegBank;
     33 
     34   /// CodeGenRegister - Represents a register definition.
     35   struct CodeGenRegister {
     36     Record *TheDef;
     37     unsigned EnumValue;
     38     unsigned CostPerUse;
     39 
     40     // Map SubRegIndex -> Register.
     41     typedef std::map<Record*, CodeGenRegister*, LessRecord> SubRegMap;
     42 
     43     CodeGenRegister(Record *R, unsigned Enum);
     44 
     45     const std::string &getName() const;
     46 
     47     // Get a map of sub-registers computed lazily.
     48     // This includes unique entries for all sub-sub-registers.
     49     const SubRegMap &getSubRegs(CodeGenRegBank&);
     50 
     51     const SubRegMap &getSubRegs() const {
     52       assert(SubRegsComplete && "Must precompute sub-registers");
     53       return SubRegs;
     54     }
     55 
     56     // Add sub-registers to OSet following a pre-order defined by the .td file.
     57     void addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet) const;
     58 
     59     // List of super-registers in topological order, small to large.
     60     typedef std::vector<CodeGenRegister*> SuperRegList;
     61 
     62     // Get the list of super-registers.
     63     // This is only valid after computeDerivedInfo has visited all registers.
     64     const SuperRegList &getSuperRegs() const {
     65       assert(SubRegsComplete && "Must precompute sub-registers");
     66       return SuperRegs;
     67     }
     68 
     69     // Order CodeGenRegister pointers by EnumValue.
     70     struct Less {
     71       bool operator()(const CodeGenRegister *A,
     72                       const CodeGenRegister *B) const {
     73         assert(A && B);
     74         return A->EnumValue < B->EnumValue;
     75       }
     76     };
     77 
     78     // Canonically ordered set.
     79     typedef std::set<const CodeGenRegister*, Less> Set;
     80 
     81   private:
     82     bool SubRegsComplete;
     83     SubRegMap SubRegs;
     84     SuperRegList SuperRegs;
     85   };
     86 
     87 
     88   class CodeGenRegisterClass {
     89     CodeGenRegister::Set Members;
     90     // Allocation orders. Order[0] always contains all registers in Members.
     91     std::vector<SmallVector<Record*, 16> > Orders;
     92     // Bit mask of sub-classes including this, indexed by their EnumValue.
     93     BitVector SubClasses;
     94     // List of super-classes, topologocally ordered to have the larger classes
     95     // first.  This is the same as sorting by EnumValue.
     96     SmallVector<CodeGenRegisterClass*, 4> SuperClasses;
     97     Record *TheDef;
     98     std::string Name;
     99 
    100     // For a synthesized class, inherit missing properties from the nearest
    101     // super-class.
    102     void inheritProperties(CodeGenRegBank&);
    103 
    104     // Map SubRegIndex -> sub-class
    105     DenseMap<Record*, CodeGenRegisterClass*> SubClassWithSubReg;
    106 
    107   public:
    108     unsigned EnumValue;
    109     std::string Namespace;
    110     std::vector<MVT::SimpleValueType> VTs;
    111     unsigned SpillSize;
    112     unsigned SpillAlignment;
    113     int CopyCost;
    114     bool Allocatable;
    115     // Map SubRegIndex -> RegisterClass
    116     DenseMap<Record*,Record*> SubRegClasses;
    117     std::string AltOrderSelect;
    118 
    119     // Return the Record that defined this class, or NULL if the class was
    120     // created by TableGen.
    121     Record *getDef() const { return TheDef; }
    122 
    123     const std::string &getName() const { return Name; }
    124     std::string getQualifiedName() const;
    125     const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
    126     unsigned getNumValueTypes() const { return VTs.size(); }
    127 
    128     MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const {
    129       if (VTNum < VTs.size())
    130         return VTs[VTNum];
    131       assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
    132       abort();
    133     }
    134 
    135     // Return true if this this class contains the register.
    136     bool contains(const CodeGenRegister*) const;
    137 
    138     // Returns true if RC is a subclass.
    139     // RC is a sub-class of this class if it is a valid replacement for any
    140     // instruction operand where a register of this classis required. It must
    141     // satisfy these conditions:
    142     //
    143     // 1. All RC registers are also in this.
    144     // 2. The RC spill size must not be smaller than our spill size.
    145     // 3. RC spill alignment must be compatible with ours.
    146     //
    147     bool hasSubClass(const CodeGenRegisterClass *RC) const {
    148       return SubClasses.test(RC->EnumValue);
    149     }
    150 
    151     // getSubClassWithSubReg - Returns the largest sub-class where all
    152     // registers have a SubIdx sub-register.
    153     CodeGenRegisterClass *getSubClassWithSubReg(Record *SubIdx) const {
    154       return SubClassWithSubReg.lookup(SubIdx);
    155     }
    156 
    157     void setSubClassWithSubReg(Record *SubIdx, CodeGenRegisterClass *SubRC) {
    158       SubClassWithSubReg[SubIdx] = SubRC;
    159     }
    160 
    161     // getSubClasses - Returns a constant BitVector of subclasses indexed by
    162     // EnumValue.
    163     // The SubClasses vector includs an entry for this class.
    164     const BitVector &getSubClasses() const { return SubClasses; }
    165 
    166     // getSuperClasses - Returns a list of super classes ordered by EnumValue.
    167     // The array does not include an entry for this class.
    168     ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
    169       return SuperClasses;
    170     }
    171 
    172     // Returns an ordered list of class members.
    173     // The order of registers is the same as in the .td file.
    174     // No = 0 is the default allocation order, No = 1 is the first alternative.
    175     ArrayRef<Record*> getOrder(unsigned No = 0) const {
    176         return Orders[No];
    177     }
    178 
    179     // Return the total number of allocation orders available.
    180     unsigned getNumOrders() const { return Orders.size(); }
    181 
    182     // Get the set of registers.  This set contains the same registers as
    183     // getOrder(0).
    184     const CodeGenRegister::Set &getMembers() const { return Members; }
    185 
    186     CodeGenRegisterClass(CodeGenRegBank&, Record *R);
    187 
    188     // A key representing the parts of a register class used for forming
    189     // sub-classes.  Note the ordering provided by this key is not the same as
    190     // the topological order used for the EnumValues.
    191     struct Key {
    192       const CodeGenRegister::Set *Members;
    193       unsigned SpillSize;
    194       unsigned SpillAlignment;
    195 
    196       Key(const Key &O)
    197         : Members(O.Members),
    198           SpillSize(O.SpillSize),
    199           SpillAlignment(O.SpillAlignment) {}
    200 
    201       Key(const CodeGenRegister::Set *M, unsigned S = 0, unsigned A = 0)
    202         : Members(M), SpillSize(S), SpillAlignment(A) {}
    203 
    204       Key(const CodeGenRegisterClass &RC)
    205         : Members(&RC.getMembers()),
    206           SpillSize(RC.SpillSize),
    207           SpillAlignment(RC.SpillAlignment) {}
    208 
    209       // Lexicographical order of (Members, SpillSize, SpillAlignment).
    210       bool operator<(const Key&) const;
    211     };
    212 
    213     // Create a non-user defined register class.
    214     CodeGenRegisterClass(StringRef Name, Key Props);
    215 
    216     // Called by CodeGenRegBank::CodeGenRegBank().
    217     static void computeSubClasses(CodeGenRegBank&);
    218   };
    219 
    220   // CodeGenRegBank - Represent a target's registers and the relations between
    221   // them.
    222   class CodeGenRegBank {
    223     RecordKeeper &Records;
    224     SetTheory Sets;
    225 
    226     std::vector<Record*> SubRegIndices;
    227     unsigned NumNamedIndices;
    228     std::vector<CodeGenRegister*> Registers;
    229     DenseMap<Record*, CodeGenRegister*> Def2Reg;
    230 
    231     // Register classes.
    232     std::vector<CodeGenRegisterClass*> RegClasses;
    233     DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
    234     typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap;
    235     RCKeyMap Key2RC;
    236 
    237     // Add RC to *2RC maps.
    238     void addToMaps(CodeGenRegisterClass*);
    239 
    240     // Infer missing register classes.
    241     void computeInferredRegisterClasses();
    242 
    243     // Composite SubRegIndex instances.
    244     // Map (SubRegIndex, SubRegIndex) -> SubRegIndex.
    245     typedef DenseMap<std::pair<Record*, Record*>, Record*> CompositeMap;
    246     CompositeMap Composite;
    247 
    248     // Populate the Composite map from sub-register relationships.
    249     void computeComposites();
    250 
    251   public:
    252     CodeGenRegBank(RecordKeeper&);
    253 
    254     SetTheory &getSets() { return Sets; }
    255 
    256     // Sub-register indices. The first NumNamedIndices are defined by the user
    257     // in the .td files. The rest are synthesized such that all sub-registers
    258     // have a unique name.
    259     const std::vector<Record*> &getSubRegIndices() { return SubRegIndices; }
    260     unsigned getNumNamedIndices() { return NumNamedIndices; }
    261 
    262     // Map a SubRegIndex Record to its enum value.
    263     unsigned getSubRegIndexNo(Record *idx);
    264 
    265     // Find or create a sub-register index representing the A+B composition.
    266     Record *getCompositeSubRegIndex(Record *A, Record *B, bool create = false);
    267 
    268     const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
    269 
    270     // Find a register from its Record def.
    271     CodeGenRegister *getReg(Record*);
    272 
    273     ArrayRef<CodeGenRegisterClass*> getRegClasses() const {
    274       return RegClasses;
    275     }
    276 
    277     // Find a register class from its def.
    278     CodeGenRegisterClass *getRegClass(Record*);
    279 
    280     /// getRegisterClassForRegister - Find the register class that contains the
    281     /// specified physical register.  If the register is not in a register
    282     /// class, return null. If the register is in multiple classes, and the
    283     /// classes have a superset-subset relationship and the same set of types,
    284     /// return the superclass.  Otherwise return null.
    285     const CodeGenRegisterClass* getRegClassForRegister(Record *R);
    286 
    287     // Computed derived records such as missing sub-register indices.
    288     void computeDerivedInfo();
    289 
    290     // Compute full overlap sets for every register. These sets include the
    291     // rarely used aliases that are neither sub nor super-registers.
    292     //
    293     // Map[R1].count(R2) is reflexive and symmetric, but not transitive.
    294     //
    295     // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2].
    296     void computeOverlaps(std::map<const CodeGenRegister*,
    297                                   CodeGenRegister::Set> &Map);
    298   };
    299 }
    300 
    301 #endif
    302