diff options
-rw-r--r-- | include/llvm/Target/TargetRegisterInfo.h | 6 | ||||
-rw-r--r-- | lib/Target/TargetRegisterInfo.cpp | 10 |
2 files changed, 13 insertions, 3 deletions
diff --git a/include/llvm/Target/TargetRegisterInfo.h b/include/llvm/Target/TargetRegisterInfo.h index 2deede2..68460b3 100644 --- a/include/llvm/Target/TargetRegisterInfo.h +++ b/include/llvm/Target/TargetRegisterInfo.h @@ -21,6 +21,7 @@ #include "llvm/CodeGen/ValueTypes.h" #include <cassert> #include <functional> +#include <set> namespace llvm { @@ -285,6 +286,7 @@ private: regclass_iterator RegClassBegin, RegClassEnd; // List of regclasses int CallFrameSetupOpcode, CallFrameDestroyOpcode; + std::set<std::pair<unsigned, unsigned> > Subregs; protected: TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR, regclass_iterator RegClassBegin, @@ -419,9 +421,7 @@ public: /// isSubRegister - Returns true if regB is a sub-register of regA. /// bool isSubRegister(unsigned regA, unsigned regB) const { - for (const unsigned *SR = getSubRegisters(regA); *SR; ++SR) - if (*SR == regB) return true; - return false; + return Subregs.count(std::make_pair(regA, regB)); } /// isSuperRegister - Returns true if regB is a super-register of regA. diff --git a/lib/Target/TargetRegisterInfo.cpp b/lib/Target/TargetRegisterInfo.cpp index 3f44a0c..e69496f 100644 --- a/lib/Target/TargetRegisterInfo.cpp +++ b/lib/Target/TargetRegisterInfo.cpp @@ -29,6 +29,16 @@ TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR, CallFrameSetupOpcode = CFSO; CallFrameDestroyOpcode = CFDO; + + for (unsigned i = 0; i < NumRegs; ++i) { + const TargetRegisterDesc* CurrReg = Desc + i; + + // Initialize the Subregs set, which stores pairs (a, b) where + // b is a subreg of a. + if (CurrReg->SubRegs) + for (const unsigned* CurrSR = CurrReg->SubRegs; *CurrSR; ++CurrSR) + Subregs.insert(std::make_pair(i, *CurrSR)); + } } TargetRegisterInfo::~TargetRegisterInfo() {} |