From: Richard Biener <richard.guenther@gmail.com>
To: Sebastian Huber <sebastian.huber@embedded-brains.de>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] gcov: Fix -fprofile-update=atomic
Date: Fri, 16 Dec 2022 10:47:01 +0100 [thread overview]
Message-ID: <CAFiYyc0-1mgZr8Ne078HuiLbdAo1E1nTgNngKRhNSeFvTZNMJA@mail.gmail.com> (raw)
In-Reply-To: <2d6f0cf1-f979-b3a6-6daa-81fc0882a1d7@embedded-brains.de>
On Thu, Dec 15, 2022 at 9:34 AM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> On 13/12/2022 15:30, Richard Biener wrote:
> > On Fri, Dec 9, 2022 at 2:56 PM Sebastian Huber
> > <sebastian.huber@embedded-brains.de> wrote:
> >> The code coverage support uses counters to determine which edges in the control
> >> flow graph were executed. If a counter overflows, then the code coverage
> >> information is invalid. Therefore the counter type should be a 64-bit integer.
> >> In multithreaded applications, it is important that the counter increments are
> >> atomic. This is not the case by default. The user can enable atomic counter
> >> increments through the -fprofile-update=atomic and
> >> -fprofile-update=prefer-atomic options.
> >>
> >> If the hardware supports 64-bit atomic operations, then everything is fine. If
> >> not and -fprofile-update=prefer-atomic was chosen by the user, then non-atomic
> >> counter increments will be used. However, if the hardware does not support the
> >> required atomic operations and -fprofile-atomic=update was chosen by the user,
> >> then a warning was issued and as a forced fall-back to non-atomic operations
> >> was done. This is probably not what a user wants. There is still hardware on
> >> the market which does not have atomic operations and is used for multithreaded
> >> applications. A user which selects -fprofile-update=atomic wants consistent
> >> code coverage data and not random data.
> >>
> >> This patch removes the fall-back to non-atomic operations for
> >> -fprofile-update=atomic. If atomic operations in hardware are not available,
> >> then a library call to libatomic is emitted. To mitigate potential performance
> >> issues an optimization for systems which only support 32-bit atomic operations
> >> is provided. Here, the edge counter increments are done like this:
> >>
> >> low = __atomic_add_fetch_4 (&counter.low, 1, MEMMODEL_RELAXED);
> >> high_inc = low == 0 ? 1 : 0;
> >> __atomic_add_fetch_4 (&counter.high, high_inc, MEMMODEL_RELAXED);
> > You check for compare_and_swapsi and the old code checks
> > TYPE_PRECISION (gcov_type_node) > 32 to determine whether 8 byte or 4 byte
> > gcov_type is used. But you do not seem to handle the case where
> > neither SImode nor DImode atomic operations are available? Can we instead
> > do
> >
> > if (gcov_type_size == 4)
> > can_support_atomic4
> > = HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi;
> > else if (gcov_type_size == 8)
> > can_support_atomic8
> > = HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi;
> >
> > if (flag_profile_update == PROFILE_UPDATE_ATOMIC
> > && !can_support_atomic4 && !can_support_atomic8)
> > {
> > warning (0, "target does not support atomic profile update, "
> > "single mode is selected");
> > flag_profile_update = PROFILE_UPDATE_SINGLE;
> > }
> >
> > thus retain the diagnostic & fallback for this case?
>
> No, if you select -fprofile-update=atomic, then the updates shall be
> atomic from my point of view. If a fallback is acceptable, then you can
> use -fprofile-update=prefer-atomic. Using the fallback in
> -fprofile-update=atomic is a bug which prevents the use of gcov for
> multi-threaded applications on the lower end targets which do not have
> atomic operations in hardware.
Ah, OK. So the fallback there is libatomic calls as well then? Note
not all targets support libatomic, for those the failure mode is likely
a link error (which might be fine, but we eventually might want to
amend documentation to indicate this failure mode).
> > The existing
> > code also suggests
> > there might be targets with HImode or TImode counters?
>
> Sorry, I don't know.
can you conditionalize the split_atomic_increment init on
gcov_type_size == 8 please?
The patch is missing adjusments to the -fprofile-update documentation.
I think the prefer-atomic vs. atomic needs more explanation with this
change.
otherwise the patch looks OK to me.
Thanks,
Richard.
> >
> > In another mail you mentioned that for gen_time_profiler this doesn't
> > work but its
> > code relies on flag_profile_update as well. So do we need to split the flag
> > somehow, or continue using the PROFILE_UPDATE_SINGLE fallback when
> > we are doing more than just edge profiling?
>
> If atomic operations are not available in hardware, then with this patch
> calls to libatomic are emitted. In gen_time_profiler() this is not an
> issue at all, since the atomic increment is only done if counters[0] ==
> 0 (if I read the code correctly).
>
> For example for
>
> void f(void) {}
>
> we get on riscv:
>
> gcc --coverage -O2 -S -o - test.c -fprofile-update=atomic
>
> lui a4,%hi(__gcov0.f)
> li a3,1
> addi a4,a4,%lo(__gcov0.f)
> amoadd.w a5,a3,0(a4)
> lui a4,%hi(__gcov0.f+4)
> addi a5,a5,1
> seqz a5,a5
> addi a4,a4,%lo(__gcov0.f+4)
> amoadd.w zero,a5,0(a4)
> ret
>
> gcc --coverage -O2 -S -o - test.c -fprofile-update=atomic -mbig-endian
>
> lui a4,%hi(__gcov0.f+4)
> li a3,1
> addi a4,a4,%lo(__gcov0.f+4)
> amoadd.w a5,a3,0(a4)
> lui a4,%hi(__gcov0.f)
> addi a5,a5,1
> seqz a5,a5
> addi a4,a4,%lo(__gcov0.f)
> amoadd.w zero,a5,0(a4)
> ret
>
> gcc --coverage -O2 -S -o - test.c -fprofile-update=atomic -march=rv64g
> -mabi=lp64
>
> lui a5,%hi(__gcov0.f)
> li a4,1
> addi a5,a5,%lo(__gcov0.f)
> amoadd.d zero,a4,0(a5)
> ret
>
> gcc --coverage -O2 -S -o - test.c -fprofile-update=atomic -march=rv32id
>
> lui a0,%hi(__gcov0.f)
> li a3,0
> li a1,1
> li a2,0
> addi a0,a0,%lo(__gcov0.f)
> tail __atomic_fetch_add_8
>
> gcc --coverage -O2 -S -o - test.c -fprofile-update=prefer-atomic
> -march=rv32id
>
> lui a4,%hi(__gcov0.f)
> lw a5,%lo(__gcov0.f)(a4)
> lw a2,%lo(__gcov0.f+4)(a4)
> addi a3,a5,1
> sltu a5,a3,a5
> add a5,a5,a2
> sw a3,%lo(__gcov0.f)(a4)
> sw a5,%lo(__gcov0.f+4)(a4)
> ret
>
> --
> embedded brains GmbH
> Herr Sebastian HUBER
> Dornierstr. 4
> 82178 Puchheim
> Germany
> email: sebastian.huber@embedded-brains.de
> phone: +49-89-18 94 741 - 16
> fax: +49-89-18 94 741 - 08
>
> Registergericht: Amtsgericht München
> Registernummer: HRB 157899
> Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
> Unsere Datenschutzerklärung finden Sie hier:
> https://embedded-brains.de/datenschutzerklaerung/
next prev parent reply other threads:[~2022-12-16 9:47 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-09 13:56 Sebastian Huber
2022-12-13 14:30 ` Richard Biener
2022-12-15 8:34 ` Sebastian Huber
2022-12-16 9:47 ` Richard Biener [this message]
2022-12-16 10:39 ` Sebastian Huber
2022-12-16 12:09 ` Richard Biener
2022-12-16 13:01 ` Sebastian Huber
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=CAFiYyc0-1mgZr8Ne078HuiLbdAo1E1nTgNngKRhNSeFvTZNMJA@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=sebastian.huber@embedded-brains.de \
/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).