https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127336
--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
Expansion is already wrong:
(insn 6 5 7 2 (set (reg:SI 105)
(mem/c:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl 0x7fc8eafd6ed8
s>) [1 s+0 S4 A32])) "pr127336.c":8:8 100 {*movsi_internal}
(nil))
(insn 7 6 10 2 (parallel [
(set (reg:SI 103 [ _9 ])
(unspec_volatile:SI [
(mem/v:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl
0x7fc8eafd6ed8 s>) [-1 S4 A32])
(const_int 0 [0])
] UNSPECV_XCHG))
(set (mem/v:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl
0x7fc8eafd6ed8 s>) [-1 S4 A32])
(plus:SI (mem/v:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl
0x7fc8eafd6ed8 s>) [-1 S4 A32])
(reg:SI 105)))
(clobber (reg:CC 17 flags))
]) "pr127336.c":8:8 11081 {atomic_fetch_addsi}
(nil))
(insn 10 7 11 2 (set (reg:SI 108)
(mem/c:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl 0x7fc8eafd6ed8
s>) [1 s+0 S4 A32])) "pr127336.c":8:8 100 {*movsi_internal}
(nil))
(insn 11 10 12 2 (parallel [
(set (reg:SI 107)
(plus:SI (reg:SI 103 [ _9 ])
(reg:SI 108)))
(clobber (reg:CC 17 flags))
]) "pr127336.c":8:8 287 {*addsi_1}
(expr_list:REG_EQUAL (plus:SI (reg:SI 103 [ _9 ])
(mem/c:SI (symbol_ref:DI ("s") [flags 0x2] <var_decl
0x7fc8eafd6ed8 s>) [1 s+0 S4 A32]))
(nil)))
where (insn 10) reads memory that was already atomically updated. It should add
(reg 103), the previous value.