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.

Reply via email to