aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMircea Trofin <mtrofin@google.com>2020-10-01 14:35:11 -0700
committerMircea Trofin <mtrofin@google.com>2020-10-03 13:18:25 -0700
commit0a3523299dec61f2e6eb2a28fdecd25360e8b6d8 (patch)
tree1b6335a91d9dc10de61578c7f7c6db8d3242c415
parent508ac0ec13c1c56029fd2390a2e14c1b2ea84b73 (diff)
downloadllvm-0a3523299dec61f2e6eb2a28fdecd25360e8b6d8.zip
llvm-0a3523299dec61f2e6eb2a28fdecd25360e8b6d8.tar.gz
llvm-0a3523299dec61f2e6eb2a28fdecd25360e8b6d8.tar.bz2
[MC] Assert that MCRegUnitIterator operates over MCRegisters
The signature of the ctor expects a MCRegister, but currently any unsigned value can be converted to a MCRegister. This patch checks that indeed the provided value is a physical register only. We want to eventually stop implicitly converting unsigned or Register to MCRegister (which is incorrect). The next step after this patch is changing uses of MCRegUnitIterator to explicitly cast Register or unsigned values to MCRegister. To that end, this patch also introduces 2 APIs that make that conversion checked and explicit. Differential Revision: https://reviews.llvm.org/D88705
-rw-r--r--llvm/include/llvm/CodeGen/Register.h9
-rw-r--r--llvm/include/llvm/MC/MCRegister.h6
-rw-r--r--llvm/include/llvm/MC/MCRegisterInfo.h1
3 files changed, 16 insertions, 0 deletions
diff --git a/llvm/include/llvm/CodeGen/Register.h b/llvm/include/llvm/CodeGen/Register.h
index 884c8bc..86dde8e 100644
--- a/llvm/include/llvm/CodeGen/Register.h
+++ b/llvm/include/llvm/CodeGen/Register.h
@@ -110,6 +110,15 @@ public:
return MCRegister(Reg);
}
+ /// Utility to check-convert this value to a MCRegister. The caller is
+ /// expected to have already validated that this Register is, indeed,
+ /// physical.
+ MCRegister asMCReg() const {
+ assert(Reg == MCRegister::NoRegister ||
+ MCRegister::isPhysicalRegister(Reg));
+ return MCRegister(Reg);
+ }
+
bool isValid() const { return Reg != MCRegister::NoRegister; }
/// Comparisons between register objects
diff --git a/llvm/include/llvm/MC/MCRegister.h b/llvm/include/llvm/MC/MCRegister.h
index 5f2e31b..21ffe28 100644
--- a/llvm/include/llvm/MC/MCRegister.h
+++ b/llvm/include/llvm/MC/MCRegister.h
@@ -68,6 +68,12 @@ public:
return Reg;
}
+ /// Check the provided unsigned value is a valid MCRegister.
+ static MCRegister from(unsigned Val) {
+ assert(Val == NoRegister || isPhysicalRegister(Val));
+ return MCRegister(Val);
+ }
+
unsigned id() const {
return Reg;
}
diff --git a/llvm/include/llvm/MC/MCRegisterInfo.h b/llvm/include/llvm/MC/MCRegisterInfo.h
index 9864d95..0c1ac62 100644
--- a/llvm/include/llvm/MC/MCRegisterInfo.h
+++ b/llvm/include/llvm/MC/MCRegisterInfo.h
@@ -675,6 +675,7 @@ public:
MCRegUnitIterator(MCRegister Reg, const MCRegisterInfo *MCRI) {
assert(Reg && "Null register has no regunits");
+ assert(MCRegister::isPhysicalRegister(Reg.id()));
// Decode the RegUnits MCRegisterDesc field.
unsigned RU = MCRI->get(Reg).RegUnits;
unsigned Scale = RU & 15;