aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-02-19 14:25:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-02-19 14:25:47 +0000
commitfd9710dc68bedffca930e64e0fc76149b03a18af (patch)
tree5e332191e23241952251cf6cf2e5e16847ac2287 /gcc/tree-inline.c
parent73cc5f919288ae57c546d400eb77d29da763b82e (diff)
downloadgcc-fd9710dc68bedffca930e64e0fc76149b03a18af.zip
gcc-fd9710dc68bedffca930e64e0fc76149b03a18af.tar.gz
gcc-fd9710dc68bedffca930e64e0fc76149b03a18af.tar.bz2
re PR ipa/60243 (IPA is slow on large cgraph tree)
2014-02-19 Richard Biener <rguenther@suse.de> PR ipa/60243 * tree-inline.c (estimate_num_insns): Avoid calling cgraph_get_node for all calls. From-SVN: r207899
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c67
1 files changed, 35 insertions, 32 deletions
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++)