summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Mips/MipsRegisterInfo.cpp
diff options
context:
space:
mode:
authorDaniel Sanders <daniel.sanders@imgtec.com>2016-05-09 13:38:25 +0000
committerDaniel Sanders <daniel.sanders@imgtec.com>2016-05-09 13:38:25 +0000
commite473dc937f59a9fefe450725ca4774a5245826a2 (patch)
tree851a062dab112e3d397ff8372a7b0b713ee1c38b /llvm/lib/Target/Mips/MipsRegisterInfo.cpp
parent769eb0d5d57a37a3668c6fffef1bb61f8ee76635 (diff)
downloadbcm5719-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.cpp20
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
OpenPOWER on IntegriCloud