From 5a84ba55a56a2df5d389a73adf84d8fa7282cd97 Mon Sep 17 00:00:00 2001
From: rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 7 Dec 2006 14:24:11 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119622 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog  |  6 ++++++
 gcc/builtins.c | 11 ++++++++---
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c63be49300e..0926c1dc5505 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 fa7ed0133ba0..3c7d1052cba4 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))
 	{
-- 
GitLab