This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][2/2] Simplify call stmt handling in stmt costs
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 6 Apr 2011 10:54:07 +0200 (CEST)
- Subject: [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;
}