LLVM 19.0.0git
MCRegisterInfo.h
Go to the documentation of this file.
1//===- MC/MCRegisterInfo.h - Target Register Description --------*- 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 describes an abstract interface used to get information about a
10// target machines register file. This information is used for a variety of
11// purposed, especially register allocation.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_MC_MCREGISTERINFO_H
16#define LLVM_MC_MCREGISTERINFO_H
17
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/iterator.h"
21#include "llvm/MC/LaneBitmask.h"
22#include "llvm/MC/MCRegister.h"
23#include <cassert>
24#include <cstdint>
25#include <iterator>
26#include <utility>
27
28namespace llvm {
29
30class MCRegUnitIterator;
31class MCSubRegIterator;
32class MCSuperRegIterator;
33
34/// MCRegisterClass - Base class of TargetRegisterClass.
36public:
37 using iterator = const MCPhysReg*;
38 using const_iterator = const MCPhysReg*;
39
41 const uint8_t *const RegSet;
45 const uint16_t ID;
47 const int8_t CopyCost;
48 const bool Allocatable;
49 const bool BaseClass;
50
51 /// getID() - Return the register class ID number.
52 ///
53 unsigned getID() const { return ID; }
54
55 /// begin/end - Return all of the registers in this class.
56 ///
57 iterator begin() const { return RegsBegin; }
58 iterator end() const { return RegsBegin + RegsSize; }
59
60 /// getNumRegs - Return the number of registers in this class.
61 ///
62 unsigned getNumRegs() const { return RegsSize; }
63
64 /// getRegister - Return the specified register in the class.
65 ///
66 unsigned getRegister(unsigned i) const {
67 assert(i < getNumRegs() && "Register number out of range!");
68 return RegsBegin[i];
69 }
70
71 /// contains - Return true if the specified register is included in this
72 /// register class. This does not include virtual registers.
73 bool contains(MCRegister Reg) const {
74 unsigned RegNo = unsigned(Reg);
75 unsigned InByte = RegNo % 8;
76 unsigned Byte = RegNo / 8;
77 if (Byte >= RegSetSize)
78 return false;
79 return (RegSet[Byte] & (1 << InByte)) != 0;
80 }
81
82 /// contains - Return true if both registers are in this class.
83 bool contains(MCRegister Reg1, MCRegister Reg2) const {
84 return contains(Reg1) && contains(Reg2);
85 }
86
87 /// Return the size of the physical register in bits if we are able to
88 /// determine it. This always returns zero for registers of targets that use
89 /// HW modes, as we need more information to determine the size of registers
90 /// in such cases. Use TargetRegisterInfo to cover them.
91 unsigned getSizeInBits() const { return RegSizeInBits; }
92
93 /// getCopyCost - Return the cost of copying a value between two registers in
94 /// this class. A negative number means the register class is very expensive
95 /// to copy e.g. status flag register classes.
96 int getCopyCost() const { return CopyCost; }
97
98 /// isAllocatable - Return true if this register class may be used to create
99 /// virtual registers.
100 bool isAllocatable() const { return Allocatable; }
101
102 /// Return true if this register class has a defined BaseClassOrder.
103 bool isBaseClass() const { return BaseClass; }
104};
105
106/// MCRegisterDesc - This record contains information about a particular
107/// register. The SubRegs field is a zero terminated array of registers that
108/// are sub-registers of the specific register, e.g. AL, AH are sub-registers
109/// of AX. The SuperRegs field is a zero terminated array of registers that are
110/// super-registers of the specific register, e.g. RAX, EAX, are
111/// super-registers of AX.
112///
114 uint32_t Name; // Printable name for the reg (for debugging)
115 uint32_t SubRegs; // Sub-register set, described above
116 uint32_t SuperRegs; // Super-register set, described above
117
118 // Offset into MCRI::SubRegIndices of a list of sub-register indices for each
119 // sub-register in SubRegs.
121
122 // Points to the list of register units. The low bits hold the first regunit
123 // number, the high bits hold an offset into DiffLists. See MCRegUnitIterator.
125
126 /// Index into list with lane mask sequences. The sequence contains a lanemask
127 /// for every register unit.
129
130 // Is true for constant registers.
132};
133
134/// MCRegisterInfo base class - We assume that the target defines a static
135/// array of MCRegisterDesc objects that represent all of the machine
136/// registers that the target has. As such, we simply have to track a pointer
137/// to this array so that we can turn register number into a register
138/// descriptor.
139///
140/// Note this class is designed to be a base class of TargetRegisterInfo, which
141/// is the interface used by codegen. However, specific targets *should never*
142/// specialize this class. MCRegisterInfo should only contain getters to access
143/// TableGen generated physical register data. It must not be extended with
144/// virtual methods.
145///
147public:
149
150 /// DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be
151 /// performed with a binary search.
153 unsigned FromReg;
154 unsigned ToReg;
155
156 bool operator<(DwarfLLVMRegPair RHS) const { return FromReg < RHS.FromReg; }
157 };
158
159private:
160 const MCRegisterDesc *Desc; // Pointer to the descriptor array
161 unsigned NumRegs; // Number of entries in the array
162 MCRegister RAReg; // Return address register
163 MCRegister PCReg; // Program counter register
164 const MCRegisterClass *Classes; // Pointer to the regclass array
165 unsigned NumClasses; // Number of entries in the array
166 unsigned NumRegUnits; // Number of regunits.
167 const MCPhysReg (*RegUnitRoots)[2]; // Pointer to regunit root table.
168 const int16_t *DiffLists; // Pointer to the difflists array
169 const LaneBitmask *RegUnitMaskSequences; // Pointer to lane mask sequences
170 // for register units.
171 const char *RegStrings; // Pointer to the string table.
172 const char *RegClassStrings; // Pointer to the class strings.
173 const uint16_t *SubRegIndices; // Pointer to the subreg lookup
174 // array.
175 unsigned NumSubRegIndices; // Number of subreg indices.
176 const uint16_t *RegEncodingTable; // Pointer to array of register
177 // encodings.
178
179 unsigned L2DwarfRegsSize;
180 unsigned EHL2DwarfRegsSize;
181 unsigned Dwarf2LRegsSize;
182 unsigned EHDwarf2LRegsSize;
183 const DwarfLLVMRegPair *L2DwarfRegs; // LLVM to Dwarf regs mapping
184 const DwarfLLVMRegPair *EHL2DwarfRegs; // LLVM to Dwarf regs mapping EH
185 const DwarfLLVMRegPair *Dwarf2LRegs; // Dwarf to LLVM regs mapping
186 const DwarfLLVMRegPair *EHDwarf2LRegs; // Dwarf to LLVM regs mapping EH
187 DenseMap<MCRegister, int> L2SEHRegs; // LLVM to SEH regs mapping
188 DenseMap<MCRegister, int> L2CVRegs; // LLVM to CV regs mapping
189
190 mutable std::vector<std::vector<MCPhysReg>> RegAliasesCache;
191 ArrayRef<MCPhysReg> getCachedAliasesOf(MCPhysReg R) const;
192
193 /// Iterator class that can traverse the differentially encoded values in
194 /// DiffLists. Don't use this class directly, use one of the adaptors below.
195 class DiffListIterator
196 : public iterator_facade_base<DiffListIterator, std::forward_iterator_tag,
197 unsigned> {
198 unsigned Val = 0;
199 const int16_t *List = nullptr;
200
201 public:
202 /// Constructs an invalid iterator, which is also the end iterator.
203 /// Call init() to point to something useful.
204 DiffListIterator() = default;
205
206 /// Point the iterator to InitVal, decoding subsequent values from DiffList.
207 void init(unsigned InitVal, const int16_t *DiffList) {
208 Val = InitVal;
209 List = DiffList;
210 }
211
212 /// Returns true if this iterator is not yet at the end.
213 bool isValid() const { return List; }
214
215 /// Dereference the iterator to get the value at the current position.
216 const unsigned &operator*() const { return Val; }
217
218 using DiffListIterator::iterator_facade_base::operator++;
219 /// Pre-increment to move to the next position.
220 DiffListIterator &operator++() {
221 assert(isValid() && "Cannot move off the end of the list.");
222 int16_t D = *List++;
223 Val += D;
224 // The end of the list is encoded as a 0 differential.
225 if (!D)
226 List = nullptr;
227 return *this;
228 }
229
230 bool operator==(const DiffListIterator &Other) const {
231 return List == Other.List;
232 }
233 };
234
235public:
236 /// Return an iterator range over all sub-registers of \p Reg, excluding \p
237 /// Reg.
238 iterator_range<MCSubRegIterator> subregs(MCRegister Reg) const;
239
240 /// Return an iterator range over all sub-registers of \p Reg, including \p
241 /// Reg.
242 iterator_range<MCSubRegIterator> subregs_inclusive(MCRegister Reg) const;
243
244 /// Return an iterator range over all super-registers of \p Reg, excluding \p
245 /// Reg.
246 iterator_range<MCSuperRegIterator> superregs(MCRegister Reg) const;
247
248 /// Return an iterator range over all super-registers of \p Reg, including \p
249 /// Reg.
250 iterator_range<MCSuperRegIterator> superregs_inclusive(MCRegister Reg) const;
251
252 /// Return an iterator range over all sub- and super-registers of \p Reg,
253 /// including \p Reg.
254 detail::concat_range<const MCPhysReg, iterator_range<MCSubRegIterator>,
255 iterator_range<MCSuperRegIterator>>
256 sub_and_superregs_inclusive(MCRegister Reg) const;
257
258 /// Returns an iterator range over all regunits for \p Reg.
259 iterator_range<MCRegUnitIterator> regunits(MCRegister Reg) const;
260
261 // These iterators are allowed to sub-class DiffListIterator and access
262 // internal list pointers.
263 friend class MCSubRegIterator;
265 friend class MCSuperRegIterator;
266 friend class MCRegUnitIterator;
269 friend class MCRegAliasIterator;
270
271 /// Initialize MCRegisterInfo, called by TableGen
272 /// auto-generated routines. *DO NOT USE*.
273 void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA,
274 unsigned PC, const MCRegisterClass *C, unsigned NC,
275 const MCPhysReg (*RURoots)[2], unsigned NRU,
276 const int16_t *DL, const LaneBitmask *RUMS,
277 const char *Strings, const char *ClassStrings,
278 const uint16_t *SubIndices, unsigned NumIndices,
279 const uint16_t *RET) {
280 Desc = D;
281 NumRegs = NR;
282 RAReg = RA;
283 PCReg = PC;
284 Classes = C;
285 DiffLists = DL;
286 RegUnitMaskSequences = RUMS;
287 RegStrings = Strings;
288 RegClassStrings = ClassStrings;
289 NumClasses = NC;
290 RegUnitRoots = RURoots;
291 NumRegUnits = NRU;
292 SubRegIndices = SubIndices;
293 NumSubRegIndices = NumIndices;
294 RegEncodingTable = RET;
295
296 // Initialize DWARF register mapping variables
297 EHL2DwarfRegs = nullptr;
298 EHL2DwarfRegsSize = 0;
299 L2DwarfRegs = nullptr;
300 L2DwarfRegsSize = 0;
301 EHDwarf2LRegs = nullptr;
302 EHDwarf2LRegsSize = 0;
303 Dwarf2LRegs = nullptr;
304 Dwarf2LRegsSize = 0;
305
306 RegAliasesCache.resize(NumRegs);
307 }
308
309 /// Used to initialize LLVM register to Dwarf
310 /// register number mapping. Called by TableGen auto-generated routines.
311 /// *DO NOT USE*.
313 bool isEH) {
314 if (isEH) {
315 EHL2DwarfRegs = Map;
316 EHL2DwarfRegsSize = Size;
317 } else {
318 L2DwarfRegs = Map;
319 L2DwarfRegsSize = Size;
320 }
321 }
322
323 /// Used to initialize Dwarf register to LLVM
324 /// register number mapping. Called by TableGen auto-generated routines.
325 /// *DO NOT USE*.
327 bool isEH) {
328 if (isEH) {
329 EHDwarf2LRegs = Map;
330 EHDwarf2LRegsSize = Size;
331 } else {
332 Dwarf2LRegs = Map;
333 Dwarf2LRegsSize = Size;
334 }
335 }
336
337 /// mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register
338 /// number mapping. By default the SEH register number is just the same
339 /// as the LLVM register number.
340 /// FIXME: TableGen these numbers. Currently this requires target specific
341 /// initialization code.
342 void mapLLVMRegToSEHReg(MCRegister LLVMReg, int SEHReg) {
343 L2SEHRegs[LLVMReg] = SEHReg;
344 }
345
346 void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg) {
347 L2CVRegs[LLVMReg] = CVReg;
348 }
349
350 /// This method should return the register where the return
351 /// address can be found.
353 return RAReg;
354 }
355
356 /// Return the register which is the program counter.
358 return PCReg;
359 }
360
362 assert(RegNo < NumRegs &&
363 "Attempting to access record for invalid register number!");
364 return Desc[RegNo];
365 }
366
367 /// Provide a get method, equivalent to [], but more useful with a
368 /// pointer to this object.
369 const MCRegisterDesc &get(MCRegister RegNo) const {
370 return operator[](RegNo);
371 }
372
373 /// Returns the physical register number of sub-register "Index"
374 /// for physical register RegNo. Return zero if the sub-register does not
375 /// exist.
376 MCRegister getSubReg(MCRegister Reg, unsigned Idx) const;
377
378 /// Return a super-register of the specified register
379 /// Reg so its sub-register of index SubIdx is Reg.
381 const MCRegisterClass *RC) const;
382
383 /// For a given register pair, return the sub-register index
384 /// if the second register is a sub-register of the first. Return zero
385 /// otherwise.
386 unsigned getSubRegIndex(MCRegister RegNo, MCRegister SubRegNo) const;
387
388 /// Return the human-readable symbolic target-specific name for the
389 /// specified physical register.
390 const char *getName(MCRegister RegNo) const {
391 return RegStrings + get(RegNo).Name;
392 }
393
394 /// Returns true if the given register is constant.
395 bool isConstant(MCRegister RegNo) const { return get(RegNo).IsConstant; }
396
397 /// Return the number of registers this target has (useful for
398 /// sizing arrays holding per register information)
399 unsigned getNumRegs() const {
400 return NumRegs;
401 }
402
403 /// Return the number of sub-register indices
404 /// understood by the target. Index 0 is reserved for the no-op sub-register,
405 /// while 1 to getNumSubRegIndices() - 1 represent real sub-registers.
406 unsigned getNumSubRegIndices() const {
407 return NumSubRegIndices;
408 }
409
410 /// Return the number of (native) register units in the
411 /// target. Register units are numbered from 0 to getNumRegUnits() - 1. They
412 /// can be accessed through MCRegUnitIterator defined below.
413 unsigned getNumRegUnits() const {
414 return NumRegUnits;
415 }
416
417 /// Map a target register to an equivalent dwarf register
418 /// number. Returns -1 if there is no equivalent value. The second
419 /// parameter allows targets to use different numberings for EH info and
420 /// debugging info.
421 int getDwarfRegNum(MCRegister RegNum, bool isEH) const;
422
423 /// Map a dwarf register back to a target register. Returns std::nullopt is
424 /// there is no mapping.
425 std::optional<unsigned> getLLVMRegNum(unsigned RegNum, bool isEH) const;
426
427 /// Map a target EH register number to an equivalent DWARF register
428 /// number.
429 int getDwarfRegNumFromDwarfEHRegNum(unsigned RegNum) const;
430
431 /// Map a target register to an equivalent SEH register
432 /// number. Returns LLVM register number if there is no equivalent value.
433 int getSEHRegNum(MCRegister RegNum) const;
434
435 /// Map a target register to an equivalent CodeView register
436 /// number.
437 int getCodeViewRegNum(MCRegister RegNum) const;
438
439 regclass_iterator regclass_begin() const { return Classes; }
440 regclass_iterator regclass_end() const { return Classes+NumClasses; }
443 }
444
445 unsigned getNumRegClasses() const {
446 return (unsigned)(regclass_end()-regclass_begin());
447 }
448
449 /// Returns the register class associated with the enumeration
450 /// value. See class MCOperandInfo.
451 const MCRegisterClass& getRegClass(unsigned i) const {
452 assert(i < getNumRegClasses() && "Register Class ID out of range");
453 return Classes[i];
454 }
455
456 const char *getRegClassName(const MCRegisterClass *Class) const {
457 return RegClassStrings + Class->NameIdx;
458 }
459
460 /// Returns the encoding for RegNo
462 assert(RegNo < NumRegs &&
463 "Attempting to get encoding for invalid register number!");
464 return RegEncodingTable[RegNo];
465 }
466
467 /// Returns true if RegB is a sub-register of RegA.
468 bool isSubRegister(MCRegister RegA, MCRegister RegB) const {
469 return isSuperRegister(RegB, RegA);
470 }
471
472 /// Returns true if RegB is a super-register of RegA.
473 bool isSuperRegister(MCRegister RegA, MCRegister RegB) const;
474
475 /// Returns true if RegB is a sub-register of RegA or if RegB == RegA.
476 bool isSubRegisterEq(MCRegister RegA, MCRegister RegB) const {
477 return isSuperRegisterEq(RegB, RegA);
478 }
479
480 /// Returns true if RegB is a super-register of RegA or if
481 /// RegB == RegA.
482 bool isSuperRegisterEq(MCRegister RegA, MCRegister RegB) const {
483 return RegA == RegB || isSuperRegister(RegA, RegB);
484 }
485
486 /// Returns true if RegB is a super-register or sub-register of RegA
487 /// or if RegB == RegA.
489 return isSubRegisterEq(RegA, RegB) || isSuperRegister(RegA, RegB);
490 }
491
492 /// Returns true if the two registers are equal or alias each other.
493 bool regsOverlap(MCRegister RegA, MCRegister RegB) const;
494};
495
496//===----------------------------------------------------------------------===//
497// Register List Iterators
498//===----------------------------------------------------------------------===//
499
500// MCRegisterInfo provides lists of super-registers, sub-registers, and
501// aliasing registers. Use these iterator classes to traverse the lists.
502
503/// MCSubRegIterator enumerates all sub-registers of Reg.
504/// If IncludeSelf is set, Reg itself is included in the list.
506 : public iterator_adaptor_base<MCSubRegIterator,
507 MCRegisterInfo::DiffListIterator,
508 std::forward_iterator_tag, const MCPhysReg> {
509 // Cache the current value, so that we can return a reference to it.
510 MCPhysReg Val;
511
512public:
513 /// Constructs an end iterator.
514 MCSubRegIterator() = default;
515
517 bool IncludeSelf = false) {
519 I.init(Reg.id(), MCRI->DiffLists + MCRI->get(Reg).SubRegs);
520 // Initially, the iterator points to Reg itself.
521 Val = MCPhysReg(*I);
522 if (!IncludeSelf)
523 ++*this;
524 }
525
526 const MCPhysReg &operator*() const { return Val; }
527
528 using iterator_adaptor_base::operator++;
530 Val = MCPhysReg(*++I);
531 return *this;
532 }
533
534 /// Returns true if this iterator is not yet at the end.
535 bool isValid() const { return I.isValid(); }
536};
537
538/// Iterator that enumerates the sub-registers of a Reg and the associated
539/// sub-register indices.
541 MCSubRegIterator SRIter;
542 const uint16_t *SRIndex;
543
544public:
545 /// Constructs an iterator that traverses subregisters and their
546 /// associated subregister indices.
548 : SRIter(Reg, MCRI) {
549 SRIndex = MCRI->SubRegIndices + MCRI->get(Reg).SubRegIndices;
550 }
551
552 /// Returns current sub-register.
554 return *SRIter;
555 }
556
557 /// Returns sub-register index of the current sub-register.
558 unsigned getSubRegIndex() const {
559 return *SRIndex;
560 }
561
562 /// Returns true if this iterator is not yet at the end.
563 bool isValid() const { return SRIter.isValid(); }
564
565 /// Moves to the next position.
567 ++SRIter;
568 ++SRIndex;
569 return *this;
570 }
571};
572
573/// MCSuperRegIterator enumerates all super-registers of Reg.
574/// If IncludeSelf is set, Reg itself is included in the list.
576 : public iterator_adaptor_base<MCSuperRegIterator,
577 MCRegisterInfo::DiffListIterator,
578 std::forward_iterator_tag, const MCPhysReg> {
579 // Cache the current value, so that we can return a reference to it.
580 MCPhysReg Val;
581
582public:
583 /// Constructs an end iterator.
585
587 bool IncludeSelf = false) {
589 I.init(Reg.id(), MCRI->DiffLists + MCRI->get(Reg).SuperRegs);
590 // Initially, the iterator points to Reg itself.
591 Val = MCPhysReg(*I);
592 if (!IncludeSelf)
593 ++*this;
594 }
595
596 const MCPhysReg &operator*() const { return Val; }
597
598 using iterator_adaptor_base::operator++;
600 Val = MCPhysReg(*++I);
601 return *this;
602 }
603
604 /// Returns true if this iterator is not yet at the end.
605 bool isValid() const { return I.isValid(); }
606};
607
608// Definition for isSuperRegister. Put it down here since it needs the
609// iterator defined above in addition to the MCRegisterInfo class itself.
611 return is_contained(superregs(RegA), RegB);
612}
613
614//===----------------------------------------------------------------------===//
615// Register Units
616//===----------------------------------------------------------------------===//
617
618// MCRegUnitIterator enumerates a list of register units for Reg. The list is
619// in ascending numerical order.
621 : public iterator_adaptor_base<MCRegUnitIterator,
622 MCRegisterInfo::DiffListIterator,
623 std::forward_iterator_tag, const MCRegUnit> {
624 // The value must be kept in sync with RegisterInfoEmitter.cpp.
625 static constexpr unsigned RegUnitBits = 12;
626 // Cache the current value, so that we can return a reference to it.
627 MCRegUnit Val;
628
629public:
630 /// Constructs an end iterator.
631 MCRegUnitIterator() = default;
632
634 assert(Reg && "Null register has no regunits");
636 // Decode the RegUnits MCRegisterDesc field.
637 unsigned RU = MCRI->get(Reg).RegUnits;
638 unsigned FirstRU = RU & ((1u << RegUnitBits) - 1);
639 unsigned Offset = RU >> RegUnitBits;
640 I.init(FirstRU, MCRI->DiffLists + Offset);
641 Val = MCRegUnit(*I);
642 }
643
644 const MCRegUnit &operator*() const { return Val; }
645
646 using iterator_adaptor_base::operator++;
648 Val = MCRegUnit(*++I);
649 return *this;
650 }
651
652 /// Returns true if this iterator is not yet at the end.
653 bool isValid() const { return I.isValid(); }
654};
655
656/// MCRegUnitMaskIterator enumerates a list of register units and their
657/// associated lane masks for Reg. The register units are in ascending
658/// numerical order.
660 MCRegUnitIterator RUIter;
661 const LaneBitmask *MaskListIter;
662
663public:
665
666 /// Constructs an iterator that traverses the register units and their
667 /// associated LaneMasks in Reg.
669 : RUIter(Reg, MCRI) {
671 MaskListIter = &MCRI->RegUnitMaskSequences[Idx];
672 }
673
674 /// Returns a (RegUnit, LaneMask) pair.
675 std::pair<unsigned,LaneBitmask> operator*() const {
676 return std::make_pair(*RUIter, *MaskListIter);
677 }
678
679 /// Returns true if this iterator is not yet at the end.
680 bool isValid() const { return RUIter.isValid(); }
681
682 /// Moves to the next position.
684 ++MaskListIter;
685 ++RUIter;
686 return *this;
687 }
688};
689
690// Each register unit has one or two root registers. The complete set of
691// registers containing a register unit is the union of the roots and their
692// super-registers. All registers aliasing Unit can be visited like this:
693//
694// for (MCRegUnitRootIterator RI(Unit, MCRI); RI.isValid(); ++RI) {
695// for (MCSuperRegIterator SI(*RI, MCRI, true); SI.isValid(); ++SI)
696// visit(*SI);
697// }
698
699/// MCRegUnitRootIterator enumerates the root registers of a register unit.
701 uint16_t Reg0 = 0;
702 uint16_t Reg1 = 0;
703
704public:
706
707 MCRegUnitRootIterator(unsigned RegUnit, const MCRegisterInfo *MCRI) {
708 assert(RegUnit < MCRI->getNumRegUnits() && "Invalid register unit");
709 Reg0 = MCRI->RegUnitRoots[RegUnit][0];
710 Reg1 = MCRI->RegUnitRoots[RegUnit][1];
711 }
712
713 /// Dereference to get the current root register.
714 unsigned operator*() const {
715 return Reg0;
716 }
717
718 /// Check if the iterator is at the end of the list.
719 bool isValid() const {
720 return Reg0;
721 }
722
723 /// Preincrement to move to the next root register.
725 assert(isValid() && "Cannot move off the end of the list.");
726 Reg0 = Reg1;
727 Reg1 = 0;
728 return *this;
729 }
730};
731
732/// MCRegAliasIterator enumerates all registers aliasing Reg.
734private:
735 const MCPhysReg *It = nullptr;
736 const MCPhysReg *End = nullptr;
737
738public:
740 bool IncludeSelf) {
741 ArrayRef<MCPhysReg> Cache = MCRI->getCachedAliasesOf(Reg);
742 assert(Cache.back() == Reg);
743 It = Cache.begin();
744 End = Cache.end();
745 if (!IncludeSelf)
746 --End;
747 }
748
749 bool isValid() const { return It != End; }
750
751 MCRegister operator*() const { return *It; }
752
754 assert(isValid() && "Cannot move off the end of the list.");
755 ++It;
756 return *this;
757 }
758};
759
760inline iterator_range<MCSubRegIterator>
762 return make_range({Reg, this, /*IncludeSelf=*/false}, MCSubRegIterator());
763}
764
767 return make_range({Reg, this, /*IncludeSelf=*/true}, MCSubRegIterator());
768}
769
772 return make_range({Reg, this, /*IncludeSelf=*/false}, MCSuperRegIterator());
773}
774
777 return make_range({Reg, this, /*IncludeSelf=*/true}, MCSuperRegIterator());
778}
779
783 return concat<const MCPhysReg>(subregs_inclusive(Reg), superregs(Reg));
784}
785
788 return make_range({Reg, this}, MCRegUnitIterator());
789}
790
791} // end namespace llvm
792
793#endif // LLVM_MC_MCREGISTERINFO_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
A common definition of LaneBitmask for use in TableGen and CodeGen.
unsigned Reg
const NodeList & List
Definition: RDFGraph.cpp:201
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SI optimize exec mask operations pre RA
Value * RHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
const T & back() const
back - Get the last element.
Definition: ArrayRef.h:174
iterator end() const
Definition: ArrayRef.h:154
iterator begin() const
Definition: ArrayRef.h:153
MCRegAliasIterator enumerates all registers aliasing Reg.
MCRegAliasIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf)
MCRegister operator*() const
MCRegAliasIterator & operator++()
const MCRegUnit & operator*() const
MCRegUnitIterator()=default
Constructs an end iterator.
bool isValid() const
Returns true if this iterator is not yet at the end.
MCRegUnitIterator & operator++()
MCRegUnitIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
MCRegUnitMaskIterator enumerates a list of register units and their associated lane masks for Reg.
MCRegUnitMaskIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
Constructs an iterator that traverses the register units and their associated LaneMasks in Reg.
MCRegUnitMaskIterator & operator++()
Moves to the next position.
bool isValid() const
Returns true if this iterator is not yet at the end.
std::pair< unsigned, LaneBitmask > operator*() const
Returns a (RegUnit, LaneMask) pair.
MCRegUnitRootIterator enumerates the root registers of a register unit.
MCRegUnitRootIterator & operator++()
Preincrement to move to the next root register.
unsigned operator*() const
Dereference to get the current root register.
MCRegUnitRootIterator(unsigned RegUnit, const MCRegisterInfo *MCRI)
bool isValid() const
Check if the iterator is at the end of the list.
MCRegisterClass - Base class of TargetRegisterClass.
const uint32_t NameIdx
unsigned getID() const
getID() - Return the register class ID number.
bool isAllocatable() const
isAllocatable - Return true if this register class may be used to create virtual registers.
const uint16_t RegSizeInBits
unsigned getSizeInBits() const
Return the size of the physical register in bits if we are able to determine it.
const uint16_t RegSetSize
bool contains(MCRegister Reg1, MCRegister Reg2) const
contains - Return true if both registers are in this class.
unsigned getNumRegs() const
getNumRegs - Return the number of registers in this class.
unsigned getRegister(unsigned i) const
getRegister - Return the specified register in the class.
iterator begin() const
begin/end - Return all of the registers in this class.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
const uint8_t *const RegSet
bool isBaseClass() const
Return true if this register class has a defined BaseClassOrder.
const iterator RegsBegin
int getCopyCost() const
getCopyCost - Return the cost of copying a value between two registers in this class.
iterator end() const
const uint16_t RegsSize
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target.
int getDwarfRegNum(MCRegister RegNum, bool isEH) const
Map a target register to an equivalent dwarf register number.
bool regsOverlap(MCRegister RegA, MCRegister RegB) const
Returns true if the two registers are equal or alias each other.
bool isSuperRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register of RegA or if RegB == RegA.
unsigned getNumRegClasses() const
MCRegister getRARegister() const
This method should return the register where the return address can be found.
MCRegister getProgramCounter() const
Return the register which is the program counter.
regclass_iterator regclass_end() const
void mapDwarfRegsToLLVMRegs(const DwarfLLVMRegPair *Map, unsigned Size, bool isEH)
Used to initialize Dwarf register to LLVM register number mapping.
unsigned getNumRegUnits() const
Return the number of (native) register units in the target.
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
int getCodeViewRegNum(MCRegister RegNum) const
Map a target register to an equivalent CodeView register number.
std::optional< unsigned > getLLVMRegNum(unsigned RegNum, bool isEH) const
Map a dwarf register back to a target register.
iterator_range< regclass_iterator > regclasses() const
regclass_iterator regclass_begin() const
const MCRegisterDesc & get(MCRegister RegNo) const
Provide a get method, equivalent to [], but more useful with a pointer to this object.
int getSEHRegNum(MCRegister RegNum) const
Map a target register to an equivalent SEH register number.
void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg)
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
const char * getName(MCRegister RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register.
void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA, unsigned PC, const MCRegisterClass *C, unsigned NC, const MCPhysReg(*RURoots)[2], unsigned NRU, const int16_t *DL, const LaneBitmask *RUMS, const char *Strings, const char *ClassStrings, const uint16_t *SubIndices, unsigned NumIndices, const uint16_t *RET)
Initialize MCRegisterInfo, called by TableGen auto-generated routines.
const char * getRegClassName(const MCRegisterClass *Class) const
friend class MCSubRegIterator
int getDwarfRegNumFromDwarfEHRegNum(unsigned RegNum) const
Map a target EH register number to an equivalent DWARF register number.
uint16_t getEncodingValue(MCRegister RegNo) const
Returns the encoding for RegNo.
iterator_range< MCSubRegIterator > subregs_inclusive(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, including Reg.
bool isSuperOrSubRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register or sub-register of RegA or if RegB == RegA.
bool isSubRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a sub-register of RegA.
friend class MCSuperRegIterator
iterator_range< MCSubRegIterator > subregs(MCRegister Reg) const
Return an iterator range over all sub-registers of Reg, excluding Reg.
bool isConstant(MCRegister RegNo) const
Returns true if the given register is constant.
unsigned getSubRegIndex(MCRegister RegNo, MCRegister SubRegNo) const
For a given register pair, return the sub-register index if the second register is a sub-register of ...
void mapLLVMRegsToDwarfRegs(const DwarfLLVMRegPair *Map, unsigned Size, bool isEH)
Used to initialize LLVM register to Dwarf register number mapping.
bool isSuperRegister(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a super-register of RegA.
iterator_range< MCRegUnitIterator > regunits(MCRegister Reg) const
Returns an iterator range over all regunits for Reg.
bool isSubRegisterEq(MCRegister RegA, MCRegister RegB) const
Returns true if RegB is a sub-register of RegA or if RegB == RegA.
friend class MCRegUnitIterator
void mapLLVMRegToSEHReg(MCRegister LLVMReg, int SEHReg)
mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register number mapping.
iterator_range< MCSuperRegIterator > superregs_inclusive(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, including Reg.
detail::concat_range< const MCPhysReg, iterator_range< MCSubRegIterator >, iterator_range< MCSuperRegIterator > > sub_and_superregs_inclusive(MCRegister Reg) const
Return an iterator range over all sub- and super-registers of Reg, including Reg.
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
const MCRegisterDesc & operator[](MCRegister RegNo) const
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Definition: MCRegister.h:67
Iterator that enumerates the sub-registers of a Reg and the associated sub-register indices.
MCSubRegIndexIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
Constructs an iterator that traverses subregisters and their associated subregister indices.
MCSubRegIndexIterator & operator++()
Moves to the next position.
bool isValid() const
Returns true if this iterator is not yet at the end.
unsigned getSubRegIndex() const
Returns sub-register index of the current sub-register.
MCRegister getSubReg() const
Returns current sub-register.
MCSubRegIterator enumerates all sub-registers of Reg.
const MCPhysReg & operator*() const
MCSubRegIterator & operator++()
bool isValid() const
Returns true if this iterator is not yet at the end.
MCSubRegIterator()=default
Constructs an end iterator.
MCSubRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf=false)
MCSuperRegIterator enumerates all super-registers of Reg.
MCSuperRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI, bool IncludeSelf=false)
MCSuperRegIterator & operator++()
const MCPhysReg & operator*() const
MCSuperRegIterator()=default
Constructs an end iterator.
bool isValid() const
Returns true if this iterator is not yet at the end.
Helper to store a sequence of ranges being concatenated and access them.
Definition: STLExtras.h:1126
CRTP base class for adapting an iterator to a different type.
Definition: iterator.h:237
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition: iterator.h:80
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
APInt operator*(APInt a, uint64_t RHS)
Definition: APInt.h:2180
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition: MCRegister.h:21
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
@ Other
Any other memory.
unsigned MCRegUnit
Register units are used to compute register aliasing.
Definition: MCRegister.h:30
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1879
#define NC
Definition: regutils.h:42
Description of the encoding of one expression Op.
MCRegisterDesc - This record contains information about a particular register.
uint16_t RegUnitLaneMasks
Index into list with lane mask sequences.
DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be performed with a binary se...
bool operator<(DwarfLLVMRegPair RHS) const