[Bug target/86693] inefficient atomic_fetch_xor
nruslan_devel at yahoo dot com
gcc-bugzilla@gcc.gnu.org
Sat Jul 28 14:09:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86693
--- Comment #2 from Ruslan Nikolaev <nruslan_devel at yahoo dot com> ---
Also may be (partially) related the following cases:
1.
#include <stdatomic.h>
#include <stdbool.h>
void func2();
void func(_Atomic(unsigned long) * obj, void * obj2)
{
if (atomic_fetch_sub(obj, 1) == 1 && obj2)
func2();
}
generates 'xadd' when 'sub' suffices:
func:
.LFB0:
.cfi_startproc
movq $-1, %rax
lock xaddq %rax, (%rdi)
testq %rsi, %rsi
je .L1
cmpq $1, %rax
je .L10
.L1:
rep ret
.p2align 4,,10
.p2align 3
.L10:
xorl %eax, %eax
jmp func2@PLT
2.
#include <stdatomic.h>
int func(_Atomic(unsigned long) * obj, unsigned long a)
{
return atomic_fetch_add(obj, a) == -a;
}
generates 'xadd' when 'add' suffices:
func:
.LFB0:
.cfi_startproc
movq %rsi, %rax
lock xaddq %rax, (%rdi)
addq %rsi, %rax
sete %al
movzbl %al, %eax
ret
More information about the Gcc-bugs
mailing list