aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2006-12-07 14:24:11 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2006-12-07 14:24:11 +0000
commit5eab7e7af0b310eb56474a8978b57387aafc0036 (patch)
tree27722767a56435a8b6d77614d6158841f046d493
parente850f0281c60912faf6f19c2765f0655ff4f179c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/builtins.c11
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))
{