diff options
| author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-09-26 00:14:02 +0000 |
|---|---|---|
| committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-09-26 00:14:02 +0000 |
| commit | e81610fabb92bb134dcd26cf1320b16eef98c9ac (patch) | |
| tree | 4f843d4c1bbf6698ee4f5fcbe4df1963cd6021a1 | |
| parent | bb62ec2cd677144ddab51afbca4f1797f3825751 (diff) | |
| download | bcm5719-llvm-e81610fabb92bb134dcd26cf1320b16eef98c9ac.tar.gz bcm5719-llvm-e81610fabb92bb134dcd26cf1320b16eef98c9ac.zip | |
[ARM] Don't generate clrex for pre-v7 targets.
Since r248294, we emit clrex, but it doesn't exist on v6.
llvm-svn: 248640
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/atomic-cmpxchg.ll | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 213bd2ecc47..8a2deb6ebbf 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -11739,6 +11739,8 @@ Value *ARMTargetLowering::emitLoadLinked(IRBuilder<> &Builder, Value *Addr, void ARMTargetLowering::emitAtomicCmpXchgNoStoreLLBalance( IRBuilder<> &Builder) const { + if (!Subtarget->hasV7Ops()) + return; Module *M = Builder.GetInsertBlock()->getParent()->getParent(); Builder.CreateCall(llvm::Intrinsic::getDeclaration(M, Intrinsic::arm_clrex)); } diff --git a/llvm/test/CodeGen/ARM/atomic-cmpxchg.ll b/llvm/test/CodeGen/ARM/atomic-cmpxchg.ll index 10db26c53e4..32cdf4174dd 100644 --- a/llvm/test/CodeGen/ARM/atomic-cmpxchg.ll +++ b/llvm/test/CodeGen/ARM/atomic-cmpxchg.ll @@ -1,6 +1,9 @@ ; RUN: llc < %s -mtriple=arm-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARM ; RUN: llc < %s -mtriple=thumb-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMB +; RUN: llc < %s -mtriple=armv6-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARMV6 +; RUN: llc < %s -mtriple=thumbv6-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMBV6 + ; RUN: llc < %s -mtriple=armv7-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARMV7 ; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMBV7 @@ -26,10 +29,38 @@ entry: ; CHECK-THUMB: movs r0, #1 ; CHECK-THUMB: movs [[R2:r[0-9]+]], #0 ; CHECK-THUMB: cmp [[R1]], {{r[0-9]+}} -; CHECK-THU<B: beq +; CHECK-THUMB: beq ; CHECK-THUMB: push {[[R2]]} ; CHECK-THUMB: pop {r0} +; CHECK-ARMV6-LABEL: test_cmpxchg_res_i8: +; CHECK-ARMV6-NEXT: .fnstart +; CHECK-ARMV6-NEXT: uxtb [[DESIRED:r[0-9]+]], r1 +; CHECK-ARMV6-NEXT: [[TRY:.LBB[0-9_]+]]: +; CHECK-ARMV6-NEXT: ldrexb [[LD:r[0-9]+]], [r0] +; CHECK-ARMV6-NEXT: mov [[RES:r[0-9]+]], #0 +; CHECK-ARMV6-NEXT: cmp [[LD]], [[DESIRED]] +; CHECK-ARMV6-NEXT: bne [[END:.LBB[0-9_]+]] +; CHECK-ARMV6-NEXT: strexb [[SUCCESS:r[0-9]+]], r2, [r0] +; CHECK-ARMV6-NEXT: mov [[RES]], #1 +; CHECK-ARMV6-NEXT: cmp [[SUCCESS]], #0 +; CHECK-ARMV6-NEXT: bne [[TRY]] +; CHECK-ARMV6-NEXT: [[END]]: +; CHECK-ARMV6-NEXT: mov r0, [[RES]] +; CHECK-ARMV6-NEXT: bx lr + +; CHECK-THUMBV6-LABEL: test_cmpxchg_res_i8: +; CHECK-THUMBV6: mov [[EXPECTED:r[0-9]+]], r1 +; CHECK-THUMBV6-NEXT: bl __sync_val_compare_and_swap_1 +; CHECK-THUMBV6-NEXT: mov [[RES:r[0-9]+]], r0 +; CHECK-THUMBV6-NEXT: movs r0, #1 +; CHECK-THUMBV6-NEXT: movs [[ZERO:r[0-9]+]], #0 +; CHECK-THUMBV6-NEXT: cmp [[RES]], [[EXPECTED]] +; CHECK-THUMBV6-NEXT: beq [[END:.LBB[0-9_]+]] +; CHECK-THUMBV6-NEXT: mov r0, [[ZERO]] +; CHECK-THUMBV6-NEXT: [[END]]: +; CHECK-THUMBV6-NEXT: pop {{.*}}pc} + ; CHECK-ARMV7-LABEL: test_cmpxchg_res_i8: ; CHECK-ARMV7-NEXT: .fnstart ; CHECK-ARMV7-NEXT: uxtb [[DESIRED:r[0-9]+]], r1 |

