From: Jonathan Wakely <jwakely@redhat.com>
To: Hans-Peter Nilsson <hp@axis.com>
Cc: Christophe Lyon <christophe.lyon@linaro.org>,
gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org
Subject: Re: [PATCH 1/2] testsuite: Add dg-require-atomic-exchange non-atomic code
Date: Wed, 4 Oct 2023 09:13:27 +0100 [thread overview]
Message-ID: <CACb0b4=sQXecvQbrUJB1j+BQKEkvOBKJoWJ91NwNfv8JkHwz8Q@mail.gmail.com> (raw)
In-Reply-To: <20231004025538.489F220439@pchp3.se.axis.com>
On Wed, 4 Oct 2023 at 03:56, Hans-Peter Nilsson <hp@axis.com> wrote:
>
> > From: Christophe Lyon <christophe.lyon@linaro.org>
> > Date: Tue, 3 Oct 2023 15:20:39 +0200
>
> > Maybe we need a new variant of dg-require-thread-fence ?
>
> Yes: many of the dg-require-thread-fence users need
> something stronger. Tested arm-eabi together with the next
> patch (2/2) with
> RUNTESTFLAGS=--target_board=arm-sim/-mthumb/-march=armv6s-m/-mtune=cortex-m0/-mfloat-abi=soft/-mfpu=auto\
> conformance.exp=29_atomics/\*
>
> (Incidentally, in the patch context is seen
> dg-require-atomic-builtins which is a misnomer: it should
> rather be named "dg-require-lock-atomic-builtins-free".)
dg-require-lock-free-atomic-builtins or
dg-require-atomic-builtins-lock-free, surely?
>
> Ok to commit?
>
> -- >8 --
> Some targets (armv6) support inline atomic load and store,
> i.e. dg-require-thread-fence matches, but not atomic like
> atomic exchange. This directive will replace uses of
> dg-require-thread-fence where an atomic exchange operation
> is actually used.
>
> * testsuite/lib/dg-options.exp (dg-require-atomic-exchange): New proc.
> * testsuite/lib/libstdc++.exp (check_v3_target_atomic_exchange): Ditto.
OK
> ---
> libstdc++-v3/testsuite/lib/dg-options.exp | 9 ++++++
> libstdc++-v3/testsuite/lib/libstdc++.exp | 35 +++++++++++++++++++++++
> 2 files changed, 44 insertions(+)
>
> diff --git a/libstdc++-v3/testsuite/lib/dg-options.exp b/libstdc++-v3/testsuite/lib/dg-options.exp
> index 84ad0c65330b..b13c2f244c63 100644
> --- a/libstdc++-v3/testsuite/lib/dg-options.exp
> +++ b/libstdc++-v3/testsuite/lib/dg-options.exp
> @@ -133,6 +133,15 @@ proc dg-require-thread-fence { args } {
> return
> }
>
> +proc dg-require-atomic-exchange { args } {
> + if { ![ check_v3_target_atomic_exchange ] } {
> + upvar dg-do-what dg-do-what
> + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
> + return
> + }
> + return
> +}
> +
> proc dg-require-atomic-builtins { args } {
> if { ![ check_v3_target_atomic_builtins ] } {
> upvar dg-do-what dg-do-what
> diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
> index 608056e5068e..481f81711074 100644
> --- a/libstdc++-v3/testsuite/lib/libstdc++.exp
> +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
> @@ -1221,6 +1221,41 @@ proc check_v3_target_thread_fence { } {
> }]
> }
>
> +proc check_v3_target_atomic_exchange { } {
> + return [check_v3_target_prop_cached et_atomic_exchange {
> + global cxxflags
> + global DEFAULT_CXXFLAGS
> +
> + # Set up and link a C++11 test program that depends
> + # on atomic exchange be available for "int".
> + set src atomic_exchange[pid].cc
> +
> + set f [open $src "w"]
> + puts $f "
> + int i, j, k;
> + int main() {
> + __atomic_exchange (&i, &j, &k, __ATOMIC_SEQ_CST);
> + return 0;
> + }"
> + close $f
> +
> + set cxxflags_saved $cxxflags
> + set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror -std=gnu++11"
> +
> + set lines [v3_target_compile $src /dev/null executable ""]
> + set cxxflags $cxxflags_saved
> + file delete $src
> +
> + if [string match "" $lines] {
> + # No error message, linking succeeded.
> + return 1
> + } else {
> + verbose "check_v3_target_atomic_exchange: compilation failed" 2
> + return 0
> + }
> + }]
> +}
> +
> # Return 1 if atomics_bool and atomic_int are always lock-free, 0 otherwise.
> proc check_v3_target_atomic_builtins { } {
> return [check_v3_target_prop_cached et_atomic_builtins {
> --
> 2.30.2
>
>
> >
> > Thanks,
> >
> > Christophe
> >
> >
> > Ok to commit?
> > >
> > > -- >8 --
> > > Make __atomic_test_and_set consistent with other __atomic_ and __sync_
> > > builtins: call a matching library function instead of emitting
> > > non-atomic code when the target has no direct insn support.
> > >
> > > There's special-case code handling targetm.atomic_test_and_set_trueval
> > > != 1 trying a modified maybe_emit_sync_lock_test_and_set. Previously,
> > > if that worked but its matching emit_store_flag_force returned NULL,
> > > we'd segfault later on. Now that the caller handles NULL, gcc_assert
> > > here instead.
> > >
> > > While the referenced PR:s are ARM-specific, the issue is general.
> > >
> > > PR target/107567
> > > PR target/109166
> > > * builtins.cc (expand_builtin) <case BUILT_IN_ATOMIC_TEST_AND_SET>:
> > > Handle failure from expand_builtin_atomic_test_and_set.
> > > * optabs.cc (expand_atomic_test_and_set): When all attempts fail to
> > > generate atomic code through target support, return NULL
> > > instead of emitting non-atomic code. Also, for code handling
> > > targetm.atomic_test_and_set_trueval != 1, gcc_assert result
> > > from calling emit_store_flag_force instead of returning NULL.
> > > ---
> > > gcc/builtins.cc | 5 ++++-
> > > gcc/optabs.cc | 22 +++++++---------------
> > > 2 files changed, 11 insertions(+), 16 deletions(-)
> > >
> > > diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> > > index 6e4274bb2a4e..40dfd36a3197 100644
> > > --- a/gcc/builtins.cc
> > > +++ b/gcc/builtins.cc
> > > @@ -8387,7 +8387,10 @@ expand_builtin (tree exp, rtx target, rtx
> > > subtarget, machine_mode mode,
> > > break;
> > >
> > > case BUILT_IN_ATOMIC_TEST_AND_SET:
> > > - return expand_builtin_atomic_test_and_set (exp, target);
> > > + target = expand_builtin_atomic_test_and_set (exp, target);
> > > + if (target)
> > > + return target;
> > > + break;
> > >
> > > case BUILT_IN_ATOMIC_CLEAR:
> > > return expand_builtin_atomic_clear (exp);
> > > diff --git a/gcc/optabs.cc b/gcc/optabs.cc
> > > index 8b96f23aec05..e1898da22808 100644
> > > --- a/gcc/optabs.cc
> > > +++ b/gcc/optabs.cc
> > > @@ -7080,25 +7080,17 @@ expand_atomic_test_and_set (rtx target, rtx mem,
> > > enum memmodel model)
> > > /* Recall that the legacy lock_test_and_set optab was allowed to do
> > > magic
> > > things with the value 1. Thus we try again without trueval. */
> > > if (!ret && targetm.atomic_test_and_set_trueval != 1)
> > > - ret = maybe_emit_sync_lock_test_and_set (subtarget, mem, const1_rtx,
> > > model);
> > > -
> > > - /* Failing all else, assume a single threaded environment and simply
> > > - perform the operation. */
> > > - if (!ret)
> > > {
> > > - /* If the result is ignored skip the move to target. */
> > > - if (subtarget != const0_rtx)
> > > - emit_move_insn (subtarget, mem);
> > > + ret = maybe_emit_sync_lock_test_and_set (subtarget, mem,
> > > const1_rtx, model);
> > >
> > > - emit_move_insn (mem, trueval);
> > > - ret = subtarget;
> > > + if (ret)
> > > + {
> > > + /* Rectify the not-one trueval. */
> > > + ret = emit_store_flag_force (target, NE, ret, const0_rtx, mode,
> > > 0, 1);
> > > + gcc_assert (ret);
> > > + }
> > > }
> > >
> > > - /* Recall that have to return a boolean value; rectify if trueval
> > > - is not exactly one. */
> > > - if (targetm.atomic_test_and_set_trueval != 1)
> > > - ret = emit_store_flag_force (target, NE, ret, const0_rtx, mode, 0, 1);
> > > -
> > > return ret;
> > > }
> > >
> > > --
> > > 2.30.2
> > >
> > >
> >
>
next prev parent reply other threads:[~2023-10-04 8:13 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20230926143439.B589920431@pchp3.se.axis.com>
[not found] ` <CAPS5khYXtGYLr-pqAQRy_UAsOJATted1Gs0xY4ytTWppFPVJaQ@mail.gmail.com>
2023-10-04 2:55 ` Hans-Peter Nilsson
2023-10-04 8:13 ` Jonathan Wakely [this message]
2023-10-04 3:11 ` [PATCH 2/2] testsuite: Replace many dg-require-thread-fence with dg-require-atomic-exchange Hans-Peter Nilsson
2023-10-04 8:29 ` Jonathan Wakely
2023-10-04 15:15 ` Hans-Peter Nilsson
2023-10-04 16:01 ` Jonathan Wakely
2023-10-04 17:04 ` [PATCH v2 1/2] testsuite: Add dg-require-atomic-cmpxchg-word Hans-Peter Nilsson
2023-10-12 2:21 ` Ping: " Hans-Peter Nilsson
2023-10-12 14:38 ` Christophe Lyon
2023-10-12 16:10 ` Jeff Law
2023-10-12 22:23 ` Jonathan Wakely
2024-02-07 16:31 ` Torbjorn SVENSSON
2024-02-07 16:33 ` Jonathan Wakely
2024-02-07 17:37 ` Torbjorn SVENSSON
2023-10-04 17:08 ` [PATCH v2 2/2] testsuite: Replace many dg-require-thread-fence with dg-require-atomic-cmpxchg-word Hans-Peter Nilsson
2023-10-12 2:22 ` Ping: " Hans-Peter Nilsson
2023-10-12 14:40 ` Christophe Lyon
[not found] ` <20231003151633.CADF520410@pchp3.se.axis.com>
[not found] ` <CAPS5khY5fNB+AuOJOJPT7U6SgyfnvBKc+PNE4jY9oVG7UNOTCg@mail.gmail.com>
[not found] ` <20231004004929.9F76B2042E@pchp3.se.axis.com>
2023-10-04 8:53 ` [PATCH] __atomic_test_and_set: Fall back to library, not non-atomic code Christophe Lyon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CACb0b4=sQXecvQbrUJB1j+BQKEkvOBKJoWJ91NwNfv8JkHwz8Q@mail.gmail.com' \
--to=jwakely@redhat.com \
--cc=christophe.lyon@linaro.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=hp@axis.com \
--cc=libstdc++@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).