; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s ; fold (old & -2) != 0. define i1 @lock_and_setne_folded(ptr %p) nounwind { ; CHECK-LABEL: lock_and_setne_folded: ; CHECK: # %bb.0: ; CHECK-NEXT: lock andq $-2, (%rdi) ; CHECK-NEXT: setne %al ; CHECK-NEXT: retq %old = atomicrmw and ptr %p, i64 -2 seq_cst %r = icmp ugt i64 %old, 1 ret i1 %r } ; fold (old & -2) == 0. define i1 @lock_and_sete_folded(ptr %p) nounwind { ; CHECK-LABEL: lock_and_sete_folded: ; CHECK: # %bb.0: ; CHECK-NEXT: lock andq $-2, (%rdi) ; CHECK-NEXT: sete %al ; CHECK-NEXT: retq %old = atomicrmw and ptr %p, i64 -2 seq_cst %r = icmp ult i64 %old, 2 ret i1 %r } ; folds with C = -4. define i1 @lock_and_setne_folded_c4(ptr %p) nounwind { ; CHECK-LABEL: lock_and_setne_folded_c4: ; CHECK: # %bb.0: ; CHECK-NEXT: lock andq $-4, (%rdi) ; CHECK-NEXT: setne %al ; CHECK-NEXT: retq %old = atomicrmw and ptr %p, i64 -4 seq_cst %r = icmp ugt i64 %old, 3 ret i1 %r } ; negative test: no fold when -C is not a power of 2. define i1 @lock_and_setne_not_folded(ptr %p) nounwind { ; CHECK-LABEL: lock_and_setne_not_folded: ; CHECK: # %bb.0: ; CHECK-NEXT: movq (%rdi), %rax ; CHECK-NEXT: .p2align 4 ; CHECK-NEXT: .LBB3_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: movq %rax, %rcx ; CHECK-NEXT: andq $-3, %rcx ; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) ; CHECK-NEXT: jne .LBB3_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: cmpq $3, %rax ; CHECK-NEXT: setae %al ; CHECK-NEXT: retq %old = atomicrmw and ptr %p, i64 -3 seq_cst %r = icmp ugt i64 %old, 2 ret i1 %r }