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