Fix more of PR8825 by correctly using rGPR registers when lowering atomic
authorCameron Zwarich <zwarich@apple.com>
Wed, 18 May 2011 02:20:07 +0000 (02:20 +0000)
committerCameron Zwarich <zwarich@apple.com>
Wed, 18 May 2011 02:20:07 +0000 (02:20 +0000)
compare-and-swap intrinsics.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131518 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMISelLowering.cpp

index 2b27a7e4e6ab10c770c823f62e2953b485097830..e3bc3fa9b3da57d6d16edd12eeed64b83f295921 100644 (file)
@@ -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!");