> Hello. > > We create an IPA SRA (which has DECL_IS_MALLOC set to false), but later > IPA pure const propagates malloc attributes. I think we should not set > it for a void returning functions. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > gcc/ChangeLog: > > PR ipa/98075 > * cgraph.c (cgraph_node::dump): Dump decl_is_malloc flag. > * ipa-pure-const.c (propagate_malloc): Do not set malloc > attribute for void functions.
This is OK, extra credit would be for not collecting state here. I plan to avoid stremaing useless pure-const summaries (to fight memory fragmentation at WPA time) so it would be nice to have an easy way to say that summary is not interesting. > > gcc/testsuite/ChangeLog: > > PR ipa/98075 > * g++.dg/ipa/pr98075.C: New test. > --- > gcc/cgraph.c | 2 ++ > gcc/ipa-pure-const.c | 3 ++- > gcc/testsuite/g++.dg/ipa/pr98075.C | 30 ++++++++++++++++++++++++++++++ > 3 files changed, 34 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/ipa/pr98075.C > > diff --git a/gcc/cgraph.c b/gcc/cgraph.c > index dbde8aaaba1..cb59a5a71fc 100644 > --- a/gcc/cgraph.c > +++ b/gcc/cgraph.c > @@ -2190,6 +2190,8 @@ cgraph_node::dump (FILE *f) > fprintf (f, " optimize_size"); > if (parallelized_function) > fprintf (f, " parallelized_function"); > + if (DECL_IS_MALLOC (decl)) > + fprintf (f, " decl_is_malloc"); > if (DECL_IS_OPERATOR_NEW_P (decl)) > fprintf (f, " %soperator_new", > DECL_IS_REPLACEABLE_OPERATOR (decl) ? "replaceable_" : ""); > diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c > index 054f35981a5..4c47eec8509 100644 > --- a/gcc/ipa-pure-const.c > +++ b/gcc/ipa-pure-const.c > @@ -1973,7 +1973,8 @@ propagate_malloc (void) > funct_state l = funct_state_summaries->get (node); > if (!node->alias > && l->malloc_state == STATE_MALLOC > - && !node->inlined_to) > + && !node->inlined_to > + && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (node->decl)))) > { > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, "Function %s found to be malloc\n", > diff --git a/gcc/testsuite/g++.dg/ipa/pr98075.C > b/gcc/testsuite/g++.dg/ipa/pr98075.C > new file mode 100644 > index 00000000000..0c4219d1ff3 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ipa/pr98075.C > @@ -0,0 +1,30 @@ > +/* PR ipa/98075 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fno-inline" } */ > + > +template <typename BS> > +class xg { > +public: > + BS * > + fw () > + { > + return static_cast<BS *> (operator new (sizeof (BS))); > + } > +}; > + > +class zp : xg<int> { > +public: > + __attribute__ ((always_inline)) zp () > + { > + hy = xg<int>::fw (); > + } > + > +private: > + int *hy; > +}; > + > +void > +e5 () > +{ > + zp ix; > +} > -- > 2.29.2 >