In PowerPC, the AtomicCmpXchgInst is lowered to ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS. However, this node does not handle the weak attribute of AtomicCmpXchgInst. As a result, when compiling C++ atomic_compare_exchange_weak_explicit, the generated assembly includes a "reservation lost" loop — i.e., it branches back and retries if the stwcx. (store-conditional) fails. This differs from GCC’s codegen, which does not include that loop for weak compare-exchange. Since PowerPC uses LL/SC-style atomic instructions, the patch enables AtomicExpandImpl::expandAtomicCmpXchg for PowerPC. With this, the weak attribute is properly respected, and the "reservation lost" loop is removed for weak operations. --------- Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
25 lines
971 B
LLVM
25 lines
971 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=powerpc64le-linux-gnu < %s | FileCheck %s -check-prefix=PPC64LE
|
|
|
|
define void @test(ptr %ptr, i8 %cmp, i8 %val) {
|
|
; PPC64LE-LABEL: test:
|
|
; PPC64LE: # %bb.0:
|
|
; PPC64LE-NEXT: clrlwi 5, 5, 24
|
|
; PPC64LE-NEXT: clrlwi 4, 4, 24
|
|
; PPC64LE-NEXT: .p2align 5
|
|
; PPC64LE-NEXT: .LBB0_1: # %cmpxchg.start
|
|
; PPC64LE-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; PPC64LE-NEXT: lbarx 6, 0, 3
|
|
; PPC64LE-NEXT: clrlwi 6, 6, 24
|
|
; PPC64LE-NEXT: cmplw 6, 4
|
|
; PPC64LE-NEXT: bnelr 0
|
|
; PPC64LE-NEXT: # %bb.2:
|
|
; PPC64LE-NEXT: # in Loop: Header=BB0_1 Depth=1
|
|
; PPC64LE-NEXT: stbcx. 5, 0, 3
|
|
; PPC64LE-NEXT: bne 0, .LBB0_1
|
|
; PPC64LE-NEXT: # %bb.3:
|
|
; PPC64LE-NEXT: blr
|
|
%res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
|
|
ret void
|
|
}
|