From: hubicka Date: Tue, 1 Jun 2010 09:36:21 +0000 (+0000) Subject: * tree-inline.c (estimate_num_insns): For stdarg functions look X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69862f316227d697044b7521e9ae44a2dabb7393;p=thirdparty%2Fgcc.git * tree-inline.c (estimate_num_insns): For stdarg functions look into call statement to count cost of argument passing. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160094 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 79bb64256398..e5ae92ba2dbb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-06-01 Jan Hubicka + + * tree-inline.c (estimate_num_insns): For stdarg functions look + into call statement to count cost of argument passing. + 2010-06-01 Kai Tietz * config/i386.c (ix86_output_addr_vec_elt): Make LPREFIX diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 3055b5797fb4..4ac1b3fb71d9 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3367,6 +3367,7 @@ estimate_num_insns (gimple stmt, eni_weights *weights) 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); @@ -3475,17 +3476,26 @@ estimate_num_insns (gimple stmt, eni_weights *weights) if (!VOID_TYPE_P (TREE_TYPE (funtype))) 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. */ - if (decl && DECL_ARGUMENTS (decl)) + 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 = TREE_CHAIN (arg)) if (!VOID_TYPE_P (TREE_TYPE (arg))) cost += estimate_move_cost (TREE_TYPE (arg)); } - else if (funtype && prototype_p (funtype)) + else if (funtype && prototype_p (funtype) && !stdarg) { tree t; for (t = TYPE_ARG_TYPES (funtype); t && t != void_list_node;