From: Richard Guenther Date: Thu, 7 Dec 2006 14:24:11 +0000 (+0000) Subject: builtins.c (expand_builtin_pow): Adjust predicates for pow to cbrt expansion to unsaf... X-Git-Tag: releases/gcc-4.3.0~8084 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5eab7e7af0b310eb56474a8978b57387aafc0036;p=thirdparty%2Fgcc.git builtins.c (expand_builtin_pow): Adjust predicates for pow to cbrt expansion to unsafe math and !HONOR_NANS for... 2006-12-07 Richard Guenther * builtins.c (expand_builtin_pow): Adjust predicates for pow to cbrt expansion to unsafe math and !HONOR_NANS for negative base. From-SVN: r119622 --- 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 + + * 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 * 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)) {