With the call stmt cost merge from pretty-IPA we can now simplify
their handling in estimate_num_insns.  Instead of fancy ways to
look at types simply account for the actual arguments and returns.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-04-06  Richard Guenther  <rguent...@suse.de>

        * tree-inline.c (estimate_num_insns): For calls simply account
        for all passed arguments and a used return value.

Index: trunk/gcc/tree-inline.c
===================================================================
*** trunk.orig/gcc/tree-inline.c        2011-04-05 15:57:38.000000000 +0200
--- trunk/gcc/tree-inline.c     2011-04-05 17:14:43.000000000 +0200
*************** estimate_num_insns (gimple stmt, eni_wei
*** 3470,3481 ****
      case GIMPLE_CALL:
        {
        tree decl = gimple_call_fndecl (stmt);
-       tree addr = gimple_call_fn (stmt);
-       tree funtype = TREE_TYPE (addr);
-       bool stdarg = false;
- 
-       if (POINTER_TYPE_P (funtype))
-         funtype = TREE_TYPE (funtype);
  
        /* Do not special case builtins where we see the body.
           This just confuse inliner.  */
--- 3470,3475 ----
*************** estimate_num_insns (gimple stmt, eni_wei
*** 3511,3559 ****
          }
  
        cost = weights->call_cost;
!       if (decl)
!         funtype = TREE_TYPE (decl);
! 
!       if (!VOID_TYPE_P (TREE_TYPE (funtype))
!           && gimple_call_lhs (stmt))
!         cost += estimate_move_cost (TREE_TYPE (funtype));
! 
!       if (funtype)
!         stdarg = stdarg_p (funtype);
! 
!       /* Our cost must be kept in sync with
!          cgraph_estimate_size_after_inlining that does use function
!          declaration to figure out the arguments.
! 
!          For functions taking variable list of arguments we must
!          look into call statement intself.  This is safe because
!          we will get only higher costs and in most cases we will
!          not inline these anyway.  */
!       if (decl && DECL_ARGUMENTS (decl) && !stdarg)
!         {
!           tree arg;
!           for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
!             if (!VOID_TYPE_P (TREE_TYPE (arg)))
!               cost += estimate_move_cost (TREE_TYPE (arg));
!         }
!       else if (funtype && prototype_p (funtype) && !stdarg)
!         {
!           tree t;
!           for (t = TYPE_ARG_TYPES (funtype); t && t != void_list_node;
!                t = TREE_CHAIN (t))
!             if (!VOID_TYPE_P (TREE_VALUE (t)))
!               cost += estimate_move_cost (TREE_VALUE (t));
!         }
!       else
          {
!           for (i = 0; i < gimple_call_num_args (stmt); i++)
!             {
!               tree arg = gimple_call_arg (stmt, i);
!               if (!VOID_TYPE_P (TREE_TYPE (arg)))
!                 cost += estimate_move_cost (TREE_TYPE (arg));
!             }
          }
- 
        break;
        }
  
--- 3505,3517 ----
          }
  
        cost = weights->call_cost;
!       if (gimple_call_lhs (stmt))
!         cost += estimate_move_cost (TREE_TYPE (gimple_call_lhs (stmt)));
!       for (i = 0; i < gimple_call_num_args (stmt); i++)
          {
!           tree arg = gimple_call_arg (stmt, i);
!           cost += estimate_move_cost (TREE_TYPE (arg));
          }
        break;
        }
  

Reply via email to