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