LBARX loads a byte from memory into a register, automatically setting
the remaining bits of the register to zero. If a subsequent RLWINM
instruction is used to clear those same bits (which LBARX has already
set to zero), the RLWINM is redundant and can be eliminated.
these redundant clear instructions are introduced by 85a9f2e148.
24 lines
793 B
LLVM
24 lines
793 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: #
|
|
; PPC64LE-NEXT: lbarx 6, 0, 3
|
|
; PPC64LE-NEXT: cmplw 6, 4
|
|
; PPC64LE-NEXT: bnelr 0
|
|
; PPC64LE-NEXT: # %bb.2: # %cmpxchg.fencedstore
|
|
; PPC64LE-NEXT: #
|
|
; PPC64LE-NEXT: stbcx. 5, 0, 3
|
|
; PPC64LE-NEXT: bne 0, .LBB0_1
|
|
; PPC64LE-NEXT: # %bb.3: # %cmpxchg.end
|
|
; PPC64LE-NEXT: blr
|
|
%res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
|
|
ret void
|
|
}
|