re PR tree-optimization/46726 (x*x has different cost than pow(x,2) with -ffast-math)

2010-12-07  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/46726
	* tree-inline.c (estimate_num_insns): Special case pow (x, 2.0).

From-SVN: r167531
This commit is contained in:
Richard Guenther 2010-12-07 10:43:38 +00:00 committed by Richard Biener
parent 0b238a9b87
commit e9f7ad799c
2 changed files with 29 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2010-12-07 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46726
* tree-inline.c (estimate_num_insns): Special case pow (x, 2.0).
2010-12-07 Richard Guenther <rguenther@suse.de>
* tree-ssa-math-opts.c (execute_optimize_widening_mul): Unlink

View File

@ -3496,16 +3496,37 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
/* Do not special case builtins where we see the body.
This just confuse inliner. */
if (!decl || cgraph_node (decl)->analyzed)
cost = weights->call_cost;
;
/* 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
cost = weights->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
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 = weights->call_cost;
if (decl)
funtype = TREE_TYPE (decl);