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 
getName()91     const std::string &getName() const { return Name; }
getNamespace()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.
compose(CodeGenSubRegIndex * Idx)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
addComposite(CodeGenSubRegIndex * A,CodeGenSubRegIndex * B)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.
getComposites()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     std::vector<int64_t> 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     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 
getSubRegsCodeGenRegister183     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.
getSubRegIndexCodeGenRegister194     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.
getSuperRegsCodeGenRegister203     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'.
getExplicitAliasesCodeGenRegister211     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).
getTopoSigCodeGenRegister220     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.
getRegUnitsCodeGenRegister234     const RegUnitList &getRegUnits() const { return RegUnits; }
235 
getRegUnitLaneMasksCodeGenRegister236     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().
getNativeRegUnitsCodeGenRegister241     RegUnitList getNativeRegUnits() const {
242       return NativeRegUnits;
243     }
244 
setRegUnitLaneMasksCodeGenRegister245     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().
adoptRegUnitCodeGenRegister255     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     /// Generate register pressure set for this register class and any class
343     /// synthesized from it.
344     bool GeneratePressureSet;
345 
346     // Return the Record that defined this class, or NULL if the class was
347     // created by TableGen.
getDef()348     Record *getDef() const { return TheDef; }
349 
getName()350     const std::string &getName() const { return Name; }
351     std::string getQualifiedName() const;
getValueTypes()352     ArrayRef<ValueTypeByHwMode> getValueTypes() const { return VTs; }
getNumValueTypes()353     unsigned getNumValueTypes() const { return VTs.size(); }
354 
hasType(const ValueTypeByHwMode & VT)355     bool hasType(const ValueTypeByHwMode &VT) const {
356       return llvm::is_contained(VTs, VT);
357     }
358 
getValueTypeNum(unsigned VTNum)359     const ValueTypeByHwMode &getValueTypeNum(unsigned VTNum) const {
360       if (VTNum < VTs.size())
361         return VTs[VTNum];
362       llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!");
363     }
364 
365     // Return true if this this class contains the register.
366     bool contains(const CodeGenRegister*) const;
367 
368     // Returns true if RC is a subclass.
369     // RC is a sub-class of this class if it is a valid replacement for any
370     // instruction operand where a register of this classis required. It must
371     // satisfy these conditions:
372     //
373     // 1. All RC registers are also in this.
374     // 2. The RC spill size must not be smaller than our spill size.
375     // 3. RC spill alignment must be compatible with ours.
376     //
hasSubClass(const CodeGenRegisterClass * RC)377     bool hasSubClass(const CodeGenRegisterClass *RC) const {
378       return SubClasses.test(RC->EnumValue);
379     }
380 
381     // getSubClassWithSubReg - Returns the largest sub-class where all
382     // registers have a SubIdx sub-register.
383     CodeGenRegisterClass *
getSubClassWithSubReg(const CodeGenSubRegIndex * SubIdx)384     getSubClassWithSubReg(const CodeGenSubRegIndex *SubIdx) const {
385       return SubClassWithSubReg.lookup(SubIdx);
386     }
387 
388     /// Find largest subclass where all registers have SubIdx subregisters in
389     /// SubRegClass and the largest subregister class that contains those
390     /// subregisters without (as far as possible) also containing additional registers.
391     ///
392     /// This can be used to find a suitable pair of classes for subregister copies.
393     /// \return std::pair<SubClass, SubRegClass> where SubClass is a SubClass is
394     /// a class where every register has SubIdx and SubRegClass is a class where
395     /// every register is covered by the SubIdx subregister of SubClass.
396     Optional<std::pair<CodeGenRegisterClass *, CodeGenRegisterClass *>>
397     getMatchingSubClassWithSubRegs(CodeGenRegBank &RegBank,
398                                    const CodeGenSubRegIndex *SubIdx) const;
399 
setSubClassWithSubReg(const CodeGenSubRegIndex * SubIdx,CodeGenRegisterClass * SubRC)400     void setSubClassWithSubReg(const CodeGenSubRegIndex *SubIdx,
401                                CodeGenRegisterClass *SubRC) {
402       SubClassWithSubReg[SubIdx] = SubRC;
403     }
404 
405     // getSuperRegClasses - Returns a bit vector of all register classes
406     // containing only SubIdx super-registers of this class.
407     void getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
408                             BitVector &Out) const;
409 
410     // addSuperRegClass - Add a class containing only SubIdx super-registers.
addSuperRegClass(CodeGenSubRegIndex * SubIdx,CodeGenRegisterClass * SuperRC)411     void addSuperRegClass(CodeGenSubRegIndex *SubIdx,
412                           CodeGenRegisterClass *SuperRC) {
413       SuperRegClasses[SubIdx].insert(SuperRC);
414     }
415 
416     // getSubClasses - Returns a constant BitVector of subclasses indexed by
417     // EnumValue.
418     // The SubClasses vector includes an entry for this class.
getSubClasses()419     const BitVector &getSubClasses() const { return SubClasses; }
420 
421     // getSuperClasses - Returns a list of super classes ordered by EnumValue.
422     // The array does not include an entry for this class.
getSuperClasses()423     ArrayRef<CodeGenRegisterClass*> getSuperClasses() const {
424       return SuperClasses;
425     }
426 
427     // Returns an ordered list of class members.
428     // The order of registers is the same as in the .td file.
429     // No = 0 is the default allocation order, No = 1 is the first alternative.
430     ArrayRef<Record*> getOrder(unsigned No = 0) const {
431         return Orders[No];
432     }
433 
434     // Return the total number of allocation orders available.
getNumOrders()435     unsigned getNumOrders() const { return Orders.size(); }
436 
437     // Get the set of registers.  This set contains the same registers as
438     // getOrder(0).
getMembers()439     const CodeGenRegister::Vec &getMembers() const { return Members; }
440 
441     // Get a bit vector of TopoSigs present in this register class.
getTopoSigs()442     const BitVector &getTopoSigs() const { return TopoSigs; }
443 
444     // Get a weight of this register class.
445     unsigned getWeight(const CodeGenRegBank&) const;
446 
447     // Populate a unique sorted list of units from a register set.
448     void buildRegUnitSet(const CodeGenRegBank &RegBank,
449                          std::vector<unsigned> &RegUnits) const;
450 
451     CodeGenRegisterClass(CodeGenRegBank&, Record *R);
452     CodeGenRegisterClass(CodeGenRegisterClass&) = delete;
453 
454     // A key representing the parts of a register class used for forming
455     // sub-classes.  Note the ordering provided by this key is not the same as
456     // the topological order used for the EnumValues.
457     struct Key {
458       const CodeGenRegister::Vec *Members;
459       RegSizeInfoByHwMode RSI;
460 
KeyKey461       Key(const CodeGenRegister::Vec *M, const RegSizeInfoByHwMode &I)
462         : Members(M), RSI(I) {}
463 
KeyKey464       Key(const CodeGenRegisterClass &RC)
465         : Members(&RC.getMembers()), RSI(RC.RSI) {}
466 
467       // Lexicographical order of (Members, RegSizeInfoByHwMode).
468       bool operator<(const Key&) const;
469     };
470 
471     // Create a non-user defined register class.
472     CodeGenRegisterClass(CodeGenRegBank&, StringRef Name, Key Props);
473 
474     // Called by CodeGenRegBank::CodeGenRegBank().
475     static void computeSubClasses(CodeGenRegBank&);
476   };
477 
478   // Register units are used to model interference and register pressure.
479   // Every register is assigned one or more register units such that two
480   // registers overlap if and only if they have a register unit in common.
481   //
482   // Normally, one register unit is created per leaf register. Non-leaf
483   // registers inherit the units of their sub-registers.
484   struct RegUnit {
485     // Weight assigned to this RegUnit for estimating register pressure.
486     // This is useful when equalizing weights in register classes with mixed
487     // register topologies.
488     unsigned Weight;
489 
490     // Each native RegUnit corresponds to one or two root registers. The full
491     // set of registers containing this unit can be computed as the union of
492     // these two registers and their super-registers.
493     const CodeGenRegister *Roots[2];
494 
495     // Index into RegClassUnitSets where we can find the list of UnitSets that
496     // contain this unit.
497     unsigned RegClassUnitSetsIdx;
498     // A register unit is artificial if at least one of its roots is
499     // artificial.
500     bool Artificial;
501 
RegUnitRegUnit502     RegUnit() : Weight(0), RegClassUnitSetsIdx(0), Artificial(false) {
503       Roots[0] = Roots[1] = nullptr;
504     }
505 
getRootsRegUnit506     ArrayRef<const CodeGenRegister*> getRoots() const {
507       assert(!(Roots[1] && !Roots[0]) && "Invalid roots array");
508       return makeArrayRef(Roots, !!Roots[0] + !!Roots[1]);
509     }
510   };
511 
512   // Each RegUnitSet is a sorted vector with a name.
513   struct RegUnitSet {
514     typedef std::vector<unsigned>::const_iterator iterator;
515 
516     std::string Name;
517     std::vector<unsigned> Units;
518     unsigned Weight = 0; // Cache the sum of all unit weights.
519     unsigned Order = 0;  // Cache the sort key.
520 
521     RegUnitSet() = default;
522   };
523 
524   // Base vector for identifying TopoSigs. The contents uniquely identify a
525   // TopoSig, only computeSuperRegs needs to know how.
526   typedef SmallVector<unsigned, 16> TopoSigId;
527 
528   // CodeGenRegBank - Represent a target's registers and the relations between
529   // them.
530   class CodeGenRegBank {
531     SetTheory Sets;
532 
533     const CodeGenHwModes &CGH;
534 
535     std::deque<CodeGenSubRegIndex> SubRegIndices;
536     DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
537 
538     CodeGenSubRegIndex *createSubRegIndex(StringRef Name, StringRef NameSpace);
539 
540     typedef std::map<SmallVector<CodeGenSubRegIndex*, 8>,
541                      CodeGenSubRegIndex*> ConcatIdxMap;
542     ConcatIdxMap ConcatIdx;
543 
544     // Registers.
545     std::deque<CodeGenRegister> Registers;
546     StringMap<CodeGenRegister*> RegistersByName;
547     DenseMap<Record*, CodeGenRegister*> Def2Reg;
548     unsigned NumNativeRegUnits;
549 
550     std::map<TopoSigId, unsigned> TopoSigs;
551 
552     // Includes native (0..NumNativeRegUnits-1) and adopted register units.
553     SmallVector<RegUnit, 8> RegUnits;
554 
555     // Register classes.
556     std::list<CodeGenRegisterClass> RegClasses;
557     DenseMap<Record*, CodeGenRegisterClass*> Def2RC;
558     typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap;
559     RCKeyMap Key2RC;
560 
561     // Remember each unique set of register units. Initially, this contains a
562     // unique set for each register class. Simliar sets are coalesced with
563     // pruneUnitSets and new supersets are inferred during computeRegUnitSets.
564     std::vector<RegUnitSet> RegUnitSets;
565 
566     // Map RegisterClass index to the index of the RegUnitSet that contains the
567     // class's units and any inferred RegUnit supersets.
568     //
569     // NOTE: This could grow beyond the number of register classes when we map
570     // register units to lists of unit sets. If the list of unit sets does not
571     // already exist for a register class, we create a new entry in this vector.
572     std::vector<std::vector<unsigned>> RegClassUnitSets;
573 
574     // Give each register unit set an order based on sorting criteria.
575     std::vector<unsigned> RegUnitSetOrder;
576 
577     // Keep track of synthesized definitions generated in TupleExpander.
578     std::vector<std::unique_ptr<Record>> SynthDefs;
579 
580     // Add RC to *2RC maps.
581     void addToMaps(CodeGenRegisterClass*);
582 
583     // Create a synthetic sub-class if it is missing.
584     CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC,
585                                               const CodeGenRegister::Vec *Membs,
586                                               StringRef Name);
587 
588     // Infer missing register classes.
589     void computeInferredRegisterClasses();
590     void inferCommonSubClass(CodeGenRegisterClass *RC);
591     void inferSubClassWithSubReg(CodeGenRegisterClass *RC);
592 
inferMatchingSuperRegClass(CodeGenRegisterClass * RC)593     void inferMatchingSuperRegClass(CodeGenRegisterClass *RC) {
594       inferMatchingSuperRegClass(RC, RegClasses.begin());
595     }
596 
597     void inferMatchingSuperRegClass(
598         CodeGenRegisterClass *RC,
599         std::list<CodeGenRegisterClass>::iterator FirstSubRegRC);
600 
601     // Iteratively prune unit sets.
602     void pruneUnitSets();
603 
604     // Compute a weight for each register unit created during getSubRegs.
605     void computeRegUnitWeights();
606 
607     // Create a RegUnitSet for each RegClass and infer superclasses.
608     void computeRegUnitSets();
609 
610     // Populate the Composite map from sub-register relationships.
611     void computeComposites();
612 
613     // Compute a lane mask for each sub-register index.
614     void computeSubRegLaneMasks();
615 
616     /// Computes a lane mask for each register unit enumerated by a physical
617     /// register.
618     void computeRegUnitLaneMasks();
619 
620   public:
621     CodeGenRegBank(RecordKeeper&, const CodeGenHwModes&);
622     CodeGenRegBank(CodeGenRegBank&) = delete;
623 
getSets()624     SetTheory &getSets() { return Sets; }
625 
getHwModes()626     const CodeGenHwModes &getHwModes() const { return CGH; }
627 
628     // Sub-register indices. The first NumNamedIndices are defined by the user
629     // in the .td files. The rest are synthesized such that all sub-registers
630     // have a unique name.
getSubRegIndices()631     const std::deque<CodeGenSubRegIndex> &getSubRegIndices() const {
632       return SubRegIndices;
633     }
634 
635     // Find a SubRegIndex from its Record def or add to the list if it does
636     // not exist there yet.
637     CodeGenSubRegIndex *getSubRegIdx(Record*);
638 
639     // Find a SubRegIndex from its Record def.
640     const CodeGenSubRegIndex *findSubRegIdx(const Record* Def) const;
641 
642     // Find or create a sub-register index representing the A+B composition.
643     CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A,
644                                                 CodeGenSubRegIndex *B);
645 
646     // Find or create a sub-register index representing the concatenation of
647     // non-overlapping sibling indices.
648     CodeGenSubRegIndex *
649       getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex *, 8>&);
650 
getRegisters()651     const std::deque<CodeGenRegister> &getRegisters() const {
652       return Registers;
653     }
654 
getRegistersByName()655     const StringMap<CodeGenRegister *> &getRegistersByName() const {
656       return RegistersByName;
657     }
658 
659     // Find a register from its Record def.
660     CodeGenRegister *getReg(Record*);
661 
662     // Get a Register's index into the Registers array.
getRegIndex(const CodeGenRegister * Reg)663     unsigned getRegIndex(const CodeGenRegister *Reg) const {
664       return Reg->EnumValue - 1;
665     }
666 
667     // Return the number of allocated TopoSigs. The first TopoSig representing
668     // leaf registers is allocated number 0.
getNumTopoSigs()669     unsigned getNumTopoSigs() const {
670       return TopoSigs.size();
671     }
672 
673     // Find or create a TopoSig for the given TopoSigId.
674     // This function is only for use by CodeGenRegister::computeSuperRegs().
675     // Others should simply use Reg->getTopoSig().
getTopoSig(const TopoSigId & Id)676     unsigned getTopoSig(const TopoSigId &Id) {
677       return TopoSigs.insert(std::make_pair(Id, TopoSigs.size())).first->second;
678     }
679 
680     // Create a native register unit that is associated with one or two root
681     // registers.
682     unsigned newRegUnit(CodeGenRegister *R0, CodeGenRegister *R1 = nullptr) {
683       RegUnits.resize(RegUnits.size() + 1);
684       RegUnit &RU = RegUnits.back();
685       RU.Roots[0] = R0;
686       RU.Roots[1] = R1;
687       RU.Artificial = R0->Artificial;
688       if (R1)
689         RU.Artificial |= R1->Artificial;
690       return RegUnits.size() - 1;
691     }
692 
693     // Create a new non-native register unit that can be adopted by a register
694     // to increase its pressure. Note that NumNativeRegUnits is not increased.
newRegUnit(unsigned Weight)695     unsigned newRegUnit(unsigned Weight) {
696       RegUnits.resize(RegUnits.size() + 1);
697       RegUnits.back().Weight = Weight;
698       return RegUnits.size() - 1;
699     }
700 
701     // Native units are the singular unit of a leaf register. Register aliasing
702     // is completely characterized by native units. Adopted units exist to give
703     // register additional weight but don't affect aliasing.
isNativeUnit(unsigned RUID)704     bool isNativeUnit(unsigned RUID) const {
705       return RUID < NumNativeRegUnits;
706     }
707 
getNumNativeRegUnits()708     unsigned getNumNativeRegUnits() const {
709       return NumNativeRegUnits;
710     }
711 
getRegUnit(unsigned RUID)712     RegUnit &getRegUnit(unsigned RUID) { return RegUnits[RUID]; }
getRegUnit(unsigned RUID)713     const RegUnit &getRegUnit(unsigned RUID) const { return RegUnits[RUID]; }
714 
getRegClasses()715     std::list<CodeGenRegisterClass> &getRegClasses() { return RegClasses; }
716 
getRegClasses()717     const std::list<CodeGenRegisterClass> &getRegClasses() const {
718       return RegClasses;
719     }
720 
721     // Find a register class from its def.
722     CodeGenRegisterClass *getRegClass(const Record *) const;
723 
724     /// getRegisterClassForRegister - Find the register class that contains the
725     /// specified physical register.  If the register is not in a register
726     /// class, return null. If the register is in multiple classes, and the
727     /// classes have a superset-subset relationship and the same set of types,
728     /// return the superclass.  Otherwise return null.
729     const CodeGenRegisterClass* getRegClassForRegister(Record *R);
730 
731     // Analog of TargetRegisterInfo::getMinimalPhysRegClass. Unlike
732     // getRegClassForRegister, this tries to find the smallest class containing
733     // the physical register. If \p VT is specified, it will only find classes
734     // with a matching type
735     const CodeGenRegisterClass *
736     getMinimalPhysRegClass(Record *RegRecord, ValueTypeByHwMode *VT = nullptr);
737 
738     // Get the sum of unit weights.
getRegUnitSetWeight(const std::vector<unsigned> & Units)739     unsigned getRegUnitSetWeight(const std::vector<unsigned> &Units) const {
740       unsigned Weight = 0;
741       for (unsigned Unit : Units)
742         Weight += getRegUnit(Unit).Weight;
743       return Weight;
744     }
745 
getRegSetIDAt(unsigned Order)746     unsigned getRegSetIDAt(unsigned Order) const {
747       return RegUnitSetOrder[Order];
748     }
749 
getRegSetAt(unsigned Order)750     const RegUnitSet &getRegSetAt(unsigned Order) const {
751       return RegUnitSets[RegUnitSetOrder[Order]];
752     }
753 
754     // Increase a RegUnitWeight.
increaseRegUnitWeight(unsigned RUID,unsigned Inc)755     void increaseRegUnitWeight(unsigned RUID, unsigned Inc) {
756       getRegUnit(RUID).Weight += Inc;
757     }
758 
759     // Get the number of register pressure dimensions.
getNumRegPressureSets()760     unsigned getNumRegPressureSets() const { return RegUnitSets.size(); }
761 
762     // Get a set of register unit IDs for a given dimension of pressure.
getRegPressureSet(unsigned Idx)763     const RegUnitSet &getRegPressureSet(unsigned Idx) const {
764       return RegUnitSets[Idx];
765     }
766 
767     // The number of pressure set lists may be larget than the number of
768     // register classes if some register units appeared in a list of sets that
769     // did not correspond to an existing register class.
getNumRegClassPressureSetLists()770     unsigned getNumRegClassPressureSetLists() const {
771       return RegClassUnitSets.size();
772     }
773 
774     // Get a list of pressure set IDs for a register class. Liveness of a
775     // register in this class impacts each pressure set in this list by the
776     // weight of the register. An exact solution requires all registers in a
777     // class to have the same class, but it is not strictly guaranteed.
getRCPressureSetIDs(unsigned RCIdx)778     ArrayRef<unsigned> getRCPressureSetIDs(unsigned RCIdx) const {
779       return RegClassUnitSets[RCIdx];
780     }
781 
782     // Computed derived records such as missing sub-register indices.
783     void computeDerivedInfo();
784 
785     // Compute the set of registers completely covered by the registers in Regs.
786     // The returned BitVector will have a bit set for each register in Regs,
787     // all sub-registers, and all super-registers that are covered by the
788     // registers in Regs.
789     //
790     // This is used to compute the mask of call-preserved registers from a list
791     // of callee-saves.
792     BitVector computeCoveredRegisters(ArrayRef<Record*> Regs);
793 
794     // Bit mask of lanes that cover their registers. A sub-register index whose
795     // LaneMask is contained in CoveringLanes will be completely covered by
796     // another sub-register with the same or larger lane mask.
797     LaneBitmask CoveringLanes;
798 
799     // Helper function for printing debug information. Handles artificial
800     // (non-native) reg units.
801     void printRegUnitName(unsigned Unit) const;
802   };
803 
804 } // end namespace llvm
805 
806 #endif // LLVM_UTILS_TABLEGEN_CODEGENREGISTERS_H
807