diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-09-22 17:22:58 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-09-22 17:22:58 +0000 |
commit | 16a661561f56335ea1b0260fb33322ac92dbcf01 (patch) | |
tree | 9cba242fb5ed00d3b55d416b122eb67da9c42b16 /test/CodeGen/ARM/atomic-cmpxchg.ll | |
parent | ee629d83953a0a66d95ae3ed1cc88f2cb0e0d163 (diff) |
[ARM] Emit clrex in the expanded cmpxchg fail block.
ARM counterpart to r248291:
In the comparison failure block of a cmpxchg expansion, the initial
ldrex/ldxr will not be followed by a matching strex/stxr.
On ARM/AArch64, this unnecessarily ties up the execution monitor,
which might have a negative performance impact on some uarchs.
Instead, release the monitor in the failure block.
The clrex instruction was designed for this: use it.
Also see ARMARM v8-A B2.10.2:
"Exclusive access instructions and Shareable memory locations".
Differential Revision: http://reviews.llvm.org/D13033
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248294 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/ARM/atomic-cmpxchg.ll')
-rw-r--r-- | test/CodeGen/ARM/atomic-cmpxchg.ll | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/test/CodeGen/ARM/atomic-cmpxchg.ll b/test/CodeGen/ARM/atomic-cmpxchg.ll index 84790be6d60..10db26c53e4 100644 --- a/test/CodeGen/ARM/atomic-cmpxchg.ll +++ b/test/CodeGen/ARM/atomic-cmpxchg.ll @@ -1,8 +1,8 @@ -; RUN: llc < %s -mtriple=arm-linux-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARM -; RUN: llc < %s -mtriple=thumb-linux-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMB +; 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=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARMV7 -; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMBV7 +; 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 define zeroext i1 @test_cmpxchg_res_i8(i8* %addr, i8 %desired, i8 zeroext %new) { entry: @@ -30,24 +30,39 @@ entry: ; CHECK-THUMB: push {[[R2]]} ; CHECK-THUMB: pop {r0} -; CHECK-ARMV7-LABEL: test_cmpxchg_res_i8 -; CHECK-ARMV7: ldrexb [[R3:r[0-9]+]], [r0] -; CHECK-ARMV7: mov [[R1:r[0-9]+]], #0 -; CHECK-ARMV7: cmp [[R3]], {{r[0-9]+}} -; CHECK-ARMV7: bne -; CHECK-ARMV7: strexb [[R3]], {{r[0-9]+}}, [{{r[0-9]+}}] -; CHECK-ARMV7: mov [[R1]], #1 -; CHECK-ARMV7: cmp [[R3]], #0 -; CHECK-ARMV7: bne -; CHECK-ARMV7: mov r0, [[R1]] +; CHECK-ARMV7-LABEL: test_cmpxchg_res_i8: +; CHECK-ARMV7-NEXT: .fnstart +; CHECK-ARMV7-NEXT: uxtb [[DESIRED:r[0-9]+]], r1 +; CHECK-ARMV7-NEXT: [[TRY:.LBB[0-9_]+]]: +; CHECK-ARMV7-NEXT: ldrexb [[LD:r[0-9]+]], [r0] +; CHECK-ARMV7-NEXT: cmp [[LD]], [[DESIRED]] +; CHECK-ARMV7-NEXT: bne [[FAIL:.LBB[0-9_]+]] +; CHECK-ARMV7-NEXT: strexb [[SUCCESS:r[0-9]+]], r2, [r0] +; CHECK-ARMV7-NEXT: mov [[RES:r[0-9]+]], #1 +; CHECK-ARMV7-NEXT: cmp [[SUCCESS]], #0 +; CHECK-ARMV7-NEXT: bne [[TRY]] +; CHECK-ARMV7-NEXT: b [[END:.LBB[0-9_]+]] +; CHECK-ARMV7-NEXT: [[FAIL]]: +; CHECK-ARMV7-NEXT: clrex +; CHECK-ARMV7-NEXT: mov [[RES]], #0 +; CHECK-ARMV7-NEXT: [[END]]: +; CHECK-ARMV7-NEXT: mov r0, [[RES]] +; CHECK-ARMV7-NEXT: bx lr -; CHECK-THUMBV7-LABEL: test_cmpxchg_res_i8 -; CHECK-THUMBV7: ldrexb [[R3:r[0-9]+]], [r0] -; CHECK-THUMBV7: cmp [[R3]], {{r[0-9]+}} -; CHECK-THUMBV7: movne r0, #0 -; CHECK-THUMBV7: bxne lr -; CHECK-THUMBV7: strexb [[R3]], {{r[0-9]+}}, [{{r[0-9]+}}] -; CHECK-THUMBV7: cmp [[R3]], #0 -; CHECK-THUMBV7: itt eq -; CHECK-THUMBV7: moveq r0, #1 -; CHECK-THUMBV7: bxeq lr +; CHECK-THUMBV7-LABEL: test_cmpxchg_res_i8: +; CHECK-THUMBV7-NEXT: .fnstart +; CHECK-THUMBV7-NEXT: uxtb [[DESIRED:r[0-9]+]], r1 +; CHECK-THUMBV7-NEXT: b [[TRYLD:.LBB[0-9_]+]] +; CHECK-THUMBV7-NEXT: [[TRYST:.LBB[0-9_]+]]: +; CHECK-THUMBV7-NEXT: strexb [[SUCCESS:r[0-9]+]], r2, [r0] +; CHECK-THUMBV7-NEXT: cmp [[SUCCESS]], #0 +; CHECK-THUMBV7-NEXT: itt eq +; CHECK-THUMBV7-NEXT: moveq r0, #1 +; CHECK-THUMBV7-NEXT: bxeq lr +; CHECK-THUMBV7-NEXT: [[TRYLD]]: +; CHECK-THUMBV7-NEXT: ldrexb [[LD:r[0-9]+]], [r0] +; CHECK-THUMBV7-NEXT: cmp [[LD]], [[DESIRED]] +; CHECK-THUMBV7-NEXT: beq [[TRYST:.LBB[0-9_]+]] +; CHECK-THUMBV7-NEXT: clrex +; CHECK-THUMBV7-NEXT: movs r0, #0 +; CHECK-THUMBV7-NEXT: bx lr |