It looks like the most heavy load on crgaph_get_node and the symtab hashtable (at least for PR60243), so the following avoids that when the call isn't builtin.
Bootstrap / regtest in progress on x86_64-unknown-linux-gnu, ok? Thanks, Richard. 2014-02-18 Richard Biener <rguent...@suse.de> PR ipa/60243 * tree-inline.c (estimate_num_insns): Avoid calling cgraph_get_node for all calls. Index: gcc/tree-inline.c =================================================================== *** gcc/tree-inline.c (revision 207837) --- gcc/tree-inline.c (working copy) *************** estimate_num_insns (gimple stmt, eni_wei *** 3826,3865 **** tree decl; struct cgraph_node *node = NULL; - /* Do not special case builtins where we see the body. - This just confuse inliner. */ if (gimple_call_internal_p (stmt)) return 0; ! else if (!(decl = gimple_call_fndecl (stmt)) ! || !(node = cgraph_get_node (decl)) ! || node->definition) ! ; ! /* For buitins that are likely expanded to nothing or ! inlined do not account operand costs. */ ! else if (is_simple_builtin (decl)) ! return 0; ! else if (is_inexpensive_builtin (decl)) ! return weights->target_builtin_call_cost; ! else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) { ! /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so ! specialize the cheap expansion we do here. ! ??? This asks for a more general solution. */ ! switch (DECL_FUNCTION_CODE (decl)) { ! case BUILT_IN_POW: ! case BUILT_IN_POWF: ! case BUILT_IN_POWL: ! if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST ! && REAL_VALUES_EQUAL ! (TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2)) ! return estimate_operator_cost (MULT_EXPR, weights, ! gimple_call_arg (stmt, 0), ! gimple_call_arg (stmt, 0)); ! break; ! default: ! break; } } --- 3830,3872 ---- tree decl; struct cgraph_node *node = NULL; if (gimple_call_internal_p (stmt)) return 0; ! else if ((decl = gimple_call_fndecl (stmt)) ! && DECL_BUILT_IN (decl)) { ! /* Do not special case builtins where we see the body. ! This just confuse inliner. */ ! if (!(node = cgraph_get_node (decl)) ! || node->definition) ! ; ! /* For buitins that are likely expanded to nothing or ! inlined do not account operand costs. */ ! else if (is_simple_builtin (decl)) ! return 0; ! else if (is_inexpensive_builtin (decl)) ! return weights->target_builtin_call_cost; ! else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) { ! /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so ! specialize the cheap expansion we do here. ! ??? This asks for a more general solution. */ ! switch (DECL_FUNCTION_CODE (decl)) ! { ! case BUILT_IN_POW: ! case BUILT_IN_POWF: ! case BUILT_IN_POWL: ! if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST ! && REAL_VALUES_EQUAL ! (TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2)) ! return estimate_operator_cost ! (MULT_EXPR, weights, gimple_call_arg (stmt, 0), ! gimple_call_arg (stmt, 0)); ! break; ! default: ! break; ! } } }