diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c63be49300e03a7acbbc517346908668e7a692a..0926c1dc55055fed788b97ce14e7280d12ec78a5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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> * i386.c (nocona_cost, pentium4_cost): Update preffered memcpy/memset diff --git a/gcc/builtins.c b/gcc/builtins.c index fa7ed0133ba034d8090e11249de688b80ece7c52..3c7d1052cba47ddaf83bd3e5797d4cf9316e8203 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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 - 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); - 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_round (&c2, mode, &c2); @@ -2691,7 +2697,6 @@ expand_builtin_pow (tree exp, rtx target, rtx subtarget) real_convert (&c2, mode, &c2); if (real_identical (&c2, &c) && ((!optimize_size - && flag_unsafe_math_optimizations && powi_cost (n/3) <= POWI_MAX_MULTS) || n == 1)) {