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

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.

From-SVN: r172024
This commit is contained in:
Richard Guenther 2011-04-06 08:56:28 +00:00 committed by Richard Biener
parent d7d1d041ae
commit ff5d142c9e
2 changed files with 10 additions and 47 deletions

View file

@ -1,3 +1,8 @@
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.
2011-04-06 Richard Guenther <rguenther@suse.de>
PR tree-optimization/47663

View file

@ -3470,12 +3470,6 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
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. */
@ -3511,49 +3505,13 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
}
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)
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;
for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
if (!VOID_TYPE_P (TREE_TYPE (arg)))
cost += estimate_move_cost (TREE_TYPE (arg));
tree arg = gimple_call_arg (stmt, i);
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;
}