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 "llvm/Support/ErrorHandling.h"
26#include <cstdlib>
27#include <map>
28#include <string>
29#include <set>
30#include <vector>
31
32namespace llvm {
33  class CodeGenRegBank;
34
35  /// CodeGenSubRegIndex - Represents a sub-register index.
36  class CodeGenSubRegIndex {
37    Record *const TheDef;
38    const unsigned EnumValue;
39
40  public:
41    CodeGenSubRegIndex(Record *R, unsigned Enum);
42
43    const std::string &getName() const;
44    std::string getNamespace() const;
45    std::string getQualifiedName() const;
46
47    // Order CodeGenSubRegIndex pointers by EnumValue.
48    struct Less {
49      bool operator()(const CodeGenSubRegIndex *A,
50                      const CodeGenSubRegIndex *B) const {
51        assert(A && B);
52        return A->EnumValue < B->EnumValue;
53      }
54    };
55
56    // Map of composite subreg indices.
57    typedef std::map<CodeGenSubRegIndex*, CodeGenSubRegIndex*, Less> CompMap;
58
59    // Returns the subreg index that results from composing this with Idx.
60    // Returns NULL if this and Idx don't compose.
61    CodeGenSubRegIndex *compose(CodeGenSubRegIndex *Idx) const {
62      CompMap::const_iterator I = Composed.find(Idx);
63      return I == Composed.end() ? 0 : I->second;
64    }
65
66    // Add a composite subreg index: this+A = B.
67    // Return a conflicting composite, or NULL
68    CodeGenSubRegIndex *addComposite(CodeGenSubRegIndex *A,
69                                     CodeGenSubRegIndex *B) {
70      std::pair<CompMap::iterator, bool> Ins =
71        Composed.insert(std::make_pair(A, B));
72      return (Ins.second || Ins.first->second == B) ? 0 : Ins.first->second;
73    }
74
75    // Update the composite maps of components specified in 'ComposedOf'.
76    void updateComponents(CodeGenRegBank&);
77
78    // Clean out redundant composite mappings.
79    void cleanComposites();
80
81    // Return the map of composites.
82    const CompMap &getComposites() const { return Composed; }
83
84  private:
85    CompMap Composed;
86  };
87
88  /// CodeGenRegister - Represents a register definition.
89  struct CodeGenRegister {
90    Record *TheDef;
91    unsigned EnumValue;
92    unsigned CostPerUse;
93    bool CoveredBySubRegs;
94
95    // Map SubRegIndex -> Register.
96    typedef std::map<CodeGenSubRegIndex*, CodeGenRegister*,
97                     CodeGenSubRegIndex::Less> SubRegMap;
98
99    CodeGenRegister(Record *R, unsigned Enum);
100
101    const std::string &getName() const;
102
103    // Get a map of sub-registers computed lazily.
104    // This includes unique entries for all sub-sub-registers.
105    const SubRegMap &getSubRegs(CodeGenRegBank&);
106
107    const SubRegMap &getSubRegs() const {
108      assert(SubRegsComplete && "Must precompute sub-registers");
109      return SubRegs;
110    }
111
112    // Add sub-registers to OSet following a pre-order defined by the .td file.
113    void addSubRegsPreOrder(SetVector<const CodeGenRegister*> &OSet,
114                            CodeGenRegBank&) const;
115
116    // List of super-registers in topological order, small to large.
117    typedef std::vector<const CodeGenRegister*> SuperRegList;
118
119    // Get the list of super-registers. This is valid after getSubReg
120    // visits all registers during RegBank construction.
121    const SuperRegList &getSuperRegs() const {
122      assert(SubRegsComplete && "Must precompute sub-registers");
123      return SuperRegs;
124    }
125
126    // List of register units in ascending order.
127    typedef SmallVector<unsigned, 16> RegUnitList;
128
129    // Get the list of register units.
130    // This is only valid after getSubRegs() completes.
131    const RegUnitList &getRegUnits() const { return RegUnits; }
132
133    // Inherit register units from subregisters.
134    // Return true if the RegUnits changed.
135    bool inheritRegUnits(CodeGenRegBank &RegBank);
136
137    // Adopt a register unit for pressure tracking.
138    // A unit is adopted iff its unit number is >= NumNativeRegUnits.
139    void adoptRegUnit(unsigned RUID) { RegUnits.push_back(RUID); }
140
141    // Get the sum of this register's register unit weights.
142    unsigned getWeight(const CodeGenRegBank &RegBank) const;
143
144    // Order CodeGenRegister pointers by EnumValue.
145    struct Less {
146      bool operator()(const CodeGenRegister *A,
147                      const CodeGenRegister *B) const {
148        assert(A && B);
149        return A->EnumValue < B->EnumValue;
150      }
151    };
152
153    // Canonically ordered set.
154    typedef std::set<const CodeGenRegister*, Less> Set;
155
156  private:
157    bool SubRegsComplete;
158    SubRegMap SubRegs;
159    SuperRegList SuperRegs;
160    RegUnitList RegUnits;
161  };
162
163
164  class CodeGenRegisterClass {
165    CodeGenRegister::Set Members;
166    // Allocation orders. Order[0] always contains all registers in Members.
167    std::vector<SmallVector<Record*, 16> > Orders;
168    // Bit mask of sub-classes including this, indexed by their EnumValue.
169    BitVector SubClasses;
170    // List of super-classes, topologocally ordered to have the larger classes
171    // first.  This is the same as sorting by EnumValue.
172    SmallVector<CodeGenRegisterClass*, 4> SuperClasses;
173    Record *TheDef;
174    std::string Name;
175
176    // For a synthesized class, inherit missing properties from the nearest
177    // super-class.
178    void inheritProperties(CodeGenRegBank&);
179
180    // Map SubRegIndex -> sub-class.  This is the largest sub-class where all
181    // registers have a SubRegIndex sub-register.
182    DenseMap<CodeGenSubRegIndex*, CodeGenRegisterClass*> SubClassWithSubReg;
183
184    // Map SubRegIndex -> set of super-reg classes.  This is all register
185    // classes SuperRC such that:
186    //
187    //   R:SubRegIndex in this RC for all R in SuperRC.
188    //
189    DenseMap<CodeGenSubRegIndex*,
190             SmallPtrSet<CodeGenRegisterClass*, 8> > SuperRegClasses;
191
192  public:
193    unsigned EnumValue;
194    std::string Namespace;
195    std::vector<MVT::SimpleValueType> VTs;
196    unsigned SpillSize;
197    unsigned SpillAlignment;
198    int CopyCost;
199    bool Allocatable;
200    // Map SubRegIndex -> RegisterClass
201    DenseMap<Record*,Record*> SubRegClasses;
202    std::string AltOrderSelect;
203
204    // Return the Record that defined this class, or NULL if the class was
205    // created by TableGen.
206    Record *getDef() const { return TheDef; }
207
208    const std::string &getName() const { return Name; }
209    std::string getQualifiedName() const;
210    const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
211    unsigned getNumValueTypes() const { return VTs.size(); }
212
213    MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const {
214      if (VTNum < VTs.size())
215        return VTs[VTNum];
216      llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!");
217    }
218
219    // Return true if this this class contains the register.
220    bool contains(const CodeGenRegister*) const;
221
222    // Returns true if RC is a subclass.
223    // RC is a sub-class of this class if it is a valid replacement for any
224    // instruction operand where a register of this classis required. It must
225    // satisfy these conditions:
226    //
227    // 1. All RC registers are also in this.
228    // 2. The RC spill size must not be smaller than our spill size.
229    // 3. RC spill alignment must be compatible with ours.
230    //
231    bool hasSubClass(const CodeGenRegisterClass *RC) const {
232      return SubClasses.test(RC->EnumValue);
233    }
234
235    // getSubClassWithSubReg - Returns the largest sub-class where all
236    // registers have a SubIdx sub-register.
237    CodeGenRegisterClass*
238    getSubClassWithSubReg(CodeGenSubRegIndex *SubIdx) const {
239      return SubClassWithSubReg.lookup(SubIdx);
240    }
241
242    void setSubClassWithSubReg(CodeGenSubRegIndex *SubIdx,
243                               CodeGenRegisterClass *SubRC) {
244      SubClassWithSubReg[SubIdx] = SubRC;
245    }
246
247    // getSuperRegClasses - Returns a bit vector of all register classes
248    // containing only SubIdx super-registers of this class.
249    void getSuperRegClasses(CodeGenSubRegIndex *SubIdx, BitVector &Out) const;
250
251    // addSuperRegClass - Add a class containing only SudIdx super-registers.
252    void addSuperRegClass(CodeGenSubRegIndex *SubIdx,
253                          CodeGenRegisterClass *SuperRC) {
254      SuperRegClasses[SubIdx].insert(SuperRC);
255    }
256
257    // getSubClasses - Returns a constant BitVector of subclasses indexed by
258    // EnumValue.
259    // The SubClasses vector includs an entry for this class.
260    const BitVector &getSubClasses() const { return SubClasses; }
261
262    // getSuperClasses - Returns a list of super classes ordered by EnumValue.
263    // The array does not include an entry for this class.
264    ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
265      return SuperClasses;
266    }
267
268    // Returns an ordered list of class members.
269    // The order of registers is the same as in the .td file.
270    // No = 0 is the default allocation order, No = 1 is the first alternative.
271    ArrayRef<Record*> getOrder(unsigned No = 0) const {
272        return Orders[No];
273    }
274
275    // Return the total number of allocation orders available.
276    unsigned getNumOrders() const { return Orders.size(); }
277
278    // Get the set of registers.  This set contains the same registers as
279    // getOrder(0).
280    const CodeGenRegister::Set &getMembers() const { return Members; }
281
282    // Populate a unique sorted list of units from a register set.
283    void buildRegUnitSet(std::vector<unsigned> &RegUnits) const;
284
285    CodeGenRegisterClass(CodeGenRegBank&, Record *R);
286
287    // A key representing the parts of a register class used for forming
288    // sub-classes.  Note the ordering provided by this key is not the same as
289    // the topological order used for the EnumValues.
290    struct Key {
291      const CodeGenRegister::Set *Members;
292      unsigned SpillSize;
293      unsigned SpillAlignment;
294
295      Key(const Key &O)
296        : Members(O.Members),
297          SpillSize(O.SpillSize),
298          SpillAlignment(O.SpillAlignment) {}
299
300      Key(const CodeGenRegister::Set *M, unsigned S = 0, unsigned A = 0)
301        : Members(M), SpillSize(S), SpillAlignment(A) {}
302
303      Key(const CodeGenRegisterClass &RC)
304        : Members(&RC.getMembers()),
305          SpillSize(RC.SpillSize),
306          SpillAlignment(RC.SpillAlignment) {}
307
308      // Lexicographical order of (Members, SpillSize, SpillAlignment).
309      bool operator<(const Key&) const;
310    };
311
312    // Create a non-user defined register class.
313    CodeGenRegisterClass(StringRef Name, Key Props);
314
315    // Called by CodeGenRegBank::CodeGenRegBank().
316    static void computeSubClasses(CodeGenRegBank&);
317  };
318
319  // Each RegUnitSet is a sorted vector with a name.
320  struct RegUnitSet {
321    typedef std::vector<unsigned>::const_iterator iterator;
322
323    std::string Name;
324    std::vector<unsigned> Units;
325  };
326
327  // CodeGenRegBank - Represent a target's registers and the relations between
328  // them.
329  class CodeGenRegBank {
330    RecordKeeper &Records;
331    SetTheory Sets;
332
333    // SubRegIndices.
334    std::vector<CodeGenSubRegIndex*> SubRegIndices;
335    DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
336    unsigned NumNamedIndices;
337
338    // Registers.
339    std::vector<CodeGenRegister*> Registers;
340    DenseMap<Record*, CodeGenRegister*> Def2Reg;
341    unsigned NumNativeRegUnits;
342    unsigned NumRegUnits; // # native + adopted register units.
343
344    // Map each register unit to a weight (for register pressure).
345    // Includes native and adopted register units.
346    std::vector<unsigned> RegUnitWeights;
347
348    // Register classes.
349    std::vector<CodeGenRegisterClass*> RegClasses;
350    DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
351    typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap;
352    RCKeyMap Key2RC;
353
354    // Remember each unique set of register units. Initially, this contains a
355    // unique set for each register class. Simliar sets are coalesced with
356    // pruneUnitSets and new supersets are inferred during computeRegUnitSets.
357    std::vector<RegUnitSet> RegUnitSets;
358
359    // Map RegisterClass index to the index of the RegUnitSet that contains the
360    // class's units and any inferred RegUnit supersets.
361    std::vector<std::vector<unsigned> > RegClassUnitSets;
362
363    // Add RC to *2RC maps.
364    void addToMaps(CodeGenRegisterClass*);
365
366    // Create a synthetic sub-class if it is missing.
367    CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC,
368                                              const CodeGenRegister::Set *Membs,
369                                              StringRef Name);
370
371    // Infer missing register classes.
372    void computeInferredRegisterClasses();
373    void inferCommonSubClass(CodeGenRegisterClass *RC);
374    void inferSubClassWithSubReg(CodeGenRegisterClass *RC);
375    void inferMatchingSuperRegClass(CodeGenRegisterClass *RC,
376                                    unsigned FirstSubRegRC = 0);
377
378    // Iteratively prune unit sets.
379    void pruneUnitSets();
380
381    // Compute a weight for each register unit created during getSubRegs.
382    void computeRegUnitWeights();
383
384    // Create a RegUnitSet for each RegClass and infer superclasses.
385    void computeRegUnitSets();
386
387    // Populate the Composite map from sub-register relationships.
388    void computeComposites();
389
390  public:
391    CodeGenRegBank(RecordKeeper&);
392
393    SetTheory &getSets() { return Sets; }
394
395    // Sub-register indices. The first NumNamedIndices are defined by the user
396    // in the .td files. The rest are synthesized such that all sub-registers
397    // have a unique name.
398    ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; }
399    unsigned getNumNamedIndices() { return NumNamedIndices; }
400
401    // Find a SubRegIndex form its Record def.
402    CodeGenSubRegIndex *getSubRegIdx(Record*);
403
404    // Find or create a sub-register index representing the A+B composition.
405    CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A,
406                                                CodeGenSubRegIndex *B);
407
408    const std::vector<CodeGenRegister*> &getRegisters() { return Registers; }
409
410    // Find a register from its Record def.
411    CodeGenRegister *getReg(Record*);
412
413    // Get a Register's index into the Registers array.
414    unsigned getRegIndex(const CodeGenRegister *Reg) const {
415      return Reg->EnumValue - 1;
416    }
417
418    // Create a new non-native register unit that can be adopted by a register
419    // to increase its pressure. Note that NumNativeRegUnits is not increased.
420    unsigned newRegUnit(unsigned Weight) {
421      if (!RegUnitWeights.empty()) {
422        assert(Weight && "should only add allocatable units");
423        RegUnitWeights.resize(NumRegUnits+1);
424        RegUnitWeights[NumRegUnits] = Weight;
425      }
426      return NumRegUnits++;
427    }
428
429    // Native units are the singular unit of a leaf register. Register aliasing
430    // is completely characterized by native units. Adopted units exist to give
431    // register additional weight but don't affect aliasing.
432    bool isNativeUnit(unsigned RUID) {
433      return RUID < NumNativeRegUnits;
434    }
435
436    ArrayRef<CodeGenRegisterClass*> getRegClasses() const {
437      return RegClasses;
438    }
439
440    // Find a register class from its def.
441    CodeGenRegisterClass *getRegClass(Record*);
442
443    /// getRegisterClassForRegister - Find the register class that contains the
444    /// specified physical register.  If the register is not in a register
445    /// class, return null. If the register is in multiple classes, and the
446    /// classes have a superset-subset relationship and the same set of types,
447    /// return the superclass.  Otherwise return null.
448    const CodeGenRegisterClass* getRegClassForRegister(Record *R);
449
450    // Get a register unit's weight. Zero for unallocatable registers.
451    unsigned getRegUnitWeight(unsigned RUID) const {
452      return RegUnitWeights[RUID];
453    }
454
455    // Get the sum of unit weights.
456    unsigned getRegUnitSetWeight(const std::vector<unsigned> &Units) const {
457      unsigned Weight = 0;
458      for (std::vector<unsigned>::const_iterator
459             I = Units.begin(), E = Units.end(); I != E; ++I)
460        Weight += getRegUnitWeight(*I);
461      return Weight;
462    }
463
464    // Increase a RegUnitWeight.
465    void increaseRegUnitWeight(unsigned RUID, unsigned Inc) {
466      RegUnitWeights[RUID] += Inc;
467    }
468
469    // Get the number of register pressure dimensions.
470    unsigned getNumRegPressureSets() const { return RegUnitSets.size(); }
471
472    // Get a set of register unit IDs for a given dimension of pressure.
473    RegUnitSet getRegPressureSet(unsigned Idx) const {
474      return RegUnitSets[Idx];
475    }
476
477    // Get a list of pressure set IDs for a register class. Liveness of a
478    // register in this class impacts each pressure set in this list by the
479    // weight of the register. An exact solution requires all registers in a
480    // class to have the same class, but it is not strictly guaranteed.
481    ArrayRef<unsigned> getRCPressureSetIDs(unsigned RCIdx) const {
482      return RegClassUnitSets[RCIdx];
483    }
484
485    // Computed derived records such as missing sub-register indices.
486    void computeDerivedInfo();
487
488    // Compute full overlap sets for every register. These sets include the
489    // rarely used aliases that are neither sub nor super-registers.
490    //
491    // Map[R1].count(R2) is reflexive and symmetric, but not transitive.
492    //
493    // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2].
494    void computeOverlaps(std::map<const CodeGenRegister*,
495                                  CodeGenRegister::Set> &Map);
496
497    // Compute the set of registers completely covered by the registers in Regs.
498    // The returned BitVector will have a bit set for each register in Regs,
499    // all sub-registers, and all super-registers that are covered by the
500    // registers in Regs.
501    //
502    // This is used to compute the mask of call-preserved registers from a list
503    // of callee-saves.
504    BitVector computeCoveredRegisters(ArrayRef<Record*> Regs);
505  };
506}
507
508#endif
509