1 //===- CodeGenRegisters.h - Register and RegisterClass Info -----*- 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 // This file defines structures to encapsulate information gleaned from the
10 // target register and register class definitions.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_UTILS_TABLEGEN_CODEGENREGISTERS_H
15 #define LLVM_UTILS_TABLEGEN_CODEGENREGISTERS_H
16 
17 #include "InfoByHwMode.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/BitVector.h"
20 #include "llvm/ADT/DenseMap.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/ADT/SetVector.h"
23 #include "llvm/ADT/SmallPtrSet.h"
24 #include "llvm/ADT/SmallVector.h"
25 #include "llvm/ADT/SparseBitVector.h"
26 #include "llvm/ADT/StringMap.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/MC/LaneBitmask.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/MachineValueType.h"
31 #include "llvm/TableGen/Record.h"
32 #include "llvm/TableGen/SetTheory.h"
33 #include <cassert>
34 #include <cstdint>
35 #include <deque>
36 #include <list>
37 #include <map>
38 #include <string>
39 #include <utility>
40 #include <vector>
41 
42 namespace llvm {
43 
44   class CodeGenRegBank;
45   template <typename T, typename Vector, typename Set> class SetVector;
46 
47   /// Used to encode a step in a register lane mask transformation.
48   /// Mask the bits specified in Mask, then rotate them Rol bits to the left
49   /// assuming a wraparound at 32bits.
50   struct MaskRolPair {
51     LaneBitmask Mask;
52     uint8_t RotateLeft;
53 
54     bool operator==(const MaskRolPair Other) const {
55       return Mask == Other.Mask && RotateLeft == Other.RotateLeft;
56     }
57     bool operator!=(const MaskRolPair Other) const {
58       return Mask != Other.Mask || RotateLeft != Other.RotateLeft;
59     }
60   };
61 
62   /// CodeGenSubRegIndex - Represents a sub-register index.
63   class CodeGenSubRegIndex {
64     Record *const TheDef;
65     std::string Name;
66     std::string Namespace;
67 
68   public:
69     uint16_t Size;
70     uint16_t Offset;
71     const unsigned EnumValue;
72     mutable LaneBitmask LaneMask;
73     mutable SmallVector<MaskRolPair,1> CompositionLaneMaskTransform;
74 
75     /// A list of subregister indexes concatenated resulting in this
76     /// subregister index. This is the reverse of CodeGenRegBank::ConcatIdx.
77     SmallVector<CodeGenSubRegIndex*,4> ConcatenationOf;
78 
79     // Are all super-registers containing this SubRegIndex covered by their
80     // sub-registers?
81     bool AllSuperRegsCovered;
82     // A subregister index is "artificial" if every subregister obtained
83     // from applying this index is artificial. Artificial subregister
84     // indexes are not used to create new register classes.
85     bool Artificial;
86 
87     CodeGenSubRegIndex(Record *R, unsigned Enum);
88     CodeGenSubRegIndex(StringRef N, StringRef Nspace, unsigned Enum);
89     CodeGenSubRegIndex(CodeGenSubRegIndex&) = delete;
90 
91     const std::string &getName() const { return Name; }
92     const std::string &getNamespace() const { return Namespace; }
93     std::string getQualifiedName() const;
94 
95     // Map of composite subreg indices.
96     typedef std::map<CodeGenSubRegIndex *, CodeGenSubRegIndex *,
97                      deref<std::less<>>>
98         CompMap;
99 
100     // Returns the subreg index that results from composing this with Idx.
101     // Returns NULL if this and Idx don't compose.
102     CodeGenSubRegIndex *compose(CodeGenSubRegIndex *Idx) const {
103       CompMap::const_iterator I = Composed.find(Idx);
104       return I == Composed.end() ? nullptr : I->second;
105     }
106 
107     // Add a composite subreg index: this+A = B.
108     // Return a conflicting composite, or NULL
109     CodeGenSubRegIndex *addComposite(CodeGenSubRegIndex *A,
110                                      CodeGenSubRegIndex *B) {
111       assert(A && B);
112       std::pair<CompMap::iterator, bool> Ins =
113         Composed.insert(std::make_pair(A, B));
114       // Synthetic subreg indices that aren't contiguous (for instance ARM
115       // register tuples) don't have a bit range, so it's OK to let
116       // B->Offset == -1. For the other cases, accumulate the offset and set
117       // the size here. Only do so if there is no offset yet though.
118       if ((Offset != (uint16_t)-1 && A->Offset != (uint16_t)-1) &&
119           (B->Offset == (uint16_t)-1)) {
120         B->Offset = Offset + A->Offset;
121         B->Size = A->Size;
122       }
123       return (Ins.second || Ins.first->second == B) ? nullptr
124                                                     : Ins.first->second;
125     }
126 
127     // Update the composite maps of components specified in 'ComposedOf'.
128     void updateComponents(CodeGenRegBank&);
129 
130     // Return the map of composites.
131     const CompMap &getComposites() const { return Composed; }
132 
133     // Compute LaneMask from Composed. Return LaneMask.
134     LaneBitmask computeLaneMask() const;
135 
136     void setConcatenationOf(ArrayRef<CodeGenSubRegIndex*> Parts);
137 
138     /// Replaces subregister indexes in the `ConcatenationOf` list with
139     /// list of subregisters they are composed of (if any). Do this recursively.
140     void computeConcatTransitiveClosure();
141 
142     bool operator<(const CodeGenSubRegIndex &RHS) const {
143       return this->EnumValue < RHS.EnumValue;
144     }
145 
146   private:
147     CompMap Composed;
148   };
149 
150   /// CodeGenRegister - Represents a register definition.
151   struct CodeGenRegister {
152     Record *TheDef;
153     unsigned EnumValue;
154     unsigned CostPerUse;
155     bool CoveredBySubRegs;
156     bool HasDisjunctSubRegs;
157     bool Artificial;
158 
159     // Map SubRegIndex -> Register.
160     typedef std::map<CodeGenSubRegIndex *, CodeGenRegister *,
161                      deref<std::less<>>>
162         SubRegMap;
163 
164     CodeGenRegister(Record *R, unsigned Enum);
165 
166     const StringRef getName() const;
167 
168     // Extract more information from TheDef. This is used to build an object
169     // graph after all CodeGenRegister objects have been created.
170     void buildObjectGraph(CodeGenRegBank&);
171 
172     // Lazily compute a map of all sub-registers.
173     // This includes unique entries for all sub-sub-registers.
174     const SubRegMap &computeSubRegs(CodeGenRegBank&);
175 
176     // Compute extra sub-registers by combining the existing sub-registers.
177     void computeSecondarySubRegs(CodeGenRegBank&);
178 
179     // Add this as a super-register to all sub-registers after the sub-register
180     // graph has been built.
181     void computeSuperRegs(CodeGenRegBank&);
182 
183     const SubRegMap &getSubRegs() const {
184       assert(SubRegsComplete && "Must precompute sub-registers");
185       return SubRegs;
186     }
187 
188     // Add sub-registers to OSet following a pre-order defined by the .td file.
189     void addSubRegsPreOrder(SetVector<const CodeGenRegister*> &OSet,
190                             CodeGenRegBank&) const;
191 
192     // Return the sub-register index naming Reg as a sub-register of this
193     // register. Returns NULL if Reg is not a sub-register.
194     CodeGenSubRegIndex *getSubRegIndex(const CodeGenRegister *Reg) const {
195       return SubReg2Idx.lookup(Reg);
196     }
197 
198     typedef std::vector<const CodeGenRegister*> SuperRegList;
199 
200     // Get the list of super-registers in topological order, small to large.
201     // This is valid after computeSubRegs visits all registers during RegBank
202     // construction.
203     const SuperRegList &getSuperRegs() const {
204       assert(SubRegsComplete && "Must precompute sub-registers");
205       return SuperRegs;
206     }
207 
208     // Get the list of ad hoc aliases. The graph is symmetric, so the list
209     // contains all registers in 'Aliases', and all registers that mention this
210     // register in 'Aliases'.
211     ArrayRef<CodeGenRegister*> getExplicitAliases() const {
212       return ExplicitAliases;
213     }
214 
215     // Get the topological signature of this register. This is a small integer
216     // less than RegBank.getNumTopoSigs(). Registers with the same TopoSig have
217     // identical sub-register structure. That is, they support the same set of
218     // sub-register indices mapping to the same kind of sub-registers
219     // (TopoSig-wise).
220     unsigned getTopoSig() const {
221       assert(SuperRegsComplete && "TopoSigs haven't been computed yet.");
222       return TopoSig;
223     }
224 
225     // List of register units in ascending order.
226     typedef SparseBitVector<> RegUnitList;
227     typedef SmallVector<LaneBitmask, 16> RegUnitLaneMaskList;
228 
229     // How many entries in RegUnitList are native?
230     RegUnitList NativeRegUnits;
231 
232     // Get the list of register units.
233     // This is only valid after computeSubRegs() completes.
234     const RegUnitList &getRegUnits() const { return RegUnits; }
235 
236     ArrayRef<LaneBitmask> getRegUnitLaneMasks() const {
237       return makeArrayRef(RegUnitLaneMasks).slice(0, NativeRegUnits.count());
238     }
239 
240     // Get the native register units. This is a prefix of getRegUnits().
241     RegUnitList getNativeRegUnits() const {
242       return NativeRegUnits;
243     }
244 
245     void setRegUnitLaneMasks(const RegUnitLaneMaskList &LaneMasks) {
246       RegUnitLaneMasks = LaneMasks;
247     }
248 
249     // Inherit register units from subregisters.
250     // Return true if the RegUnits changed.
251     bool inheritRegUnits(CodeGenRegBank &RegBank);
252 
253     // Adopt a register unit for pressure tracking.
254     // A unit is adopted iff its unit number is >= NativeRegUnits.count().
255     void adoptRegUnit(unsigned RUID) { RegUnits.set(RUID); }
256 
257     // Get the sum of this register's register unit weights.
258     unsigned getWeight(const CodeGenRegBank &RegBank) const;
259 
260     // Canonically ordered set.
261     typedef std::vector<const CodeGenRegister*> Vec;
262 
263   private:
264     bool SubRegsComplete;
265     bool SuperRegsComplete;
266     unsigned TopoSig;
267 
268     // The sub-registers explicit in the .td file form a tree.
269     SmallVector<CodeGenSubRegIndex*, 8> ExplicitSubRegIndices;
270     SmallVector<CodeGenRegister*, 8> ExplicitSubRegs;
271 
272     // Explicit ad hoc aliases, symmetrized to form an undirected graph.
273     SmallVector<CodeGenRegister*, 8> ExplicitAliases;
274 
275     // Super-registers where this is the first explicit sub-register.
276     SuperRegList LeadingSuperRegs;
277 
278     SubRegMap SubRegs;
279     SuperRegList SuperRegs;
280     DenseMap<const CodeGenRegister*, CodeGenSubRegIndex*> SubReg2Idx;
281     RegUnitList RegUnits;
282     RegUnitLaneMaskList RegUnitLaneMasks;
283   };
284 
285   inline bool operator<(const CodeGenRegister &A, const CodeGenRegister &B) {
286     return A.EnumValue < B.EnumValue;
287   }
288 
289   inline bool operator==(const CodeGenRegister &A, const CodeGenRegister &B) {
290     return A.EnumValue == B.EnumValue;
291   }
292 
293   class CodeGenRegisterClass {
294     CodeGenRegister::Vec Members;
295     // Allocation orders. Order[0] always contains all registers in Members.
296     std::vector<SmallVector<Record*, 16>> Orders;
297     // Bit mask of sub-classes including this, indexed by their EnumValue.
298     BitVector SubClasses;
299     // List of super-classes, topologocally ordered to have the larger classes
300     // first.  This is the same as sorting by EnumValue.
301     SmallVector<CodeGenRegisterClass*, 4> SuperClasses;
302     Record *TheDef;
303     std::string Name;
304 
305     // For a synthesized class, inherit missing properties from the nearest
306     // super-class.
307     void inheritProperties(CodeGenRegBank&);
308 
309     // Map SubRegIndex -> sub-class.  This is the largest sub-class where all
310     // registers have a SubRegIndex sub-register.
311     DenseMap<const CodeGenSubRegIndex *, CodeGenRegisterClass *>
312         SubClassWithSubReg;
313 
314     // Map SubRegIndex -> set of super-reg classes.  This is all register
315     // classes SuperRC such that:
316     //
317     //   R:SubRegIndex in this RC for all R in SuperRC.
318     //
319     DenseMap<const CodeGenSubRegIndex *, SmallPtrSet<CodeGenRegisterClass *, 8>>
320         SuperRegClasses;
321 
322     // Bit vector of TopoSigs for the registers in this class. This will be
323     // very sparse on regular architectures.
324     BitVector TopoSigs;
325 
326   public:
327     unsigned EnumValue;
328     StringRef Namespace;
329     SmallVector<ValueTypeByHwMode, 4> VTs;
330     RegSizeInfoByHwMode RSI;
331     int CopyCost;
332     bool Allocatable;
333     StringRef AltOrderSelect;
334     uint8_t AllocationPriority;
335     /// Contains the combination of the lane masks of all subregisters.
336     LaneBitmask LaneMask;
337     /// True if there are at least 2 subregisters which do not interfere.
338     bool HasDisjunctSubRegs;
339     bool CoveredBySubRegs;
340     /// A register class is artificial if all its members are artificial.
341     bool Artificial;
342 
343     // Return the Record that defined this class, or NULL if the class was
344     // created by TableGen.
345     Record *getDef() const { return TheDef; }
346 
347     const std::string &getName() const { return Name; }
348     std::string getQualifiedName() const;
349     ArrayRef<ValueTypeByHwMode> getValueTypes() const { return VTs; }
350     unsigned getNumValueTypes() const { return VTs.size(); }
351 
352     bool hasType(const ValueTypeByHwMode &VT) const {
353       return std::find(VTs.begin(), VTs.end(), VT) != VTs.end();
354     }
355 
356     const ValueTypeByHwMode &getValueTypeNum(unsigned VTNum) const {
357       if (VTNum < VTs.size())
358         return VTs[VTNum];
359       llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!");
360     }
361 
362     // Return true if this this class contains the register.
363     bool contains(const CodeGenRegister*) const;
364 
365     // Returns true if RC is a subclass.
366     // RC is a sub-class of this class if it is a valid replacement for any
367     // instruction operand where a register of this classis required. It must
368     // satisfy these conditions:
369     //
370     // 1. All RC registers are also in this.
371     // 2. The RC spill size must not be smaller than our spill size.
372     // 3. RC spill alignment must be compatible with ours.
373     //
374     bool hasSubClass(const CodeGenRegisterClass *RC) const {
375       return SubClasses.test(RC->EnumValue);
376     }
377 
378     // getSubClassWithSubReg - Returns the largest sub-class where all
379     // registers have a SubIdx sub-register.
380     CodeGenRegisterClass *
381     getSubClassWithSubReg(const CodeGenSubRegIndex *SubIdx) const {
382       return SubClassWithSubReg.lookup(SubIdx);
383     }
384 
385     /// Find largest subclass where all registers have SubIdx subregisters in
386     /// SubRegClass and the largest subregister class that contains those
387     /// subregisters without (as far as possible) also containing additional registers.
388     ///
389     /// This can be used to find a suitable pair of classes for subregister copies.
390     /// \return std::pair<SubClass, SubRegClass> where SubClass is a SubClass is
391     /// a class where every register has SubIdx and SubRegClass is a class where
392     /// every register is covered by the SubIdx subregister of SubClass.
393     Optional<std::pair<CodeGenRegisterClass *, CodeGenRegisterClass *>>
394     getMatchingSubClassWithSubRegs(CodeGenRegBank &RegBank,
395                                    const CodeGenSubRegIndex *SubIdx) const;
396 
397     void setSubClassWithSubReg(const CodeGenSubRegIndex *SubIdx,
398                                CodeGenRegisterClass *SubRC) {
399       SubClassWithSubReg[SubIdx] = SubRC;
400     }
401 
402     // getSuperRegClasses - Returns a bit vector of all register classes
403     // containing only SubIdx super-registers of this class.
404     void getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
405                             BitVector &Out) const;
406 
407     // addSuperRegClass - Add a class containing only SubIdx super-registers.
408     void addSuperRegClass(CodeGenSubRegIndex *SubIdx,
409                           CodeGenRegisterClass *SuperRC) {
410       SuperRegClasses[SubIdx].insert(SuperRC);
411     }
412 
413     // getSubClasses - Returns a constant BitVector of subclasses indexed by
414     // EnumValue.
415     // The SubClasses vector includes an entry for this class.
416     const BitVector &getSubClasses() const { return SubClasses; }
417 
418     // getSuperClasses - Returns a list of super classes ordered by EnumValue.
419     // The array does not include an entry for this class.
420     ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
421       return SuperClasses;
422     }
423 
424     // Returns an ordered list of class members.
425     // The order of registers is the same as in the .td file.
426     // No = 0 is the default allocation order, No = 1 is the first alternative.
427     ArrayRef<Record*> getOrder(unsigned No = 0) const {
428         return Orders[No];
429     }
430 
431     // Return the total number of allocation orders available.
432     unsigned getNumOrders() const { return Orders.size(); }
433 
434     // Get the set of registers.  This set contains the same registers as
435     // getOrder(0).
436     const CodeGenRegister::Vec &getMembers() const { return Members; }
437 
438     // Get a bit vector of TopoSigs present in this register class.
439     const BitVector &getTopoSigs() const { return TopoSigs; }
440 
441     // Populate a unique sorted list of units from a register set.
442     void buildRegUnitSet(const CodeGenRegBank &RegBank,
443                          std::vector<unsigned> &RegUnits) const;
444 
445     CodeGenRegisterClass(CodeGenRegBank&, Record *R);
446     CodeGenRegisterClass(CodeGenRegisterClass&) = delete;
447 
448     // A key representing the parts of a register class used for forming
449     // sub-classes.  Note the ordering provided by this key is not the same as
450     // the topological order used for the EnumValues.
451     struct Key {
452       const CodeGenRegister::Vec *Members;
453       RegSizeInfoByHwMode RSI;
454 
455       Key(const CodeGenRegister::Vec *M, const RegSizeInfoByHwMode &I)
456         : Members(M), RSI(I) {}
457 
458       Key(const CodeGenRegisterClass &RC)
459         : Members(&RC.getMembers()), RSI(RC.RSI) {}
460 
461       // Lexicographical order of (Members, RegSizeInfoByHwMode).
462       bool operator<(const Key&) const;
463     };
464 
465     // Create a non-user defined register class.
466     CodeGenRegisterClass(CodeGenRegBank&, StringRef Name, Key Props);
467 
468     // Called by CodeGenRegBank::CodeGenRegBank().
469     static void computeSubClasses(CodeGenRegBank&);
470   };
471 
472   // Register units are used to model interference and register pressure.
473   // Every register is assigned one or more register units such that two
474   // registers overlap if and only if they have a register unit in common.
475   //
476   // Normally, one register unit is created per leaf register. Non-leaf
477   // registers inherit the units of their sub-registers.
478   struct RegUnit {
479     // Weight assigned to this RegUnit for estimating register pressure.
480     // This is useful when equalizing weights in register classes with mixed
481     // register topologies.
482     unsigned Weight;
483 
484     // Each native RegUnit corresponds to one or two root registers. The full
485     // set of registers containing this unit can be computed as the union of
486     // these two registers and their super-registers.
487     const CodeGenRegister *Roots[2];
488 
489     // Index into RegClassUnitSets where we can find the list of UnitSets that
490     // contain this unit.
491     unsigned RegClassUnitSetsIdx;
492     // A register unit is artificial if at least one of its roots is
493     // artificial.
494     bool Artificial;
495 
496     RegUnit() : Weight(0), RegClassUnitSetsIdx(0), Artificial(false) {
497       Roots[0] = Roots[1] = nullptr;
498     }
499 
500     ArrayRef<const CodeGenRegister*> getRoots() const {
501       assert(!(Roots[1] && !Roots[0]) && "Invalid roots array");
502       return makeArrayRef(Roots, !!Roots[0] + !!Roots[1]);
503     }
504   };
505 
506   // Each RegUnitSet is a sorted vector with a name.
507   struct RegUnitSet {
508     typedef std::vector<unsigned>::const_iterator iterator;
509 
510     std::string Name;
511     std::vector<unsigned> Units;
512     unsigned Weight = 0; // Cache the sum of all unit weights.
513     unsigned Order = 0;  // Cache the sort key.
514 
515     RegUnitSet() = default;
516   };
517 
518   // Base vector for identifying TopoSigs. The contents uniquely identify a
519   // TopoSig, only computeSuperRegs needs to know how.
520   typedef SmallVector<unsigned, 16> TopoSigId;
521 
522   // CodeGenRegBank - Represent a target's registers and the relations between
523   // them.
524   class CodeGenRegBank {
525     SetTheory Sets;
526 
527     const CodeGenHwModes &CGH;
528 
529     std::deque<CodeGenSubRegIndex> SubRegIndices;
530     DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
531 
532     CodeGenSubRegIndex *createSubRegIndex(StringRef Name, StringRef NameSpace);
533 
534     typedef std::map<SmallVector<CodeGenSubRegIndex*, 8>,
535                      CodeGenSubRegIndex*> ConcatIdxMap;
536     ConcatIdxMap ConcatIdx;
537 
538     // Registers.
539     std::deque<CodeGenRegister> Registers;
540     StringMap<CodeGenRegister*> RegistersByName;
541     DenseMap<Record*, CodeGenRegister*> Def2Reg;
542     unsigned NumNativeRegUnits;
543 
544     std::map<TopoSigId, unsigned> TopoSigs;
545 
546     // Includes native (0..NumNativeRegUnits-1) and adopted register units.
547     SmallVector<RegUnit, 8> RegUnits;
548 
549     // Register classes.
550     std::list<CodeGenRegisterClass> RegClasses;
551     DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
552     typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap;
553     RCKeyMap Key2RC;
554 
555     // Remember each unique set of register units. Initially, this contains a
556     // unique set for each register class. Simliar sets are coalesced with
557     // pruneUnitSets and new supersets are inferred during computeRegUnitSets.
558     std::vector<RegUnitSet> RegUnitSets;
559 
560     // Map RegisterClass index to the index of the RegUnitSet that contains the
561     // class's units and any inferred RegUnit supersets.
562     //
563     // NOTE: This could grow beyond the number of register classes when we map
564     // register units to lists of unit sets. If the list of unit sets does not
565     // already exist for a register class, we create a new entry in this vector.
566     std::vector<std::vector<unsigned>> RegClassUnitSets;
567 
568     // Give each register unit set an order based on sorting criteria.
569     std::vector<unsigned> RegUnitSetOrder;
570 
571     // Keep track of synthesized definitions generated in TupleExpander.
572     std::vector<std::unique_ptr<Record>> SynthDefs;
573 
574     // Add RC to *2RC maps.
575     void addToMaps(CodeGenRegisterClass*);
576 
577     // Create a synthetic sub-class if it is missing.
578     CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC,
579                                               const CodeGenRegister::Vec *Membs,
580                                               StringRef Name);
581 
582     // Infer missing register classes.
583     void computeInferredRegisterClasses();
584     void inferCommonSubClass(CodeGenRegisterClass *RC);
585     void inferSubClassWithSubReg(CodeGenRegisterClass *RC);
586 
587     void inferMatchingSuperRegClass(CodeGenRegisterClass *RC) {
588       inferMatchingSuperRegClass(RC, RegClasses.begin());
589     }
590 
591     void inferMatchingSuperRegClass(
592         CodeGenRegisterClass *RC,
593         std::list<CodeGenRegisterClass>::iterator FirstSubRegRC);
594 
595     // Iteratively prune unit sets.
596     void pruneUnitSets();
597 
598     // Compute a weight for each register unit created during getSubRegs.
599     void computeRegUnitWeights();
600 
601     // Create a RegUnitSet for each RegClass and infer superclasses.
602     void computeRegUnitSets();
603 
604     // Populate the Composite map from sub-register relationships.
605     void computeComposites();
606 
607     // Compute a lane mask for each sub-register index.
608     void computeSubRegLaneMasks();
609 
610     /// Computes a lane mask for each register unit enumerated by a physical
611     /// register.
612     void computeRegUnitLaneMasks();
613 
614   public:
615     CodeGenRegBank(RecordKeeper&, const CodeGenHwModes&);
616     CodeGenRegBank(CodeGenRegBank&) = delete;
617 
618     SetTheory &getSets() { return Sets; }
619 
620     const CodeGenHwModes &getHwModes() const { return CGH; }
621 
622     // Sub-register indices. The first NumNamedIndices are defined by the user
623     // in the .td files. The rest are synthesized such that all sub-registers
624     // have a unique name.
625     const std::deque<CodeGenSubRegIndex> &getSubRegIndices() const {
626       return SubRegIndices;
627     }
628 
629     // Find a SubRegIndex from its Record def or add to the list if it does
630     // not exist there yet.
631     CodeGenSubRegIndex *getSubRegIdx(Record*);
632 
633     // Find a SubRegIndex from its Record def.
634     const CodeGenSubRegIndex *findSubRegIdx(const Record* Def) const;
635 
636     // Find or create a sub-register index representing the A+B composition.
637     CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A,
638                                                 CodeGenSubRegIndex *B);
639 
640     // Find or create a sub-register index representing the concatenation of
641     // non-overlapping sibling indices.
642     CodeGenSubRegIndex *
643       getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex *, 8>&);
644 
645     const std::deque<CodeGenRegister> &getRegisters() const {
646       return Registers;
647     }
648 
649     const StringMap<CodeGenRegister *> &getRegistersByName() const {
650       return RegistersByName;
651     }
652 
653     // Find a register from its Record def.
654     CodeGenRegister *getReg(Record*);
655 
656     // Get a Register's index into the Registers array.
657     unsigned getRegIndex(const CodeGenRegister *Reg) const {
658       return Reg->EnumValue - 1;
659     }
660 
661     // Return the number of allocated TopoSigs. The first TopoSig representing
662     // leaf registers is allocated number 0.
663     unsigned getNumTopoSigs() const {
664       return TopoSigs.size();
665     }
666 
667     // Find or create a TopoSig for the given TopoSigId.
668     // This function is only for use by CodeGenRegister::computeSuperRegs().
669     // Others should simply use Reg->getTopoSig().
670     unsigned getTopoSig(const TopoSigId &Id) {
671       return TopoSigs.insert(std::make_pair(Id, TopoSigs.size())).first->second;
672     }
673 
674     // Create a native register unit that is associated with one or two root
675     // registers.
676     unsigned newRegUnit(CodeGenRegister *R0, CodeGenRegister *R1 = nullptr) {
677       RegUnits.resize(RegUnits.size() + 1);
678       RegUnit &RU = RegUnits.back();
679       RU.Roots[0] = R0;
680       RU.Roots[1] = R1;
681       RU.Artificial = R0->Artificial;
682       if (R1)
683         RU.Artificial |= R1->Artificial;
684       return RegUnits.size() - 1;
685     }
686 
687     // Create a new non-native register unit that can be adopted by a register
688     // to increase its pressure. Note that NumNativeRegUnits is not increased.
689     unsigned newRegUnit(unsigned Weight) {
690       RegUnits.resize(RegUnits.size() + 1);
691       RegUnits.back().Weight = Weight;
692       return RegUnits.size() - 1;
693     }
694 
695     // Native units are the singular unit of a leaf register. Register aliasing
696     // is completely characterized by native units. Adopted units exist to give
697     // register additional weight but don't affect aliasing.
698     bool isNativeUnit(unsigned RUID) const {
699       return RUID < NumNativeRegUnits;
700     }
701 
702     unsigned getNumNativeRegUnits() const {
703       return NumNativeRegUnits;
704     }
705 
706     RegUnit &getRegUnit(unsigned RUID) { return RegUnits[RUID]; }
707     const RegUnit &getRegUnit(unsigned RUID) const { return RegUnits[RUID]; }
708 
709     std::list<CodeGenRegisterClass> &getRegClasses() { return RegClasses; }
710 
711     const std::list<CodeGenRegisterClass> &getRegClasses() const {
712       return RegClasses;
713     }
714 
715     // Find a register class from its def.
716     CodeGenRegisterClass *getRegClass(Record*);
717 
718     /// getRegisterClassForRegister - Find the register class that contains the
719     /// specified physical register.  If the register is not in a register
720     /// class, return null. If the register is in multiple classes, and the
721     /// classes have a superset-subset relationship and the same set of types,
722     /// return the superclass.  Otherwise return null.
723     const CodeGenRegisterClass* getRegClassForRegister(Record *R);
724 
725     // Analog of TargetRegisterInfo::getMinimalPhysRegClass. Unlike
726     // getRegClassForRegister, this tries to find the smallest class containing
727     // the physical register. If \p VT is specified, it will only find classes
728     // with a matching type
729     const CodeGenRegisterClass *
730     getMinimalPhysRegClass(Record *RegRecord, ValueTypeByHwMode *VT = nullptr);
731 
732     // Get the sum of unit weights.
733     unsigned getRegUnitSetWeight(const std::vector<unsigned> &Units) const {
734       unsigned Weight = 0;
735       for (std::vector<unsigned>::const_iterator
736              I = Units.begin(), E = Units.end(); I != E; ++I)
737         Weight += getRegUnit(*I).Weight;
738       return Weight;
739     }
740 
741     unsigned getRegSetIDAt(unsigned Order) const {
742       return RegUnitSetOrder[Order];
743     }
744 
745     const RegUnitSet &getRegSetAt(unsigned Order) const {
746       return RegUnitSets[RegUnitSetOrder[Order]];
747     }
748 
749     // Increase a RegUnitWeight.
750     void increaseRegUnitWeight(unsigned RUID, unsigned Inc) {
751       getRegUnit(RUID).Weight += Inc;
752     }
753 
754     // Get the number of register pressure dimensions.
755     unsigned getNumRegPressureSets() const { return RegUnitSets.size(); }
756 
757     // Get a set of register unit IDs for a given dimension of pressure.
758     const RegUnitSet &getRegPressureSet(unsigned Idx) const {
759       return RegUnitSets[Idx];
760     }
761 
762     // The number of pressure set lists may be larget than the number of
763     // register classes if some register units appeared in a list of sets that
764     // did not correspond to an existing register class.
765     unsigned getNumRegClassPressureSetLists() const {
766       return RegClassUnitSets.size();
767     }
768 
769     // Get a list of pressure set IDs for a register class. Liveness of a
770     // register in this class impacts each pressure set in this list by the
771     // weight of the register. An exact solution requires all registers in a
772     // class to have the same class, but it is not strictly guaranteed.
773     ArrayRef<unsigned> getRCPressureSetIDs(unsigned RCIdx) const {
774       return RegClassUnitSets[RCIdx];
775     }
776 
777     // Computed derived records such as missing sub-register indices.
778     void computeDerivedInfo();
779 
780     // Compute the set of registers completely covered by the registers in Regs.
781     // The returned BitVector will have a bit set for each register in Regs,
782     // all sub-registers, and all super-registers that are covered by the
783     // registers in Regs.
784     //
785     // This is used to compute the mask of call-preserved registers from a list
786     // of callee-saves.
787     BitVector computeCoveredRegisters(ArrayRef<Record*> Regs);
788 
789     // Bit mask of lanes that cover their registers. A sub-register index whose
790     // LaneMask is contained in CoveringLanes will be completely covered by
791     // another sub-register with the same or larger lane mask.
792     LaneBitmask CoveringLanes;
793 
794     // Helper function for printing debug information. Handles artificial
795     // (non-native) reg units.
796     void printRegUnitName(unsigned Unit) const;
797   };
798 
799 } // end namespace llvm
800 
801 #endif // LLVM_UTILS_TABLEGEN_CODEGENREGISTERS_H
802