summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Sanders <daniel_l_sanders@apple.com>2019-08-02 19:37:17 +0000
committerDaniel Sanders <daniel_l_sanders@apple.com>2019-08-02 19:37:17 +0000
commitfae0a60a9cac5731d66a52aefa9f24da85b442c7 (patch)
tree6ec8cb130fe578a1435158756c8651444d7c260d
parent68264558f9998c5d72dcb7b4bc7d784d77a923ea (diff)
downloadbcm5719-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.h4
-rw-r--r--llvm/include/llvm/MC/MCRegister.h21
-rw-r--r--llvm/include/llvm/MC/MCRegisterInfo.h10
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);
}
OpenPOWER on IntegriCloud