Commit 5eab7e7a by Richard Guenther Committed by Richard Biener

builtins.c (expand_builtin_pow): Adjust predicates for pow to cbrt expansion to…

builtins.c (expand_builtin_pow): Adjust predicates for pow to cbrt expansion to unsafe math and !HONOR_NANS for...

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

	* builtins.c (expand_builtin_pow): Adjust predicates for
	pow to cbrt expansion to unsafe math and !HONOR_NANS for
	negative base.

From-SVN: r119622
parent e850f028
2006-12-07 Richard Guenther <rguenther@suse.de>
* builtins.c (expand_builtin_pow): Adjust predicates for
pow to cbrt expansion to unsafe math and !HONOR_NANS for
negative base.
2006-12-07 Jan Hubicka <jh@suse.cz> 2006-12-07 Jan Hubicka <jh@suse.cz>
* i386.c (nocona_cost, pentium4_cost): Update preffered memcpy/memset * i386.c (nocona_cost, pentium4_cost): Update preffered memcpy/memset
......
...@@ -2679,9 +2679,15 @@ expand_builtin_pow (tree exp, rtx target, rtx subtarget) ...@@ -2679,9 +2679,15 @@ expand_builtin_pow (tree exp, rtx target, rtx subtarget)
} }
/* Try if the exponent is a third of an integer. In this case /* Try if the exponent is a third of an integer. In this case
we can expand to x**(n/3) * cbrt(x)**(n%3). */ we can expand to x**(n/3) * cbrt(x)**(n%3). As cbrt (x) is
different from pow (x, 1./3.) due to rounding and behavior
with negative x we need to constrain this transformation to
unsafe math and positive x or finite math. */
fn = mathfn_built_in (type, BUILT_IN_CBRT); fn = mathfn_built_in (type, BUILT_IN_CBRT);
if (fn != NULL_TREE) if (fn != NULL_TREE
&& flag_unsafe_math_optimizations
&& (tree_expr_nonnegative_p (arg0)
|| !HONOR_NANS (mode)))
{ {
real_arithmetic (&c2, MULT_EXPR, &c, &dconst3); real_arithmetic (&c2, MULT_EXPR, &c, &dconst3);
real_round (&c2, mode, &c2); real_round (&c2, mode, &c2);
...@@ -2691,7 +2697,6 @@ expand_builtin_pow (tree exp, rtx target, rtx subtarget) ...@@ -2691,7 +2697,6 @@ expand_builtin_pow (tree exp, rtx target, rtx subtarget)
real_convert (&c2, mode, &c2); real_convert (&c2, mode, &c2);
if (real_identical (&c2, &c) if (real_identical (&c2, &c)
&& ((!optimize_size && ((!optimize_size
&& flag_unsafe_math_optimizations
&& powi_cost (n/3) <= POWI_MAX_MULTS) && powi_cost (n/3) <= POWI_MAX_MULTS)
|| n == 1)) || n == 1))
{ {
......
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