[PATCH] ipa-sra: Do not remove return values needed because of non-call EH (PR 98690)

Richard Biener richard.guenther@gmail.com
Tue Jan 19 08:38:22 GMT 2021


On Mon, Jan 18, 2021 at 8:27 PM Martin Jambor <mjambor@suse.cz> wrote:
>
> Hi,
>
> IPA-SRA already contains a check to figure out that an otherwise dead
> parameter is actually required because of non-call exceptions, but it
> is not present at the equivalent spot where SRA figures out whether
> the return statement is used for anything useful.  This patch adds
> that condition there.
>
> Unfortunately, even though this patch should be good enough for any
> normal (I'd even say reasonable) use of the compiler, it hints that
> when the user manually switches all sorts of DCE, IPA-SRA would
> probably leave behind problematic statements manipulating what
> originally were return values, just like it does for parameters (PR
> 93385).  Fixing this properly might unfortunately be a separate issue
> from the mentioned bug because the LHS of a call is changed during
> call redirection and the caller often is not a clone.  But I'll see
> what I can do.
>
> Meanwhile, the patch below has been bootstrapped and tested on x86_64.
> OK for trunk and then for the gcc-10 branch?

OK.

Thanks,
Richard.

> Thanks,
>
> Martin
>
>
> gcc/ChangeLog:
>
> 2021-01-18  Martin Jambor  <mjambor@suse.cz>
>
>         PR ipa/98690
>         * ipa-sra.c (ssa_name_only_returned_p): New parameter fun.  Check
>         whether non-call exceptions allow removal of a statement.
>         (isra_analyze_call): Pass the appropriate function to
>         ssa_name_only_returned_p.
>
> gcc/testsuite/ChangeLog:
>
> 2021-01-18  Martin Jambor  <mjambor@suse.cz>
>
>         PR ipa/98690
>         * g++.dg/ipa/pr98690.C: New test.
> ---
>  gcc/ipa-sra.c                      | 20 +++++++++++---------
>  gcc/testsuite/g++.dg/ipa/pr98690.C | 27 +++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+), 9 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/ipa/pr98690.C
>
> diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c
> index 5d2c0dfce53..1571921cb48 100644
> --- a/gcc/ipa-sra.c
> +++ b/gcc/ipa-sra.c
> @@ -1952,13 +1952,13 @@ scan_function (cgraph_node *node, struct function *fun)
>      }
>  }
>
> -/* Return true if SSA_NAME NAME is only used in return statements, or if
> -   results of any operations it is involved in are only used in return
> -   statements.  ANALYZED is a bitmap that tracks which SSA names we have
> -   already started investigating.  */
> +/* Return true if SSA_NAME NAME of function described by FUN is only used in
> +   return statements, or if results of any operations it is involved in are
> +   only used in return statements.  ANALYZED is a bitmap that tracks which SSA
> +   names we have already started investigating.  */
>
>  static bool
> -ssa_name_only_returned_p (tree name, bitmap analyzed)
> +ssa_name_only_returned_p (function *fun, tree name, bitmap analyzed)
>  {
>    bool res = true;
>    imm_use_iterator imm_iter;
> @@ -1978,8 +1978,9 @@ ssa_name_only_returned_p (tree name, bitmap analyzed)
>               break;
>             }
>         }
> -      else if ((is_gimple_assign (stmt) && !gimple_has_volatile_ops (stmt))
> -              || gimple_code (stmt) == GIMPLE_PHI)
> +      else if (!stmt_unremovable_because_of_non_call_eh_p (fun, stmt)
> +              && ((is_gimple_assign (stmt) && !gimple_has_volatile_ops (stmt))
> +                  || gimple_code (stmt) == GIMPLE_PHI))
>         {
>           /* TODO: And perhaps for const function calls too?  */
>           tree lhs;
> @@ -1995,7 +1996,7 @@ ssa_name_only_returned_p (tree name, bitmap analyzed)
>             }
>           gcc_assert (!gimple_vdef (stmt));
>           if (bitmap_set_bit (analyzed, SSA_NAME_VERSION (lhs))
> -             && !ssa_name_only_returned_p (lhs, analyzed))
> +             && !ssa_name_only_returned_p (fun, lhs, analyzed))
>             {
>               res = false;
>               break;
> @@ -2049,7 +2050,8 @@ isra_analyze_call (cgraph_edge *cs)
>        if (TREE_CODE (lhs) == SSA_NAME)
>         {
>           bitmap analyzed = BITMAP_ALLOC (NULL);
> -         if (ssa_name_only_returned_p (lhs, analyzed))
> +         if (ssa_name_only_returned_p (DECL_STRUCT_FUNCTION (cs->caller->decl),
> +                                       lhs, analyzed))
>             csum->m_return_returned = true;
>           BITMAP_FREE (analyzed);
>         }
> diff --git a/gcc/testsuite/g++.dg/ipa/pr98690.C b/gcc/testsuite/g++.dg/ipa/pr98690.C
> new file mode 100644
> index 00000000000..004418e5b40
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ipa/pr98690.C
> @@ -0,0 +1,27 @@
> +/* { dg-do run } */
> +/* { dg-options "-O2 -fnon-call-exceptions" } */
> +
> +int g;
> +volatile int v;
> +
> +static int * __attribute__((noinline))
> +almost_useless_return (void)
> +{
> +  v = 1;
> +  return &g;
> +}
> +
> +static void __attribute__((noinline))
> +foo (void)
> +{
> +  int *p = almost_useless_return ();
> +  int i = *p;
> +  v = 2;
> +}
> +
> +int
> +main (int argc, char *argv[])
> +{
> +  foo ();
> +  return 0;
> +}
> --
> 2.29.2
>


More information about the Gcc-patches mailing list