1 //===- CodeGenRegisters.h - Register and RegisterClass Info -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines structures to encapsulate information gleaned from the
11 // target register and register class definitions.
13 //===----------------------------------------------------------------------===//
15 #ifndef CODEGEN_REGISTERS_H
16 #define CODEGEN_REGISTERS_H
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"
34 /// CodeGenRegister - Represents a register definition.
35 struct CodeGenRegister {
40 // Map SubRegIndex -> Register.
41 typedef std::map<Record*, CodeGenRegister*, LessRecord> SubRegMap;
43 CodeGenRegister(Record *R, unsigned Enum);
45 const std::string &getName() const;
47 // Get a map of sub-registers computed lazily.
48 // This includes unique entries for all sub-sub-registers.
49 const SubRegMap &getSubRegs(CodeGenRegBank&);
51 const SubRegMap &getSubRegs() const {
52 assert(SubRegsComplete && "Must precompute sub-registers");
56 // Add sub-registers to OSet following a pre-order defined by the .td file.
57 void addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet) const;
59 // List of super-registers in topological order, small to large.
60 typedef std::vector<CodeGenRegister*> SuperRegList;
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");
69 // Order CodeGenRegister pointers by EnumValue.
71 bool operator()(const CodeGenRegister *A,
72 const CodeGenRegister *B) const {
73 return A->EnumValue < B->EnumValue;
77 // Canonically ordered set.
78 typedef std::set<const CodeGenRegister*, Less> Set;
83 SuperRegList SuperRegs;
87 class CodeGenRegisterClass {
88 CodeGenRegister::Set Members;
89 // Allocation orders. Order[0] always contains all registers in Members.
90 std::vector<SmallVector<Record*, 16> > Orders;
91 // Bit mask of sub-classes including this, indexed by their EnumValue.
93 // List of super-classes, topologocally ordered to have the larger classes
94 // first. This is the same as sorting by EnumValue.
95 SmallVector<CodeGenRegisterClass*, 4> SuperClasses;
100 std::string Namespace;
101 std::vector<MVT::SimpleValueType> VTs;
103 unsigned SpillAlignment;
106 // Map SubRegIndex -> RegisterClass
107 DenseMap<Record*,Record*> SubRegClasses;
108 std::string AltOrderSelect;
110 // Return the Record that defined this class, or NULL if the class was
111 // created by TableGen.
112 Record *getDef() const { return TheDef; }
114 const std::string &getName() const { return Name; }
115 std::string getQualifiedName() const;
116 const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
117 unsigned getNumValueTypes() const { return VTs.size(); }
119 MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const {
120 if (VTNum < VTs.size())
122 assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
126 // Return true if this this class contains the register.
127 bool contains(const CodeGenRegister*) const;
129 // Returns true if RC is a subclass.
130 // RC is a sub-class of this class if it is a valid replacement for any
131 // instruction operand where a register of this classis required. It must
132 // satisfy these conditions:
134 // 1. All RC registers are also in this.
135 // 2. The RC spill size must not be smaller than our spill size.
136 // 3. RC spill alignment must be compatible with ours.
138 bool hasSubClass(const CodeGenRegisterClass *RC) const {
139 return SubClasses.test(RC->EnumValue);
142 // getSubClasses - Returns a constant BitVector of subclasses indexed by
144 // The SubClasses vector includs an entry for this class.
145 const BitVector &getSubClasses() const { return SubClasses; };
147 // getSuperClasses - Returns a list of super classes ordered by EnumValue.
148 // The array does not include an entry for this class.
149 ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
153 // Returns an ordered list of class members.
154 // The order of registers is the same as in the .td file.
155 // No = 0 is the default allocation order, No = 1 is the first alternative.
156 ArrayRef<Record*> getOrder(unsigned No = 0) const {
160 // Return the total number of allocation orders available.
161 unsigned getNumOrders() const { return Orders.size(); }
163 // Get the set of registers. This set contains the same registers as
165 const CodeGenRegister::Set &getMembers() const { return Members; }
167 CodeGenRegisterClass(CodeGenRegBank&, Record *R);
169 // Called by CodeGenRegBank::CodeGenRegBank().
170 static void computeSubClasses(ArrayRef<CodeGenRegisterClass*>);
173 // CodeGenRegBank - Represent a target's registers and the relations between
175 class CodeGenRegBank {
176 RecordKeeper &Records;
179 std::vector<Record*> SubRegIndices;
180 unsigned NumNamedIndices;
181 std::vector<CodeGenRegister*> Registers;
182 DenseMap<Record*, CodeGenRegister*> Def2Reg;
184 std::vector<CodeGenRegisterClass*> RegClasses;
185 DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
187 // Composite SubRegIndex instances.
188 // Map (SubRegIndex, SubRegIndex) -> SubRegIndex.
189 typedef DenseMap<std::pair<Record*, Record*>, Record*> CompositeMap;
190 CompositeMap Composite;
192 // Populate the Composite map from sub-register relationships.
193 void computeComposites();
196 CodeGenRegBank(RecordKeeper&);
198 SetTheory &getSets() { return Sets; }
200 // Sub-register indices. The first NumNamedIndices are defined by the user
201 // in the .td files. The rest are synthesized such that all sub-registers
202 // have a unique name.
203 const std::vector<Record*> &getSubRegIndices() { return SubRegIndices; }
204 unsigned getNumNamedIndices() { return NumNamedIndices; }
206 // Map a SubRegIndex Record to its enum value.
207 unsigned getSubRegIndexNo(Record *idx);
209 // Find or create a sub-register index representing the A+B composition.
210 Record *getCompositeSubRegIndex(Record *A, Record *B, bool create = false);
212 const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
214 // Find a register from its Record def.
215 CodeGenRegister *getReg(Record*);
217 ArrayRef<CodeGenRegisterClass*> getRegClasses() const {
221 // Find a register class from its def.
222 CodeGenRegisterClass *getRegClass(Record*);
224 /// getRegisterClassForRegister - Find the register class that contains the
225 /// specified physical register. If the register is not in a register
226 /// class, return null. If the register is in multiple classes, and the
227 /// classes have a superset-subset relationship and the same set of types,
228 /// return the superclass. Otherwise return null.
229 const CodeGenRegisterClass* getRegClassForRegister(Record *R);
231 // Computed derived records such as missing sub-register indices.
232 void computeDerivedInfo();
234 // Compute full overlap sets for every register. These sets include the
235 // rarely used aliases that are neither sub nor super-registers.
237 // Map[R1].count(R2) is reflexive and symmetric, but not transitive.
239 // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2].
240 void computeOverlaps(std::map<const CodeGenRegister*,
241 CodeGenRegister::Set> &Map);