Commit fd9710dc by Richard Biener Committed by Richard Biener

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
parent 73cc5f91
2014-02-19 Richard Biener <rguenther@suse.de> 2014-02-19 Richard Biener <rguenther@suse.de>
PR ipa/60243 PR ipa/60243
* tree-inline.c (estimate_num_insns): Avoid calling cgraph_get_node
for all calls.
2014-02-19 Richard Biener <rguenther@suse.de>
PR ipa/60243
* ipa-prop.c: Include stringpool.h and tree-ssanames.h. * ipa-prop.c: Include stringpool.h and tree-ssanames.h.
(ipa_modify_call_arguments): Emit an argument load explicitely and (ipa_modify_call_arguments): Emit an argument load explicitely and
preserve virtual SSA form there and for the replacement call. preserve virtual SSA form there and for the replacement call.
......
...@@ -3824,46 +3824,49 @@ estimate_num_insns (gimple stmt, eni_weights *weights) ...@@ -3824,46 +3824,49 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
case GIMPLE_CALL: case GIMPLE_CALL:
{ {
tree decl; 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)) if (gimple_call_internal_p (stmt))
return 0; return 0;
else if (!(decl = gimple_call_fndecl (stmt)) else if ((decl = gimple_call_fndecl (stmt))
|| !(node = cgraph_get_node (decl)) && DECL_BUILT_IN (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)
{ {
/* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so /* Do not special case builtins where we see the body.
specialize the cheap expansion we do here. This just confuse inliner. */
??? This asks for a more general solution. */ struct cgraph_node *node;
switch (DECL_FUNCTION_CODE (decl)) 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: /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so
case BUILT_IN_POWF: specialize the cheap expansion we do here.
case BUILT_IN_POWL: ??? This asks for a more general solution. */
if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST switch (DECL_FUNCTION_CODE (decl))
&& REAL_VALUES_EQUAL {
(TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2)) case BUILT_IN_POW:
return estimate_operator_cost (MULT_EXPR, weights, case BUILT_IN_POWF:
gimple_call_arg (stmt, 0), case BUILT_IN_POWL:
gimple_call_arg (stmt, 0)); if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST
break; && REAL_VALUES_EQUAL
(TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2))
default: return estimate_operator_cost
break; (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)) if (gimple_call_lhs (stmt))
cost += estimate_move_cost (TREE_TYPE (gimple_call_lhs (stmt))); cost += estimate_move_cost (TREE_TYPE (gimple_call_lhs (stmt)));
for (i = 0; i < gimple_call_num_args (stmt); i++) for (i = 0; i < gimple_call_num_args (stmt); i++)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment