[PATCH] IPA: MODREF should skip EAF_* flags for indirect calls

Jan Hubicka hubicka@ucw.cz
Sun Aug 22 12:38:06 GMT 2021


> 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 <rguenther@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);

Thanks for looking into this bug - it is interesting that ipa-pta
requires !EAF_NOCLOBBER when function is called...

I have some work done on teaching ipa-modref (and other propagation
passes) to use ipa-devirt info when the full set of callees is known.
This goes oposite way.

You can drop flags only when callee == NAME and you can just frop
EAF_NOCLOBBER.  For example in testcase

struct a {
  void (*foo)();
  void *bar;
}

void wrap (struct a *a)
{
  a->foo ();
}

will prevent us from figuring out that bar can not be modified when you
pass non-ecaping instance of struct a to wrap.

Honza


More information about the Gcc-patches mailing list