public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Jørgen Kvalsvik" <j@lambda.is>
To: Richard Biener <rguenther@suse.de>
Cc: gcc-patches@gcc.gnu.org, hjl.tools@gmail.com, hubicka@ucw.cz,
	ro@cebitec.uni-bielefeld.de
Subject: Re: [PATCH 0/2] Condition coverage fixes
Date: Sat, 6 Apr 2024 22:41:14 +0200	[thread overview]
Message-ID: <f4afcbf5-c5ec-4e76-ac07-0af99dc2cbb3@lambda.is> (raw)
In-Reply-To: <26d42e56-5ac8-4a36-bcaf-72a41d6ba447@lambda.is>

On 06/04/2024 13:15, Jørgen Kvalsvik wrote:
> On 06/04/2024 07:50, Richard Biener wrote:
>>
>>
>>> Am 05.04.2024 um 21:59 schrieb Jørgen Kvalsvik <j@lambda.is>:
>>>
>>> Hi,
>>>
>>> I propose these fixes for the current issues with the condition
>>> coverage.
>>>
>>> Rainer, I propose to simply delete the test with __sigsetjmp. I don't
>>> think it actually detects anything reasonable any more, I kept it around
>>> to prevent a regression. Since then I have built a lot of programs (with
>>> optimization enabled) and not really seen this problem.
>>>
>>> H.J., the problem you found with -O2 was really a problem of
>>> tree-inlining, which was actually caught earlier by Jan [1]. It probably
>>> warrants some more testing, but I could reproduce by tuning your test
>>> case to use always_inline and not -O2 and trigger the error.
>>>
>>> [1] https://gcc.gnu.org/pipermail/gcc-patches/2024-April/648785.html
>>
>> Ok
> 
> Thanks, committed.
> 
> I am wondering if the fn->cond_uids access should always be guarded (in 
> tree-profile.cc) should always be guarded. Right now there is the 
> assumption that if condition coverage is requested the will exist and be 
> populated, but as this shows there may be other circumstances where this 
> is not true.
> 
> Or perhaps there should be a gcc_assert to (reliably) detect cases where 
> the map is not constructed properly?
> 
> Thanks,
> Jørgen

I gave this some more thought, and realised I was too eager to fix the 
segfault. While trunk no longer crashes (at least on my x86_64 linux) 
the fix itself is bad. It copies the gcond -> uid mappings into the 
caller, but the stmts are deep copied into the caller, so no gcond will 
ever be a hit when we look up the condition_uids in tree-profile.cc.

I did a very quick prototype to confirm. By applying this patch:

@@ -2049,6 +2049,9 @@ copy_bb (copy_body_data *id, basic_block bb,

    copy_gsi = gsi_start_bb (copy_basic_block);

+  if (!cfun->cond_uids && id->src_cfun->cond_uids)
+     cfun->cond_uids = new hash_map <gcond*, unsigned> ();
+
    for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
      {
        gimple_seq stmts;
@@ -2076,6 +2079,12 @@ copy_bb (copy_body_data *id, basic_block bb,
           if (gimple_nop_p (stmt))
               continue;

+         if (id->src_cfun->cond_uids && is_a <gcond*> (orig_stmt))
+           {
+             unsigned *v = id->src_cfun->cond_uids->get (as_a<gcond*> 
(orig_stmt));
+             if (v) cfun->cond_uids->put (as_a <gcond*> (stmt), *v);
+           }
+


and this test program:

__attribute__((always_inline))
inline int
inlinefn (int a)
{
     if (a > 5)
     {
         printf ("a > 5\n");
         return a;
     }
     else
         printf ("a < 5, was %d\n", a);
     return a * a - 2;
}

int
mcdc027e (int a, int b)
{
     int y = inlinefn (a);
     return y + b;
}


gcov reports:

         2:   18:mcdc027e (int a, int b)
condition outcomes covered 1/2
condition  0 not covered (true)
         -:   19:{
         2:   20:    int y = inlinefn (a);
         2:   21:    return y + b;
         -:   22:}

but without the patch, gcov prints nothing.

I am not sure if this approach is even ideal. Probably the most 
problematic is the source line mapping which is all messed up. I checked 
with gcov --branch-probabilities and it too reports the callee at the 
top of the caller.

If you think it is a good strategy I can clean up the prototype and 
submit a patch. I suppose the function _totals_ should be accurate, even 
if the source mapping is a bit surprising.

What do you think? I am open to other strategies, too

Thanks,
Jørgen

> 
>>
>> Thanks,
>> Richard
>>
>>
>>> Thanks,
>>> Jørgen
>>>
>>> Jørgen Kvalsvik (2):
>>>   Remove unecessary and broken MC/DC compile test
>>>   Copy condition->expr map when inlining [PR114599]
>>>
>>> gcc/testsuite/gcc.misc-tests/gcov-19.c       | 11 ---------
>>> gcc/testsuite/gcc.misc-tests/gcov-pr114599.c | 25 ++++++++++++++++++++
>>> gcc/tree-inline.cc                           | 20 +++++++++++++++-
>>> 3 files changed, 44 insertions(+), 12 deletions(-)
>>> create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-pr114599.c
>>>
>>> -- 
>>> 2.30.2
>>>
> 


  reply	other threads:[~2024-04-06 20:41 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-05 19:58 Jørgen Kvalsvik
2024-04-05 19:58 ` [PATCH 1/2] Remove unecessary and broken MC/DC compile test Jørgen Kvalsvik
2024-04-15  8:56   ` Rainer Orth
2024-04-05 19:58 ` [PATCH 2/2] Copy condition->expr map when inlining [PR114599] Jørgen Kvalsvik
2024-04-06  5:50 ` [PATCH 0/2] Condition coverage fixes Richard Biener
2024-04-06 11:15   ` Jørgen Kvalsvik
2024-04-06 20:41     ` Jørgen Kvalsvik [this message]
2024-04-07  6:26       ` Richard Biener
2024-04-07  7:28         ` Jørgen Kvalsvik
2024-04-08  6:31 ` Sam James

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=f4afcbf5-c5ec-4e76-ac07-0af99dc2cbb3@lambda.is \
    --to=j@lambda.is \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hjl.tools@gmail.com \
    --cc=hubicka@ucw.cz \
    --cc=rguenther@suse.de \
    --cc=ro@cebitec.uni-bielefeld.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).