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