[PATCH, PR 60419] Clear thunk flag of "zombie" nodes

Richard Biener rguenther@suse.de
Wed Mar 26 09:03:00 GMT 2014


On Fri, 21 Mar 2014, Martin Jambor wrote:

> Hi,
> 
> On Fri, Mar 21, 2014 at 09:41:24AM +0100, Richard Biener wrote:
> > On Thu, 20 Mar 2014, Martin Jambor wrote:
> > 
> > > Hi,
> > > 
> > > in PR 60419 we end up with a call graph node for a thunk that has no
> > > callee because symtab_remove_unreachable_nodes has determined its body
> > > is not needed although its declaration is still reachable (more
> > > details in comment 11 in bugzilla) and removal of callees is a part of
> > > the zombification process that such nodes undergo.  Later on, the last
> > > stage of inlining that runs after that connects the thunk to the call
> > > graph and we segfault because we expect thunks to have a callee.
> > > 
> > > So we can either keep thunk targets alive or clear the thunk flag.
> > > Thunks and aliases are quite similar and
> > > symtab_remove_unreachable_nodes does clear the alias flag and the "in
> > > border" nodes are referred to but not output and thus just another
> > > symbol.  Therefore I believe it is correct and much simpler to remove
> > > the thunk flag s well.
> > > 
> > > Bootstrapped and tested on x86_64, I have also build Mozilla Firefox
> > > witht the patch (without LTO, partly on purpose, partly because again
> > > I'm having issues with LTO after updating FF).  OK for trunk?
> > 
> > Ok.
> 
> Thanks, I have just committed the trunk patch.  A proposed 4.8 variant
> is below, it does the same thing at the same spot, although there is a
> number of minor differences between the branches.  One of them is that
> symtab_remove_unreachable_nodes does not clear any flags there in 4.8
> and therefore I have added also clearing of the alias flag because
> (although I do not have a testcase) just like there should not be any
> thunks without callees, there also should not be any aliases without
> references, cgraph_function_node would choke on them too.
> 
> Bootstrapped and tested on the 4.8 branch on x86_64-linux.  OK for the
> branch?

Ok.

Thanks,
Richard.

> Thanks,
> 
> Martin
> 
> 
> 2014-03-20  Martin Jambor  <mjambor@suse.cz>
> 
> 	PR ipa/60419
> 	* ipa.c (symtab_remove_unreachable_nodes): Clear thunk and
> 	alias flags of nodes in the border.
> 
> testsuite/
> 	* g++.dg/ipa/pr60419.C: New test.
> 
> diff --git a/gcc/ipa.c b/gcc/ipa.c
> index a9b8fb4..d73d105 100644
> --- a/gcc/ipa.c
> +++ b/gcc/ipa.c
> @@ -359,6 +359,8 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
>  	    {
>  	      if (file)
>  		fprintf (file, " %s", cgraph_node_name (node));
> +	      node->alias = false;
> +	      node->thunk.thunk_p = false;
>  	      cgraph_node_remove_callees (node);
>  	      ipa_remove_all_references (&node->symbol.ref_list);
>  	      changed = true;
> diff --git a/gcc/testsuite/g++.dg/ipa/pr60419.C b/gcc/testsuite/g++.dg/ipa/pr60419.C
> new file mode 100644
> index 0000000..84461f3
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ipa/pr60419.C
> @@ -0,0 +1,80 @@
> +// PR middle-end/60419
> +// { dg-do compile }
> +// { dg-options "-O2" }
> +
> +struct C
> +{
> +};
> +
> +struct I : C
> +{
> +  I ();
> +};
> +
> +struct J
> +{
> +  void foo ();
> +  J ();
> +  virtual void foo (int &, int);
> +};
> +
> +template <class>
> +struct D
> +{
> +  virtual void foo (I &) const;
> +  void bar ()
> +  {
> +    I p;
> +    foo (p);
> +  }
> +};
> +
> +struct K : J, public D<int>
> +{
> +};
> +
> +struct F
> +{
> +  K *operator->();
> +};
> +
> +struct N : public K
> +{
> +  void foo (int &, int);
> +  I n;
> +  void foo (I &) const {}
> +};
> +
> +struct L : J
> +{
> +  F l;
> +};
> +
> +struct M : F
> +{
> +  L *operator->();
> +};
> +
> +struct G
> +{
> +  G ();
> +};
> +
> +M h;
> +
> +G::G ()
> +try
> +{
> +  N f;
> +  f.bar ();
> +  throw;
> +}
> +catch (int)
> +{
> +}
> +
> +void
> +baz ()
> +{
> +  h->l->bar ();
> +}
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer



More information about the Gcc-patches mailing list