From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 7FE633858D37; Sat, 19 Nov 2022 12:37:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7FE633858D37 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668861462; bh=CSxLAaeOuL/xZH6EdVzoA5l+HhDv7ZQBx2OI9XQyGBw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=kehfiDB5heQ+N3ohuEQWgYIH1GCBn0Uto2+DLCs07a2kcC255CyaplTO/Oo9dTMbh H/AoxJfeFi3dMZhP56A5UHlDpMZtceexlJguplCk3NBHmMswLCa7mBN3Ss3RZAtVTt z63KUJrsEhtWczOT5E8OZKxJD++MkTZ1jmCnFVfk= From: "cvs-commit at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug target/107713] Wrong implementation atomic_exchange on LoongArch Date: Sat, 19 Nov 2022 12:37:41 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: target X-Bugzilla-Version: 13.0 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: cvs-commit at gcc dot gnu.org X-Bugzilla-Status: NEW X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D107713 --- Comment #8 from CVS Commits --- The releases/gcc-12 branch has been updated by Xi Ruoyao : https://gcc.gnu.org/g:2adcbcc69a1d5d9554042f09ec35e72bf39fb56f commit r12-8918-g2adcbcc69a1d5d9554042f09ec35e72bf39fb56f Author: Jinyang He Date: Thu Nov 17 14:38:52 2022 +0800 LoongArch: Fix atomic_exchange expanding [PR107713] We used to expand atomic_exchange_n(ptr, new, mem_order) for subword ty= pes into something like: { __typeof__(*ptr) t =3D atomic_load_n(ptr, mem_order); atomic_compare_exchange_n(ptr, &t, new, true, mem_order, mem_orde= r); 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_): 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)=