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); else { int ecf_flags = gimple_call_flags (call); diff --git a/gcc/testsuite/gcc.dg/lto/pr101949_0.c b/gcc/testsuite/gcc.dg/lto/pr101949_0.c new file mode 100644 index 00000000000..142dffe8780 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr101949_0.c @@ -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; +} diff --git a/gcc/testsuite/gcc.dg/lto/pr101949_1.c b/gcc/testsuite/gcc.dg/lto/pr101949_1.c new file mode 100644 index 00000000000..871d15c9bfb --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr101949_1.c @@ -0,0 +1,4 @@ +int __attribute__((noinline,noclone)) bar (int (*fn)(int *), int *p) +{ + return fn (p); +} -- 2.32.0