https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105162
Bug ID: 105162
Summary: [AArch64] outline-atomics drops dmb ish barrier on
__sync builtins
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: spop at gcc dot gnu.org
Target Milestone: ---
With -mno-outline-atomics gcc produces a `dmb ish` barrier on __sync builtins
as required by the Intel specification
(see fix for https://gcc.gnu.org/PR65697
https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=f70fb3b635f9618c6d2ee3848ba836914f7951c2
https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ab876106eb689947cdd8203f8ecc6e8ac38bf5ba
)
$ cat a.c
int foo(int a)
{
return __sync_bool_compare_and_swap(&a, 4, 5);
}
$ gcc -O2 a.c -S -o- -mno-outline-atomics
foo:
sub sp, sp, #16
mov w1, 5
str w0, [sp, 12]
add x0, sp, 12
.L4:
ldxr w2, [x0]
cmp w2, 4
bne .L5
stlxr w3, w1, [x0]
cbnz w3, .L4
.L5:
dmb ish
cset w0, eq
add sp, sp, 16
ret
With -moutline-atomics gcc does not generate the barrier:
$ gcc -O2 a.c -S -o- -moutline-atomics
foo:
stp x29, x30, [sp, -32]!
mov w1, 5
mov x29, sp
add x2, sp, 28
str w0, [sp, 28]
mov w0, 4
bl __aarch64_cas4_acq_rel
cmp w0, 4
cset w0, eq
ldp x29, x30, [sp], 32
ret
Happens on gcc-8, 9, 10, 11, and trunk.