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 
getSubRegsCodeGenRegister51     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.
getSuperRegsCodeGenRegister64     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 {
operatorCodeGenRegister::Less71       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.
getDef()121     Record *getDef() const { return TheDef; }
122 
getName()123     const std::string &getName() const { return Name; }
124     std::string getQualifiedName() const;
getValueTypes()125     const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
getNumValueTypes()126     unsigned getNumValueTypes() const { return VTs.size(); }
127 
getValueTypeNum(unsigned VTNum)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     //
hasSubClass(const CodeGenRegisterClass * RC)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.
getSubClassWithSubReg(Record * SubIdx)153     CodeGenRegisterClass *getSubClassWithSubReg(Record *SubIdx) const {
154       return SubClassWithSubReg.lookup(SubIdx);
155     }
156 
setSubClassWithSubReg(Record * SubIdx,CodeGenRegisterClass * SubRC)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.
getSubClasses()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.
getSuperClasses()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.
getNumOrders()180     unsigned getNumOrders() const { return Orders.size(); }
181 
182     // Get the set of registers.  This set contains the same registers as
183     // getOrder(0).
getMembers()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 
KeyKey196       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)
MembersKey202         : Members(M), SpillSize(S), SpillAlignment(A) {}
203 
KeyKey204       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 
getSets()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.
getSubRegIndices()259     const std::vector<Record*> &getSubRegIndices() { return SubRegIndices; }
getNumNamedIndices()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 
getRegisters()268     const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
269 
270     // Find a register from its Record def.
271     CodeGenRegister *getReg(Record*);
272 
getRegClasses()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