public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Martin Sebor <msebor@gmail.com>
To: Richard Biener <rguenther@suse.de>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Remove more stray returns and gcc_unreachable ()s
Date: Tue, 30 Nov 2021 16:08:13 -0700	[thread overview]
Message-ID: <1bf1901e-43b0-8aba-f2b3-8671b98751e2@gmail.com> (raw)
In-Reply-To: <46pr48os-7po3-rsq6-qs93-n0rsnrr4638@fhfr.qr>

On 11/30/21 12:51 AM, Richard Biener wrote:
> On Mon, 29 Nov 2021, Martin Sebor wrote:
> 
>> On 11/29/21 11:53 AM, Martin Sebor wrote:
>>> On 11/29/21 6:09 AM, Richard Biener via Gcc-patches wrote:
>>>> This removes more cases that appear when bootstrap with
>>>> -Wunreachable-code-return progresses.
>>>>
>>> ...
>>>> diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h
>>>> index 8ee0529d5a8..18e03c4cb96 100644
>>>> --- a/gcc/sel-sched-ir.h
>>>> +++ b/gcc/sel-sched-ir.h
>>>> @@ -1493,8 +1493,6 @@ bb_next_bb (basic_block bb)
>>>>        default:
>>>>          return bb->next_bb;
>>>>        }
>>>> -
>>>> -  gcc_unreachable ();
>>>>    }
>>>
>>> Just skiming the changes out of curiosity, this one makes me
>>> wonder if the warning shouldn't be taught to avoid triggering
>>> on calls to __builtin_unreachable().  They can help make code
>>> more readable (e.g., after a case and switch statement that
>>> handles all values).
>>
>> I see someone else raised the same question in a patch I hadn't
>> gotten to yet:
>>
>> https://gcc.gnu.org/pipermail/gcc-patches/2021-November/585431.html
>>
>> If you do end up removing the gcc_unreachable() calls, I would
>> suggest to replace them with a comment so as not to lose
>> the readability benefit.
>>
>> But I still wonder if it might make sense to teach the warning
>> not just about __builtin_unreachable() but also about noreturn
>> calls like abort() that (as you explained in the thread above)
>> gcc_unreachable() expands to.  Is there a benefit to warning
>> on such calls?
> 
> I'm not sure.  I've chosen to eliminate only the "obvious"
> cases, like above where there's a default: that returns immediately
> visible (not always in the patch context).  I've left some in
> the code base where that's not so obvious.
> 
> IMHO making the flow obvious without a unreachable marker is
> superior to obfuscating it and clearing that up with one.
> 
> Yes, I thought about not diagnosing things like
> 
>     return 1;
>     return 1;
> 
> but then what about
> 
>     return 1;
>     return 0;
> 
> ?  I've seen cases like
> 
>     gcc_unreachable ();
>     return 0;
> 
> was that meant to be
> 
>     return 0;
>     gcc_unreachable ();
> 
> ?  So it's not entirely clear.  I think that if there was a way
> to denote definitive 'code should not reach here' function
> (a new attribute?) then it would make sense to not warn about
> control flow not reaching that.  But then it would make sense
> to warn about stmts following such annotation.

How would such an attribute be different from
__builtin_unreachable?  (By the way, there is or was a proposal
before WG14 to add an annotation like it:
   http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2816.pdf
If I recall, a function was preferred by more in a discussion
of the proposal than an attribute.)

I agree the cases above are not entirely clear but it occurs to
me that it's possible to discern at least two broad categories
of cases: 1) a statement made unreachable by a prior one with
the same effect where swapping the two wouldn't change anything
(the double return 1; above), and 2) an unreachable statement
(or a series of statements) with a different effect than
the prior one (the last three above).

The set in (1) are completely innocuous and removing them might
considered just a matter of cleanup.  Those in (2) are less
clear cut and more likely to harbor bugs and so when adopting
the warning in a code base like Binutils with lots of instances
of both kinds I'd expect to focus on (2) first and worry about
(1) later.

Even within (2) there might be separable subsets, like a return
statement followed by a break in a switch (common in Binutils
and I think you also cleaned up some in GCC).  In at least some
of these the return is hidden in a macro so the break after it
might serve as a visual clue that the case isn't meant to fall
through.  This subset would be different from two apparently
contradictory return statements each with a different value,
or from a return followed by more than one statement.  It might
make sense to treat these two classes separately (e.g., add
a level for them).

But these are just ideas for heuristics based on my limited
insight, and YMMV.  It's just food for thought.

Martin

> 
> Richard.
> 


  reply	other threads:[~2021-11-30 23:08 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-29 13:09 Richard Biener
2021-11-29 18:53 ` Martin Sebor
2021-11-29 19:04   ` Martin Sebor
2021-11-30  7:51     ` Richard Biener
2021-11-30 23:08       ` Martin Sebor [this message]
2021-12-01  8:05         ` Richard Biener

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=1bf1901e-43b0-8aba-f2b3-8671b98751e2@gmail.com \
    --to=msebor@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=rguenther@suse.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).