Hi,

On Fri, Aug 20 2021, Martin Liška wrote:
> Hello.
>
> As showed in the PR, returning (EAF_NOCLOBBER | EAF_NOESCAPE) for an argument
> that is a function pointer is problematic. Doing such a function call is a 
> clobber.
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?
> Thanks,
> Martin
>
>       PR 101949
>
> gcc/ChangeLog:
>
>       * ipa-modref.c (analyze_ssa_name_flags): Do not propagate EAF
>         flags arguments for indirect functions.
>
> gcc/testsuite/ChangeLog:
>
>       * gcc.dg/lto/pr101949_0.c: New test.
>       * gcc.dg/lto/pr101949_1.c: New test.
>
> Co-Authored-By: Richard Biener <rguent...@suse.de>
> ---
>   gcc/ipa-modref.c                      |  3 +++
>   gcc/testsuite/gcc.dg/lto/pr101949_0.c | 20 ++++++++++++++++++++
>   gcc/testsuite/gcc.dg/lto/pr101949_1.c |  4 ++++
>   3 files changed, 27 insertions(+)
>   create mode 100644 gcc/testsuite/gcc.dg/lto/pr101949_0.c
>   create mode 100644 gcc/testsuite/gcc.dg/lto/pr101949_1.c
>
> diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
> index fafd804d4ba..380ba6926b9 100644
> --- a/gcc/ipa-modref.c
> +++ b/gcc/ipa-modref.c
> @@ -1715,6 +1715,9 @@ analyze_ssa_name_flags (tree name, vec<modref_lattice> 
> &lattice, int depth,
>         else if (callee && !ipa && recursive_call_p (current_function_decl,
>                                                 callee))
>           lattice[index].merge (0);
> +       /* Ignore indirect calls (PR101949).  */
> +       else if (callee == NULL_TREE)
> +         lattice[index].merge (0);

I just had a quick glance, but wouldn't bailing out only when

  gimple_call_fn (call) == name

suffice here?  Otherwise it seems to trigger also when passing NAME to
an indirectly called function about which we might learn something from
gimple_call_fntype, as the code apparently tries later on.

Martin

Reply via email to