[PATCH] Reduce load on crgaph_get_node from estimate_num_insns

2014-02-18 Thread Richard Biener

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


Re: [PATCH] Reduce load on crgaph_get_node from estimate_num_insns

2014-02-18 Thread Jan Hubicka
 
 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?

OK, thanks!
Honza