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

Reply via email to