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))
 	{