summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorCameron Zwarich <zwarich@apple.com>2011-05-18 02:20:07 +0000
committerCameron Zwarich <zwarich@apple.com>2011-05-18 02:20:07 +0000
commitd7c55fe2ef9557d3fb0fe083ed8453b90b5f4e0d (patch)
tree28299ca518e23965a923bfd4c6d626bbe3c94ef2 /llvm/lib
parentcd482e359e464a05b411d634d1172d8701da4b40 (diff)
downloadbcm5719-llvm-d7c55fe2ef9557d3fb0fe083ed8453b90b5f4e0d.tar.gz
bcm5719-llvm-d7c55fe2ef9557d3fb0fe083ed8453b90b5f4e0d.zip
Fix more of PR8825 by correctly using rGPR registers when lowering atomic
compare-and-swap intrinsics. llvm-svn: 131518
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/ARM/ARMISelLowering.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 2b27a7e4e6a..e3bc3fa9b3d 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -4860,12 +4860,21 @@ ARMTargetLowering::EmitAtomicCmpSwap(MachineInstr *MI,
unsigned ptr = MI->getOperand(1).getReg();
unsigned oldval = MI->getOperand(2).getReg();
unsigned newval = MI->getOperand(3).getReg();
- unsigned scratch = BB->getParent()->getRegInfo()
- .createVirtualRegister(ARM::GPRRegisterClass);
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
DebugLoc dl = MI->getDebugLoc();
bool isThumb2 = Subtarget->isThumb2();
+ MachineRegisterInfo &MRI = BB->getParent()->getRegInfo();
+ unsigned scratch =
+ MRI.createVirtualRegister(isThumb2 ? ARM::tGPRRegisterClass
+ : ARM::GPRRegisterClass);
+
+ if (isThumb2) {
+ MRI.constrainRegClass(dest, ARM::tGPRRegisterClass);
+ MRI.constrainRegClass(oldval, ARM::tGPRRegisterClass);
+ MRI.constrainRegClass(newval, ARM::tGPRRegisterClass);
+ }
+
unsigned ldrOpc, strOpc;
switch (Size) {
default: llvm_unreachable("unsupported size for AtomicCmpSwap!");
OpenPOWER on IntegriCloud