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