From b4e8ab0c6a2c824cacbbb668321232fbc84b5bd4 Mon Sep 17 00:00:00 2001 From: ghazi Date: Wed, 31 Jan 2007 15:06:19 +0000 Subject: [PATCH] PR middle-end/29335 * builtins.c (fold_builtin_sqrt): Use MPFR for constant args. testsuite: * gcc.dg/torture/builtin-math-2.c: Add sqrt cases. * gcc.dg/torture/builtin-math-3.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121423 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/builtins.c | 19 ++++++------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/builtin-math-2.c | 8 ++++++++ gcc/testsuite/gcc.dg/torture/builtin-math-3.c | 7 +++++++ 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78f2b6e..2f2e39a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-01-31 Kaveh R. Ghazi + + PR middle-end/29335 + * builtins.c (fold_builtin_sqrt): Use MPFR for constant args. + 2007-01-31 Zdenek Dvorak * cfgloop.h: Include vec-prim.h. diff --git a/gcc/builtins.c b/gcc/builtins.c index 777206c..9f51553 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7200,22 +7200,15 @@ fold_builtin_sqrt (tree arglist, tree type) enum built_in_function fcode; tree arg = TREE_VALUE (arglist); - + tree res; + if (!validate_arglist (arglist, REAL_TYPE, VOID_TYPE)) return NULL_TREE; - /* Optimize sqrt of constant value. */ - if (TREE_CODE (arg) == REAL_CST - && !TREE_OVERFLOW (arg)) - { - REAL_VALUE_TYPE r, x; - - x = TREE_REAL_CST (arg); - if (real_sqrt (&r, TYPE_MODE (type), &x) - || (!flag_trapping_math && !flag_errno_math)) - return build_real (type, r); - } - + /* Calculate the result when the argument is a constant. */ + if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst0, NULL, true))) + return res; + /* Optimize sqrt(expN(x)) = expN(x*0.5). */ fcode = builtin_mathfn_code (arg); if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 137fea5..b89e985 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-01-31 Kaveh R. Ghazi + + * gcc.dg/torture/builtin-math-2.c: Add sqrt cases. + * gcc.dg/torture/builtin-math-3.c: Likewise. + 2007-01-31 Dirk Mueller gcc.dg/Wparentheses-2.c: Update and add new tests. diff --git a/gcc/testsuite/gcc.dg/torture/builtin-math-2.c b/gcc/testsuite/gcc.dg/torture/builtin-math-2.c index f0dbf2e..2374992 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-math-2.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-math-2.c @@ -145,6 +145,11 @@ void bar() fool (__builtin_fmal (__LDBL_MAX__, __LDBL_MAX__, 0.0L)); fool (__builtin_fmal (__LDBL_MAX__, 1.0L, __LDBL_MAX__)); fool (__builtin_fmal (__LDBL_MIN__, __LDBL_MIN__, 0.0L)); + + /* The sqrt arg must be [0 ... Inf] inclusive. */ + TESTIT (sqrt, -0.5); + TESTIT (sqrt, -0.0); + TESTIT (sqrt, 0.0); } /* { dg-final { scan-tree-dump-times "exp2 " 9 "original" } } */ @@ -183,4 +188,7 @@ void bar() /* { dg-final { scan-tree-dump-times "fma " 3 "original" } } */ /* { dg-final { scan-tree-dump-times "fmaf" 3 "original" } } */ /* { dg-final { scan-tree-dump-times "fmal" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "sqrt " 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "sqrtf" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "sqrtl" 1 "original" } } */ /* { dg-final { cleanup-tree-dump "original" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/builtin-math-3.c b/gcc/testsuite/gcc.dg/torture/builtin-math-3.c index b347dcc..896edcc 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-math-3.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-math-3.c @@ -363,5 +363,12 @@ int main (void) if (__builtin_fmal(0.5L,__LDBL_MIN__, __LDBL_MIN__) != __LDBL_MIN__*1.5L) link_error (__LINE__); + TESTIT (sqrt, -0.0, -0.0); /* sqrt(-0) == -0 */ + TESTIT (sqrt, 0.0, 0.0); /* sqrt(0) == 0 */ + TESTIT (sqrt, 1.0, 1.0); /* sqrt(1) == 1 */ + TESTIT (sqrt, 4.0, 2.0); /* sqrt(4) == 2 */ + TESTIT_R (sqrt, 1.5, 1.22, 1.23); /* sqrt(1.5) == 1.224... */ + TESTIT_R (sqrt, 2.0, 1.41, 1.42); /* sqrt(2) == 1.414... */ + return 0; } -- 2.7.4