This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][2/2] Simplify call stmt handling in stmt costs


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  <rguenther@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;
        }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]