From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 7B9333852C40; Fri, 18 Nov 2022 07:05:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7B9333852C40 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668755121; bh=zD1hmn2R/qtDaDhxTRauSPcCifG1DVVJRztNfrXR/XU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=R4G6nllMOtrWa3D6Sab2OAR41d4qX1ZhFZ63vqq1xUoZTRNMZm8hISBFJ26mcr4lm mvi815Pdda3V5C60hS17rH+PVEG9j1bKgFCXrJ5OV1YaJ6QhcYd+a6vgWwLp7WcL4e pWcLxZMZt0NzdbjB4hdEV8WVq3+NAEp2wRPZinII= 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: Fri, 18 Nov 2022 07:05:20 +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 #5 from CVS Commits --- The master branch has been updated by LuluCheng : https://gcc.gnu.org/g:f0024bfb228f94e60e06dc32a4983e40a9b90be5 commit r13-4136-gf0024bfb228f94e60e06dc32a4983e40a9b90be5 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.=