On Thu, Apr 28, 2011 at 3:31 PM, Martin Jambor <mjam...@suse.cz> wrote: > Hi, > > when I was removing the cgraph_node function I noticed that > cgraph_preserve_function_body_p takes a tree decl parameter which it > immediately converts to a call graph node while its two callers get > the decl from a node they already have. This seems wasteful and so > the patch below changes the parameter to be a cgraph_node which avoids > the lookup. > > Because cgraph_get_node(node->decl) may be a way of getting the actual > node for a same body alias (a strange way, but well...), I added a > test for same body aliases to the function too. > > I have bootstrapped and tested the patch on x86_64-linux without > problems. OK for trunk?
An alias shouldn't have a body, so why not assert !node->same_body_alias instead.? Richard. > Thanks, > > Martin > > > 2011-04-22 Martin Jambor <mjam...@suse.cz> > > * cgraphunit.c (cgraph_preserve_function_body_p): Accept a cgraph > node instead of a decl. Update all callers. > * cgraph.h: Update declaration. > > Index: src/gcc/cgraphunit.c > =================================================================== > --- src.orig/gcc/cgraphunit.c > +++ src/gcc/cgraphunit.c > @@ -1578,7 +1578,7 @@ cgraph_expand_function (struct cgraph_no > /* Make sure that BE didn't give up on compiling. */ > gcc_assert (TREE_ASM_WRITTEN (decl)); > current_function_decl = NULL; > - gcc_assert (!cgraph_preserve_function_body_p (decl)); > + gcc_assert (!cgraph_preserve_function_body_p (node)); > cgraph_release_function_body (node); > /* Eliminate all call edges. This is important so the GIMPLE_CALL no longer > points to the dead function body. */ > @@ -1756,13 +1756,12 @@ cgraph_output_in_order (void) > /* Return true when function body of DECL still needs to be kept around > for later re-use. */ > bool > -cgraph_preserve_function_body_p (tree decl) > +cgraph_preserve_function_body_p (struct cgraph_node *node) > { > - struct cgraph_node *node; > - > gcc_assert (cgraph_global_info_ready); > + if (node->same_body_alias) > + node = node->same_body; > /* Look if there is any clone around. */ > - node = cgraph_get_node (decl); > if (node->clones) > return true; > return false; > Index: src/gcc/ipa-inline-transform.c > =================================================================== > --- src.orig/gcc/ipa-inline-transform.c > +++ src/gcc/ipa-inline-transform.c > @@ -307,7 +307,7 @@ inline_transform (struct cgraph_node *no > > /* We might need the body of this function so that we can expand > it inline somewhere else. */ > - if (cgraph_preserve_function_body_p (node->decl)) > + if (cgraph_preserve_function_body_p (node)) > save_inline_function_body (node); > > for (e = node->callees; e; e = e->next_callee) > Index: src/gcc/cgraph.h > =================================================================== > --- src.orig/gcc/cgraph.h > +++ src/gcc/cgraph.h > @@ -578,7 +578,7 @@ void cgraph_mark_needed_node (struct cgr > void cgraph_mark_address_taken_node (struct cgraph_node *); > void cgraph_mark_reachable_node (struct cgraph_node *); > bool cgraph_inline_p (struct cgraph_edge *, cgraph_inline_failed_t *reason); > -bool cgraph_preserve_function_body_p (tree); > +bool cgraph_preserve_function_body_p (struct cgraph_node *); > void verify_cgraph (void); > void verify_cgraph_node (struct cgraph_node *); > void cgraph_build_static_cdtor (char which, tree body, int priority); > >