On Mon, 27 Jan 2025, Martin Jambor wrote:

> Hi,
> 
> Zhendong Su and Michal Jireš found out that our gimple DSE pass can,
> under fairly specific conditions, remove a noreturn call which then
> leaves behind a "normal" BB with no successor edges which following
> passes do not expect.  This patch simply tells the pass to leave such
> calls alone even when they otherwise appear to be dead.
> 
> Interestingly, our CFG verifier does not report this.  I'll put on my
> todo list to add a test for it in the next stage 1.
> 
> Bootstrapped and tested on x86_64-linux, OK for master?
> 
> Thanks,
> 
> Martin
> 
> 
> gcc/ChangeLog:
> 
> 2025-01-27  Martin Jambor  <mjam...@suse.cz>
> 
>       PR tree-optimization/117892
>       * tree-ssa-dse.cc (dse_optimize_call): Leave noreturn calls alone.
> 
> gcc/testsuite/ChangeLog:
> 
> 2025-01-27  Martin Jambor  <mjam...@suse.cz>
> 
>       PR tree-optimization/117892
>       * gcc.dg/tree-ssa/pr117892.c: New test.
>       * gcc.dg/tree-ssa/pr118517.c: Likewise.
> 
> co-authored-by: Michal Jireš <mji...@suse.cz>
> ---
>  gcc/testsuite/gcc.dg/tree-ssa/pr117892.c | 17 +++++++++++++++++
>  gcc/testsuite/gcc.dg/tree-ssa/pr118517.c | 11 +++++++++++
>  gcc/tree-ssa-dse.cc                      |  5 +++--
>  3 files changed, 31 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr117892.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr118517.c
> 
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr117892.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr117892.c
> new file mode 100644
> index 00000000000..d9b9c15095f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr117892.c
> @@ -0,0 +1,17 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1" } */
> +
> +
> +volatile int a;
> +void b(int *c) {
> +  int *d = 0;
> +  *c = 0;
> +  *d = 0;
> +  __builtin_abort();
> +}
> +int main() {
> +  int f;
> +  if (a)
> +    b(&f);
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr118517.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/pr118517.c
> new file mode 100644
> index 00000000000..3a34f6788a9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr118517.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -fno-ipa-pure-const" } */
> +
> +void __attribute__((noreturn)) bar(void) {
> +  __builtin_unreachable ();
> +}
> +
> +int p;
> +void foo() {
> +  if (p) bar();
> +}
> diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
> index 753d7ef148b..492080a7eb0 100644
> --- a/gcc/tree-ssa-dse.cc
> +++ b/gcc/tree-ssa-dse.cc
> @@ -1396,8 +1396,9 @@ dse_optimize_call (gimple_stmt_iterator *gsi, sbitmap 
> live_bytes)
>    if (!node)
>      return false;
>  
> -  if (stmt_could_throw_p (cfun, stmt)
> -      && !cfun->can_delete_dead_exceptions)
> +  if ((stmt_could_throw_p (cfun, stmt)
> +       && !cfun->can_delete_dead_exceptions)
> +      || gimple_call_noreturn_p (stmt))

Please use the same test as is used in tree-ssa-dce.cc:

        /* Never elide a noreturn call we pruned control-flow for.  */
        if ((gimple_call_flags (call) & ECF_NORETURN)
            && gimple_call_ctrl_altering_p (call))
          {
            mark_stmt_necessary (call, true);
            return;
          }

OK with that change.

>      return false;
>  
>    /* If return value is used the call is not dead.  */
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to