diff options
author | Daniel Sanders <daniel_l_sanders@apple.com> | 2019-08-02 19:37:17 +0000 |
---|---|---|
committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2019-08-02 19:37:17 +0000 |
commit | fae0a60a9cac5731d66a52aefa9f24da85b442c7 (patch) | |
tree | 6ec8cb130fe578a1435158756c8651444d7c260d | |
parent | 68264558f9998c5d72dcb7b4bc7d784d77a923ea (diff) | |
download | bcm5719-llvm-fae0a60a9cac5731d66a52aefa9f24da85b442c7.tar.gz bcm5719-llvm-fae0a60a9cac5731d66a52aefa9f24da85b442c7.zip |
Add MCRegister and use it in MCRegisterClass::contains()
Summary:
Register can cast to MCRegister and we may want to consider asserting
!isValid() || isPhysical() when expensive checks are on.
Depends on D65554
Reviewers: arsenm
Subscribers: wdng, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65599
llvm-svn: 367711
-rw-r--r-- | llvm/include/llvm/CodeGen/Register.h | 4 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCRegister.h | 21 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCRegisterInfo.h | 10 |
3 files changed, 28 insertions, 7 deletions
diff --git a/llvm/include/llvm/CodeGen/Register.h b/llvm/include/llvm/CodeGen/Register.h index 8c06150f960..b83a6264c80 100644 --- a/llvm/include/llvm/CodeGen/Register.h +++ b/llvm/include/llvm/CodeGen/Register.h @@ -105,6 +105,10 @@ public: return Reg; } + operator MCRegister() const { + return MCRegister(Reg); + } + bool isValid() const { return Reg != 0; } diff --git a/llvm/include/llvm/MC/MCRegister.h b/llvm/include/llvm/MC/MCRegister.h index 57a4f43d431..bcb9f387111 100644 --- a/llvm/include/llvm/MC/MCRegister.h +++ b/llvm/include/llvm/MC/MCRegister.h @@ -14,10 +14,12 @@ namespace llvm { /// Wrapper class representing physical registers. Should be passed by value. -/// Note that this class is not fully implemented at this time. A more complete -/// implementation will follow. class MCRegister { + unsigned Reg; + public: + MCRegister(unsigned Val = 0): Reg(Val) {} + // Register numbers can represent physical registers, virtual registers, and // sometimes stack slots. The unsigned values are divided into these ranges: // @@ -46,9 +48,22 @@ public: assert(!isStackSlot(Reg) && "Not a register! Check isStackSlot() first."); return int(Reg) > 0; } + + /// Return true if the specified register number is in the physical register + /// namespace. + bool isPhysical() const { + return isPhysicalRegister(Reg); + } + + operator unsigned() const { + return Reg; + } + + bool isValid() const { + return Reg != 0; + } }; } #endif // ifndef LLVM_MC_REGISTER_H - diff --git a/llvm/include/llvm/MC/MCRegisterInfo.h b/llvm/include/llvm/MC/MCRegisterInfo.h index 92d39c3fcfb..4db7619df61 100644 --- a/llvm/include/llvm/MC/MCRegisterInfo.h +++ b/llvm/include/llvm/MC/MCRegisterInfo.h @@ -18,6 +18,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/iterator_range.h" #include "llvm/MC/LaneBitmask.h" +#include "llvm/MC/MCRegister.h" #include <cassert> #include <cstdint> #include <utility> @@ -65,16 +66,17 @@ public: /// contains - Return true if the specified register is included in this /// register class. This does not include virtual registers. - bool contains(unsigned Reg) const { - unsigned InByte = Reg % 8; - unsigned Byte = Reg / 8; + bool contains(MCRegister Reg) const { + unsigned RegNo = unsigned(Reg); + unsigned InByte = RegNo % 8; + unsigned Byte = RegNo / 8; if (Byte >= RegSetSize) return false; return (RegSet[Byte] & (1 << InByte)) != 0; } /// contains - Return true if both registers are in this class. - bool contains(unsigned Reg1, unsigned Reg2) const { + bool contains(MCRegister Reg1, MCRegister Reg2) const { return contains(Reg1) && contains(Reg2); } |