https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68622
Bug ID: 68622
Summary: initialization of atomic objects emits unnecessary
fences
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
Gcc emits unnecessary fences for expressions involving objects of atomic types
that are not (yet) shared across threads. For example, in the two functions
below, the objects are not shared with other threads and thus the assignments
to the atomic variables do not require any fences. Such assignments are
commonplace when objects containing atomic variables are being initializing (as
in the second function).
In comparison, Clang emits no fences for the functions below.
$ cat t.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -O2 -S -Wall
-Wextra -o/dev/tty t.c
int foo (void)
{
_Atomic int i;
i = 0;
return i;
}
struct S {
_Atomic int i;
int n;
char data[];
};
extern void* malloc (__SIZE_TYPE__);
struct S* bar (int n)
{
struct S *s = malloc (sizeof *s + n);
s->i = 0;
return s;
}
.file "t.c"
.machine power8
.abiversion 2
.section ".toc","aw"
.section ".text"
.align 2
.p2align 4,,15
.globl foo
.type foo, @function
foo:
sync
li 9,0
stw 9,-16(1)
sync
lwz 3,-16(1)
cmpw 7,3,3
bne- 7,$+4
isync
extsw 3,3
blr
.long 0
.byte 0,0,0,0,0,0,0,0
.size foo,.-foo
.align 2
.p2align 4,,15
.globl bar
.type bar, @function
bar:
0: addis 2,12,.TOC.-0b@ha
addi 2,2,.TOC.-0b@l
.localentry bar,.-bar
mflr 0
addi 3,3,8
std 0,16(1)
stdu 1,-32(1)
bl malloc
nop
sync
li 10,0
addi 1,1,32
stw 10,0(3)
ld 0,16(1)
mtlr 0
blr
.long 0
.byte 0,0,0,1,128,0,0,0
.size bar,.-bar
.ident "GCC: (GNU) 6.0.0 20151125 (experimental)"
.section .note.GNU-stack,"",@progbits