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