LLVM  8.0.1
RegisterBank.h
Go to the documentation of this file.
1 //==-- llvm/CodeGen/GlobalISel/RegisterBank.h - Register Bank ----*- C++ -*-==//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file This file declares the API of register banks.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_GLOBALISEL_REGBANK_H
15 #define LLVM_CODEGEN_GLOBALISEL_REGBANK_H
16 
17 #include "llvm/ADT/BitVector.h"
18 
19 namespace llvm {
20 // Forward declarations.
21 class RegisterBankInfo;
22 class raw_ostream;
23 class TargetRegisterClass;
24 class TargetRegisterInfo;
25 
26 /// This class implements the register bank concept.
27 /// Two instances of RegisterBank must have different ID.
28 /// This property is enforced by the RegisterBankInfo class.
29 class RegisterBank {
30 private:
31  unsigned ID;
32  const char *Name;
33  unsigned Size;
34  BitVector ContainedRegClasses;
35 
36  /// Sentinel value used to recognize register bank not properly
37  /// initialized yet.
38  static const unsigned InvalidID;
39 
40  /// Only the RegisterBankInfo can initialize RegisterBank properly.
41  friend RegisterBankInfo;
42 
43 public:
44  RegisterBank(unsigned ID, const char *Name, unsigned Size,
45  const uint32_t *CoveredClasses, unsigned NumRegClasses);
46 
47  /// Get the identifier of this register bank.
48  unsigned getID() const { return ID; }
49 
50  /// Get a user friendly name of this register bank.
51  /// Should be used only for debugging purposes.
52  const char *getName() const { return Name; }
53 
54  /// Get the maximal size in bits that fits in this register bank.
55  unsigned getSize() const { return Size; }
56 
57  /// Check whether this instance is ready to be used.
58  bool isValid() const;
59 
60  /// Check if this register bank is valid. In other words,
61  /// if it has been properly constructed.
62  ///
63  /// \note This method does not check anything when assertions are disabled.
64  ///
65  /// \return True is the check was successful.
66  bool verify(const TargetRegisterInfo &TRI) const;
67 
68  /// Check whether this register bank covers \p RC.
69  /// In other words, check if this register bank fully covers
70  /// the registers that \p RC contains.
71  /// \pre isValid()
72  bool covers(const TargetRegisterClass &RC) const;
73 
74  /// Check whether \p OtherRB is the same as this.
75  bool operator==(const RegisterBank &OtherRB) const;
76  bool operator!=(const RegisterBank &OtherRB) const {
77  return !this->operator==(OtherRB);
78  }
79 
80  /// Dump the register mask on dbgs() stream.
81  /// The dump is verbose.
82  void dump(const TargetRegisterInfo *TRI = nullptr) const;
83 
84  /// Print the register mask on OS.
85  /// If IsForDebug is false, then only the name of the register bank
86  /// is printed. Otherwise, all the fields are printing.
87  /// TRI is then used to print the name of the register classes that
88  /// this register bank covers.
89  void print(raw_ostream &OS, bool IsForDebug = false,
90  const TargetRegisterInfo *TRI = nullptr) const;
91 };
92 
93 inline raw_ostream &operator<<(raw_ostream &OS, const RegisterBank &RegBank) {
94  RegBank.print(OS);
95  return OS;
96 }
97 } // End namespace llvm.
98 
99 #endif
This class represents lattice values for constants.
Definition: AllocatorList.h:24
const char * getName() const
Get a user friendly name of this register bank.
Definition: RegisterBank.h:52
unsigned const TargetRegisterInfo * TRI
void print(raw_ostream &OS, bool IsForDebug=false, const TargetRegisterInfo *TRI=nullptr) const
Print the register mask on OS.
bool covers(const TargetRegisterClass &RC) const
Check whether this register bank covers RC.
Holds all the information related to register banks.
bool operator!=(const RegisterBank &OtherRB) const
Definition: RegisterBank.h:76
RegisterBank(unsigned ID, const char *Name, unsigned Size, const uint32_t *CoveredClasses, unsigned NumRegClasses)
bool operator==(const RegisterBank &OtherRB) const
Check whether OtherRB is the same as this.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
bool isValid() const
Check whether this instance is ready to be used.
void dump(const TargetRegisterInfo *TRI=nullptr) const
Dump the register mask on dbgs() stream.
This class implements the register bank concept.
Definition: RegisterBank.h:29
RegisterBankInfo(RegisterBank **RegBanks, unsigned NumRegBanks)
Create a RegisterBankInfo that can accommodate up to NumRegBanks RegisterBank instances.
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
Definition: APInt.h:2039
bool verify(const TargetRegisterInfo &TRI) const
Check if this register bank is valid.
unsigned getSize() const
Get the maximal size in bits that fits in this register bank.
Definition: RegisterBank.h:55
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
unsigned getID() const
Get the identifier of this register bank.
Definition: RegisterBank.h:48