diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-09 13:38:25 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-09 13:38:25 +0000 |
commit | e473dc937f59a9fefe450725ca4774a5245826a2 (patch) | |
tree | 851a062dab112e3d397ff8372a7b0b713ee1c38b /llvm/lib/Target/Mips/MipsRegisterInfo.cpp | |
parent | 769eb0d5d57a37a3668c6fffef1bb61f8ee76635 (diff) | |
download | bcm5719-llvm-e473dc937f59a9fefe450725ca4774a5245826a2.tar.gz bcm5719-llvm-e473dc937f59a9fefe450725ca4774a5245826a2.zip |
[mips][micromips] Make getPointerRegClass() result depend on the instruction.
Summary:
Previously, it returned the GPR16MMRegClass for all instructions which was
incorrect for instructions like lwsp/lwgp and unnecesarily restricted the
permitted registers for instructions like lw32.
This fixes quite a few of the -verify-machineinstrs errors reported in PR27458.
I've only added -verify-machineinstrs to one test in this change since I
understand there is a plan to enable the verifier by default.
Reviewers: hvarga, zbuljan, zoran.jovanovic, sdardis
Subscribers: dsanders, llvm-commits, sdardis
Differential Revision: http://reviews.llvm.org/D19873
llvm-svn: 268918
Diffstat (limited to 'llvm/lib/Target/Mips/MipsRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsRegisterInfo.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/Target/Mips/MipsRegisterInfo.cpp b/llvm/lib/Target/Mips/MipsRegisterInfo.cpp index 452400e5684..6981dd91cb8 100644 --- a/llvm/lib/Target/Mips/MipsRegisterInfo.cpp +++ b/llvm/lib/Target/Mips/MipsRegisterInfo.cpp @@ -50,13 +50,19 @@ const TargetRegisterClass * MipsRegisterInfo::getPointerRegClass(const MachineFunction &MF, unsigned Kind) const { MipsABIInfo ABI = MF.getSubtarget<MipsSubtarget>().getABI(); - bool inMicroMips = MF.getSubtarget<MipsSubtarget>().inMicroMipsMode(); - - return ABI.ArePtrs64bit() ? - inMicroMips ? - &Mips::GPRMM16_64RegClass : &Mips::GPR64RegClass - : inMicroMips ? - &Mips::GPRMM16RegClass : &Mips::GPR32RegClass; + MipsPtrClass PtrClassKind = static_cast<MipsPtrClass>(Kind); + + switch (PtrClassKind) { + case MipsPtrClass::Default: + return ABI.ArePtrs64bit() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass; + case MipsPtrClass::GPR16MM: + return ABI.ArePtrs64bit() ? &Mips::GPRMM16_64RegClass + : &Mips::GPRMM16RegClass; + case MipsPtrClass::StackPointer: + return ABI.ArePtrs64bit() ? &Mips::SP64RegClass : &Mips::SP32RegClass; + case MipsPtrClass::GlobalPointer: + return ABI.ArePtrs64bit() ? &Mips::GP64RegClass : &Mips::GP32RegClass; + } } unsigned |