From fd9710dc68bedffca930e64e0fc76149b03a18af Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 19 Feb 2014 14:25:47 +0000 Subject: [PATCH] re PR ipa/60243 (IPA is slow on large cgraph tree) 2014-02-19 Richard Biener PR ipa/60243 * tree-inline.c (estimate_num_insns): Avoid calling cgraph_get_node for all calls. From-SVN: r207899 --- gcc/ChangeLog | 6 +++++ gcc/tree-inline.c | 67 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa67c9e..a718854 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2014-02-19 Richard Biener PR ipa/60243 + * tree-inline.c (estimate_num_insns): Avoid calling cgraph_get_node + for all calls. + +2014-02-19 Richard Biener + + PR ipa/60243 * ipa-prop.c: Include stringpool.h and tree-ssanames.h. (ipa_modify_call_arguments): Emit an argument load explicitely and preserve virtual SSA form there and for the replacement call. diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 16c0622..fc83097 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3824,46 +3824,49 @@ estimate_num_insns (gimple stmt, eni_weights *weights) case GIMPLE_CALL: { tree decl; - struct cgraph_node *node = NULL; - /* Do not special case builtins where we see the body. - This just confuse inliner. */ if (gimple_call_internal_p (stmt)) return 0; - else if (!(decl = gimple_call_fndecl (stmt)) - || !(node = cgraph_get_node (decl)) - || node->definition) - ; - /* For buitins that are likely expanded to nothing or - inlined do not account operand costs. */ - else if (is_simple_builtin (decl)) - return 0; - else if (is_inexpensive_builtin (decl)) - return weights->target_builtin_call_cost; - else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) + else if ((decl = gimple_call_fndecl (stmt)) + && DECL_BUILT_IN (decl)) { - /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so - specialize the cheap expansion we do here. - ??? This asks for a more general solution. */ - switch (DECL_FUNCTION_CODE (decl)) + /* Do not special case builtins where we see the body. + This just confuse inliner. */ + struct cgraph_node *node; + if (!(node = cgraph_get_node (decl)) + || node->definition) + ; + /* For buitins that are likely expanded to nothing or + inlined do not account operand costs. */ + else if (is_simple_builtin (decl)) + return 0; + else if (is_inexpensive_builtin (decl)) + return weights->target_builtin_call_cost; + else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) { - case BUILT_IN_POW: - case BUILT_IN_POWF: - case BUILT_IN_POWL: - if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST - && REAL_VALUES_EQUAL - (TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2)) - return estimate_operator_cost (MULT_EXPR, weights, - gimple_call_arg (stmt, 0), - gimple_call_arg (stmt, 0)); - break; - - default: - break; + /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so + specialize the cheap expansion we do here. + ??? This asks for a more general solution. */ + switch (DECL_FUNCTION_CODE (decl)) + { + case BUILT_IN_POW: + case BUILT_IN_POWF: + case BUILT_IN_POWL: + if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST + && REAL_VALUES_EQUAL + (TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2)) + return estimate_operator_cost + (MULT_EXPR, weights, gimple_call_arg (stmt, 0), + gimple_call_arg (stmt, 0)); + break; + + default: + break; + } } } - cost = node ? weights->call_cost : weights->indirect_call_cost; + cost = decl ? weights->call_cost : weights->indirect_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++) -- 2.7.4