diff options
author | Cameron Zwarich <zwarich@apple.com> | 2011-05-18 02:20:07 +0000 |
---|---|---|
committer | Cameron Zwarich <zwarich@apple.com> | 2011-05-18 02:20:07 +0000 |
commit | d7c55fe2ef9557d3fb0fe083ed8453b90b5f4e0d (patch) | |
tree | 28299ca518e23965a923bfd4c6d626bbe3c94ef2 /llvm/lib | |
parent | cd482e359e464a05b411d634d1172d8701da4b40 (diff) | |
download | bcm5719-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.cpp | 13 |
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!"); |