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