Ping. Thx,
Martin On Fri, Nov 21, 2014 at 08:18:12PM +0100, Martin Jambor wrote: > Hi, > > when debugging PR 63814 I noticed that when cgraph_node::create_clone > was using redirect_edge_duplicating_thunks to redirect two edges to a > thunk of a clone, two thunks were created, one for each edge. The > reason is that even though duplicate_thunk_for_node attempts to locate > an already created thunk, it does so by looking for a caller with > thunk.thunk_p set and the previously created one does not have it set > because (on i686) expand_thunk has expanded the thunk to gimple and > cleared the flag. > > This patch fixes the issue by marking such expanded thunks with yet > another flag and then uses the flag to identify such expanded thunks. > Bootstrapped and tested on x86_64-linux and i686-linux. Honza, do you > think this is a good approach? Is the patch OK for trunk? > > Thanks, > > Martin > > > 2014-11-21 Martin Jambor <mjam...@suse.cz> > > * cgraph.h (cgraph_thunk_info): Converted thunk_p to a bit-field. > Added new flag expanded_thunk_p. > * cgraphunit.c (expand_thunk): Set expanded_thunk_p when appropriate. > * cgraphclones.c (duplicate_thunk_for_node): Also re-use an expanded > thunk if available. > > Index: src/gcc/cgraph.h > =================================================================== > --- src.orig/gcc/cgraph.h > +++ src/gcc/cgraph.h > @@ -552,7 +552,9 @@ struct GTY(()) cgraph_thunk_info { > bool virtual_offset_p; > bool add_pointer_bounds_args; > /* Set to true when alias node is thunk. */ > - bool thunk_p; > + unsigned thunk_p : 1; > + /* Set when this is an already expanded thunk. */ > + unsigned expanded_thunk_p : 1; > }; > > /* Information about the function collected locally. > Index: src/gcc/cgraphclones.c > =================================================================== > --- src.orig/gcc/cgraphclones.c > +++ src/gcc/cgraphclones.c > @@ -311,7 +311,7 @@ duplicate_thunk_for_node (cgraph_node *t > > cgraph_edge *cs; > for (cs = node->callers; cs; cs = cs->next_caller) > - if (cs->caller->thunk.thunk_p > + if ((cs->caller->thunk.thunk_p || cs->caller->thunk.expanded_thunk_p) > && cs->caller->thunk.this_adjusting == thunk->thunk.this_adjusting > && cs->caller->thunk.fixed_offset == thunk->thunk.fixed_offset > && cs->caller->thunk.virtual_offset_p == thunk->thunk.virtual_offset_p > Index: src/gcc/cgraphunit.c > =================================================================== > --- src.orig/gcc/cgraphunit.c > +++ src/gcc/cgraphunit.c > @@ -1504,6 +1504,7 @@ cgraph_node::expand_thunk (bool output_a > set_cfun (NULL); > TREE_ASM_WRITTEN (thunk_fndecl) = 1; > thunk.thunk_p = false; > + thunk.expanded_thunk_p = true; > analyzed = false; > } > else > @@ -1686,6 +1687,7 @@ cgraph_node::expand_thunk (bool output_a > /* Since we want to emit the thunk, we explicitly mark its name as > referenced. */ > thunk.thunk_p = false; > + thunk.expanded_thunk_p = true; > lowered = true; > bitmap_obstack_release (NULL); > }