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
virtual operands.
/* 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);