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