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;
! }
}
}