]> git.ipfire.org Git - thirdparty/gcc.git/commit
LoongArch: Fix atomic_exchange expanding [PR107713]
authorJinyang He <hejinyang@loongson.cn>
Thu, 17 Nov 2022 06:38:52 +0000 (14:38 +0800)
committerXi Ruoyao <xry111@xry111.site>
Sat, 19 Nov 2022 11:22:02 +0000 (19:22 +0800)
commit2adcbcc69a1d5d9554042f09ec35e72bf39fb56f
tree0391820c2871c52909968abf421afc9e44fc82c3
parentaa66bc253a71deefe0d01e29a1f62ae3365dda6e
LoongArch: Fix atomic_exchange expanding [PR107713]

We used to expand atomic_exchange_n(ptr, new, mem_order) for subword types
into something like:

    {
      __typeof__(*ptr) t = atomic_load_n(ptr, mem_order);
      atomic_compare_exchange_n(ptr, &t, new, true, mem_order, mem_order);
      return t;
    }

It's incorrect because another thread may store a different value into *ptr
after atomic_load_n.  Then atomic_compare_exchange_n will not store into
*ptr, but atomic_exchange_n should always perform the store.

gcc/ChangeLog:

PR target/107713
* config/loongarch/sync.md
(atomic_cas_value_exchange_7_<mode>): New define_insn.
(atomic_exchange): Use atomic_cas_value_exchange_7_si instead of
atomic_cas_value_cmp_and_7_si.

gcc/testsuite/ChangeLog:

PR target/107713
* gcc.target/loongarch/pr107713-1.c: New test.
* gcc.target/loongarch/pr107713-2.c: New test.

(cherry picked from commit f0024bfb228f94e60e06dc32a4983e40a9b90be5)
gcc/config/loongarch/sync.md
gcc/testsuite/gcc.target/loongarch/pr107713-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/loongarch/pr107713-2.c [new file with mode: 0644]