diff options
author | Richard Guenther <rguenther@suse.de> | 2006-12-07 14:24:11 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-12-07 14:24:11 +0000 |
commit | 5eab7e7af0b310eb56474a8978b57387aafc0036 (patch) | |
tree | 27722767a56435a8b6d77614d6158841f046d493 | |
parent | e850f0281c60912faf6f19c2765f0655ff4f179c (diff) | |
download | gcc-5eab7e7af0b310eb56474a8978b57387aafc0036.zip gcc-5eab7e7af0b310eb56474a8978b57387aafc0036.tar.gz gcc-5eab7e7af0b310eb56474a8978b57387aafc0036.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/builtins.c | 11 |
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c63be4..0926c1d 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 fa7ed01..3c7d105 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)) { |