Clear EAF_NOCLOBBER for indirect calls

gcc/ChangeLog:

2021-08-22  Jan Hubicka  <hubicka@ucw.cz>
	    Martin Liska  <mliska@suse.cz>

	PR middle-end/101949
	* ipa-modref.c (analyze_ssa_name_flags): Indirect call implies
	~EAF_NOCLOBBER.

gcc/testsuite/ChangeLog:

2021-08-22  Jan Hubicka  <hubicka@ucw.cz>
	    Martin Liska  <mliska@suse.cz>

	* gcc.dg/lto/pr101949_0.c: New test.
	* gcc.dg/lto/pr101949_1.c: New test.
This commit is contained in:
Jan Hubicka 2021-08-22 20:57:19 +02:00
parent a5416bf369
commit 9b08f7764c
3 changed files with 33 additions and 0 deletions

View File

@ -1700,6 +1700,15 @@ analyze_ssa_name_flags (tree name, vec<modref_lattice> &lattice, int depth,
else if (gcall *call = dyn_cast <gcall *> (use_stmt)) else if (gcall *call = dyn_cast <gcall *> (use_stmt))
{ {
tree callee = gimple_call_fndecl (call); tree callee = gimple_call_fndecl (call);
/* IPA PTA internally it treats calling a function as "writing" to
the argument space of all functions the function pointer points to
(PR101949). We can not drop EAF_NOCLOBBER only when ipa-pta
is on since that would allow propagation of this from -fno-ipa-pta
to -fipa-pta functions. */
if (gimple_call_fn (use_stmt) == name)
lattice[index].merge (~EAF_NOCLOBBER);
/* Return slot optimization would require bit of propagation; /* Return slot optimization would require bit of propagation;
give up for now. */ give up for now. */
if (gimple_call_return_slot_opt_p (call) if (gimple_call_return_slot_opt_p (call)

View File

@ -0,0 +1,20 @@
/* { dg-lto-do run } */
/* { dg-lto-options { "-O2 -fipa-pta -flto -flto-partition=1to1" } } */
extern int bar (int (*)(int *), int *);
static int x;
static int __attribute__ ((noinline)) foo (int *p)
{
*p = 1;
x = 0;
return *p;
}
int main ()
{
if (bar (foo, &x) != 0)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,4 @@
int __attribute__((noinline,noclone)) bar (int (*fn)(int *), int *p)
{
return fn (p);
}