From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from xry111.site (xry111.site [89.208.246.23]) by sourceware.org (Postfix) with ESMTPS id F33923858D28; Tue, 16 Jan 2024 10:12:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F33923858D28 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=xry111.site Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=xry111.site ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F33923858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=89.208.246.23 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705399936; cv=none; b=QV9S8GoWRrp0a/jJe3Iwtu6wkr5JXxZ67m/0v3DVMMxujkWMUy8UDhyWi6DVD2chwxjaCLBeS0irqHFV388ADYPLP/CJGmQwww1gjWyHZvrzxMUU2kenxrifF73n+NgiSmEJksdS5Um3obNZO/HNqeeVVW4jlxvLwK/7+RvMx3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705399936; c=relaxed/simple; bh=9FgP4yyqfB5JxP2lyklCMzPSAvj9OjibWa1RmNd3B4c=; h=DKIM-Signature:Message-ID:Subject:From:To:Date:MIME-Version; b=xEUycLEnIUEHIn4u9/QTiZjgDQCX02U8arUek75s/juEtYLAXFkZs0VRaVPo1jPBf0cuINaztMWkg1bui+iyFv8BCY3YlzZSNLa4/DYmv9DPnVINiOGfns0LhQ4YuA8VcaCAXMMyeGMPuTJcepzZ0BHq02x7voqXQ2ScJRliweg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1705399933; bh=9FgP4yyqfB5JxP2lyklCMzPSAvj9OjibWa1RmNd3B4c=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=ObFRXJgVUqtwJ3FLdj6b3XlwUJs8p3hVFMys/YTMhFikHaRVwNIG9gENuhKFDT0VF 0lMRpnI9H+MKiWcs2sz3DXsJbn/YcSU/dB15nCRqznN9+XLH5eR2hGcvQjJ4DTdZkM 9EMiGvp2a9ayqm3Ny/4eOA27Zoi9FIUvSlNfQ/1s= Received: from [127.0.0.1] (unknown [IPv6:2001:470:683e::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 12E6066A0C; Tue, 16 Jan 2024 05:12:11 -0500 (EST) Message-ID: <9f2bdd3a973d98199bb5b322baa575ab2fba8a58.camel@xry111.site> Subject: Re: [PATCH] libstdc++: atomic: Add missing clear_padding in __atomic_float constructor From: Xi Ruoyao To: xndcn , "H.J. Lu" Cc: GCC Patches , Jakub Jelinek , libstdc++@gcc.gnu.org Date: Tue, 16 Jan 2024 18:12:10 +0800 In-Reply-To: References: Autocrypt: addr=xry111@xry111.site; prefer-encrypt=mutual; keydata=mDMEYnkdPhYJKwYBBAHaRw8BAQdAsY+HvJs3EVKpwIu2gN89cQT/pnrbQtlvd6Yfq7egugi0HlhpIFJ1b3lhbyA8eHJ5MTExQHhyeTExMS5zaXRlPoiTBBMWCgA7FiEEkdD1djAfkk197dzorKrSDhnnEOMFAmJ5HT4CGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQrKrSDhnnEOPHFgD8D9vUToTd1MF5bng9uPJq5y3DfpcxDp+LD3joA3U2TmwA/jZtN9xLH7CGDHeClKZK/ZYELotWfJsqRcthOIGjsdAPuDgEYnkdPhIKKwYBBAGXVQEFAQEHQG+HnNiPZseiBkzYBHwq/nN638o0NPwgYwH70wlKMZhRAwEIB4h4BBgWCgAgFiEEkdD1djAfkk197dzorKrSDhnnEOMFAmJ5HT4CGwwACgkQrKrSDhnnEOPjXgD/euD64cxwqDIqckUaisT3VCst11RcnO5iRHm6meNIwj0BALLmWplyi7beKrOlqKfuZtCLbiAPywGfCNg8LOTt4iMD Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.50.3 MIME-Version: 1.0 X-Spam-Status: No, score=-7.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,LIKELY_SPAM_FROM,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Tue, 2024-01-16 at 17:53 +0800, xndcn wrote: > Thanks, so I add a test: atomic_float/compare_exchange_padding.cc, > which will fail due to timeout without the patch. Please resend in plain text instead of HTML. Sending in HTML causes the patch mangled. And libstdc++ patches should CC libstdc++@gcc.gnu.org, in addition to gcc-patches@gcc.gnu.org. > --- > libstdc++-v3/ChangeLog: >=20 > =C2=A0* include/bits/atomic_base.h: add __builtin_clear_padding in __atom= ic_float constructor. > =C2=A0* testsuite/lib/dg-options.exp: enable libatomic for IA32 and X86-6= 4. > =C2=A0* testsuite/29_atomics/atomic_float/compare_exchange_padding.cc: Ne= w test. > --- > =C2=A0libstdc++-v3/include/bits/atomic_base.h | 7 ++- > =C2=A0.../atomic_float/compare_exchange_padding.cc | 50 ++++++++++++++++= +++ > =C2=A0libstdc++-v3/testsuite/lib/dg-options.exp | 1 + > =C2=A03 files changed, 57 insertions(+), 1 deletion(-) > =C2=A0create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic_float/c= ompare_exchange_padding.cc >=20 > diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/inclu= de/bits/atomic_base.h > index d3a2c4f3805..cbe3749e17f 100644 > --- a/libstdc++-v3/include/bits/atomic_base.h > +++ b/libstdc++-v3/include/bits/atomic_base.h > @@ -1283,7 +1283,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > =C2=A0 > =C2=A0 =C2=A0 =C2=A0 =C2=A0constexpr > =C2=A0 =C2=A0 =C2=A0 =C2=A0__atomic_float(_Fp __t) : _M_fp(__t) > - { } > + { > +#if __cplusplus >=3D 201402L && __has_builtin(__builtin_clear_padding) > + if _GLIBCXX17_CONSTEXPR (__atomic_impl::__maybe_has_padding<_Fp>()) > + __builtin_clear_padding(std::__addressof(_M_fp)); > +#endif > + } > =C2=A0 > =C2=A0 =C2=A0 =C2=A0 =C2=A0__atomic_float(const __atomic_float&) =3D dele= te; > =C2=A0 =C2=A0 =C2=A0 =C2=A0__atomic_float& operator=3D(const __atomic_flo= at&) =3D delete; > diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_float/compare_excha= nge_padding.cc b/libstdc++-v3/testsuite/29_atomics/atomic_float/compare_exc= hange_padding.cc > new file mode 100644 > index 00000000000..9376ab22850 > --- /dev/null > +++ b/libstdc++-v3/testsuite/29_atomics/atomic_float/compare_exchange_pad= ding.cc > @@ -0,0 +1,50 @@ > +// { dg-do run { target c++20 } } > +// { dg-options "-O0" } > +// { dg-timeout 10 } > +// { dg-additional-options "-mlong-double-80" { target x86_64-*-* } } > +// { dg-do run { target { ia32 || x86_64-*-* } } } > +// { dg-add-options libatomic } > + > +#include > +#include > + > +template > +void __attribute__((noinline,noipa)) > +fill_padding(T& f) > +{ > + T mask; > + __builtin_memset(&mask, 0xff, sizeof(T)); > + __builtin_clear_padding(&mask); > + unsigned char* ptr_f =3D (unsigned char*)&f; > + unsigned char* ptr_mask =3D (unsigned char*)&mask; > + for (int i =3D 0; i < sizeof(T); i++) > + { > + if (ptr_mask[i] =3D=3D 0x00) > + { > + ptr_f[i] =3D 0xff; > + } > + } > +} > + > +void > +test01() > +{ > + long double f =3D 0.5f; // long double may contains padding on X86 > + fill_padding(f); > + std::atomic as{ f }; // padding cleared on constructor > + long double t =3D 1.5; > + > + as.fetch_add(t); > + long double s =3D f + t; > + t =3D as.load(); > + VERIFY(s =3D=3D t); // padding ignored on float comparing > + fill_padding(s); > + VERIFY(as.compare_exchange_weak(s, f)); // padding cleared on cmpexchg > + fill_padding(f); > + VERIFY(as.compare_exchange_strong(f, t)); // padding cleared on cmpexc= hg > +} > + > +int main() > +{ > + test01(); > +} > diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/tes= tsuite/lib/dg-options.exp > index bc387d17ed7..d9a19dadd7f 100644 > --- a/libstdc++-v3/testsuite/lib/dg-options.exp > +++ b/libstdc++-v3/testsuite/lib/dg-options.exp > @@ -337,6 +337,7 @@ proc add_options_for_libatomic { flags } { > =C2=A0 =C2=A0|| ([istarget powerpc*-*-*] && [check_effective_target_ilp32= ]) > =C2=A0 =C2=A0|| [istarget riscv*-*-*] > =C2=A0 =C2=A0|| ([istarget sparc*-*-linux-gnu] && [check_effective_target= _ilp32]) > + || ([istarget i?86-*-*] || [istarget x86_64-*-*]) This seems too overkill as "dg-add-options libatomic" is not intended to handle 16-byte atomics. Maybe we can fork this to a new dg-add-options like "add_options_for_libatomic_16b"? > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } { > =C2=A0 global TOOL_OPTIONS > =C2=A0 > --=C2=A0 > 2.25.1 --=20 Xi Ruoyao School of Aerospace Science and Technology, Xidian University