From d2d06977c1d8c54554ed0980a9eed16ad9a6ca89 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 3 Feb 2005 17:47:33 +0000 Subject: [PATCH] re PR middle-end/19775 (sqrt(pow(x,y)) != pow(x,y*0.5) (with -ffast-math)) PR middle-end/19775 * builtins.c (fold_builtin_sqrt): Transform sqrt(pow(x,y)) to pow(fabs(x),y*0.5), not pow(x,y*0.5). * gcc.dg/builtins-10.c: Disable test for invalid transformation and one test we no longer optimize. * gcc.dg/builtins-47.c: New testcase. From-SVN: r94665 --- gcc/ChangeLog | 8 ++++++++ gcc/builtins.c | 9 ++++++--- gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/gcc.dg/builtins-10.c | 7 ++++--- gcc/testsuite/gcc.dg/builtins-47.c | 16 ++++++++++++++++ 5 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/builtins-47.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 89d15d54b15e..1dc084d7fff6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-02-03 Richard Guenther + + PR middle-end/19775 + + * builtins.c (fold_builtin_sqrt): Transform + sqrt(pow(x,y)) to pow(fabs(x),y*0.5), not + pow(x,y*0.5). + 2005-02-01 Richard Earnshaw PR target/16201 diff --git a/gcc/builtins.c b/gcc/builtins.c index 4cb42cc61e24..a3e069e4baca 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -6584,7 +6584,7 @@ fold_builtin (tree exp) return build_function_call_expr (expfn, arglist); } - /* Optimize sqrt(pow(x,y)) = pow(x,y*0.5). */ + /* Optimize sqrt(pow(x,y)) = pow(|x|,y*0.5). */ if (flag_unsafe_math_optimizations && (fcode == BUILT_IN_POW || fcode == BUILT_IN_POWF @@ -6593,8 +6593,11 @@ fold_builtin (tree exp) tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0); tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1)); tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1))); - tree narg1 = fold (build (MULT_EXPR, type, arg1, - build_real (type, dconsthalf))); + tree narg1; + if (!tree_expr_nonnegative_p (arg0)) + arg0 = build1 (ABS_EXPR, type, arg0); + narg1 = fold (build (MULT_EXPR, type, arg1, + build_real (type, dconsthalf))); arglist = tree_cons (NULL_TREE, arg0, build_tree_list (NULL_TREE, narg1)); return build_function_call_expr (powfn, arglist); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee8ddc8bea8a..11a23843310e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2005-02-03 Richard Guenther + + PR middle-end/19775 + + * gcc.dg/builtins-10.c: Disable test for + invalid transformation and one test we no + longer optimize. + * gcc.dg/builtins-47.c: New testcase. + 2005-02-01 Alexandre Oliva * g++.dg/parse/typename7.C: Adjust error messages. diff --git a/gcc/testsuite/gcc.dg/builtins-10.c b/gcc/testsuite/gcc.dg/builtins-10.c index 9e5a4583fc3a..7070f5eeb947 100644 --- a/gcc/testsuite/gcc.dg/builtins-10.c +++ b/gcc/testsuite/gcc.dg/builtins-10.c @@ -14,11 +14,12 @@ extern double exp(double); extern double log(double); extern double sqrt(double); extern double pow(double,double); +extern double fabs(double); void test(double x) { - if (sqrt(pow(x,4.0)) != x*x) - link_error (); + /*if (sqrt(pow(x,4.0)) != x*x) + link_error ();*/ if (pow(sqrt(x),4.0) != x*x) link_error (); @@ -29,7 +30,7 @@ void test(double x) void test2(double x, double y, double z) { - if (sqrt(pow(x,y)) != pow(x,y*0.5)) + if (sqrt(pow(x,y)) != pow(fabs(x),y*0.5)) link_error (); if (log(pow(x,y)) != y*log(x)) diff --git a/gcc/testsuite/gcc.dg/builtins-47.c b/gcc/testsuite/gcc.dg/builtins-47.c new file mode 100644 index 000000000000..79c4f840d8a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtins-47.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ +/* { dg-options "-ffast-math" } */ + +extern double sqrt (double); +extern double pow (double, double); +extern void abort (void); + +int main () +{ + double x = -1.0; + if (sqrt (pow (x, 2)) != 1.0) + abort(); + if (sqrt (x*x) != 1.0) + abort(); + return 0; +} -- 2.47.2