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:
parent
a5416bf369
commit
9b08f7764c
|
@ -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))
|
||||
{
|
||||
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;
|
||||
give up for now. */
|
||||
if (gimple_call_return_slot_opt_p (call)
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
int __attribute__((noinline,noclone)) bar (int (*fn)(int *), int *p)
|
||||
{
|
||||
return fn (p);
|
||||
}
|
Loading…
Reference in New Issue