From fd2ef596b5fe6bfdf10bed1c8a4b4100d8a0772a Mon Sep 17 00:00:00 2001 From: "Kaveh R. Ghazi" Date: Fri, 18 May 2007 01:15:28 +0000 Subject: [PATCH] re PR middle-end/30251 (Evaluate bessel functions at compile-time) PR middle-end/30251 * builtins.c (fold_builtin_1): Handle y0, y1. (fold_builtin_2): Handle yn. testsuite: * gcc.dg/torture/builtin-math-2.c: Test y0, y1, yn. * gcc.dg/torture/builtin-math-4.c: Likewise. From-SVN: r124819 --- gcc/ChangeLog | 4 +++ gcc/builtins.c | 19 +++++++++++ gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.dg/torture/builtin-math-2.c | 33 +++++++++++++++++++ gcc/testsuite/gcc.dg/torture/builtin-math-4.c | 19 +++++++++++ 5 files changed, 78 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e3c321b295..66c9acc7e8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2007-05-17 Kaveh R. Ghazi + PR middle-end/30251 + * builtins.c (fold_builtin_1): Handle y0, y1. + (fold_builtin_2): Handle yn. + PR middle-end/30251 * builtins.c (do_mpfr_bessel_n): New. (fold_builtin_1): Handle BUILT_IN_J0 and BUILT_IN_J1. diff --git a/gcc/builtins.c b/gcc/builtins.c index 221b5a34b3e..da6bbc6e510 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -9783,6 +9783,18 @@ fold_builtin_1 (tree fndecl, tree arg0, bool ignore) return do_mpfr_arg1 (arg0, type, mpfr_j1, NULL, NULL, 0); break; + + CASE_FLT_FN (BUILT_IN_Y0): + if (validate_arg (arg0, REAL_TYPE)) + return do_mpfr_arg1 (arg0, type, mpfr_y0, + &dconst0, NULL, false); + break; + + CASE_FLT_FN (BUILT_IN_Y1): + if (validate_arg (arg0, REAL_TYPE)) + return do_mpfr_arg1 (arg0, type, mpfr_y1, + &dconst0, NULL, false); + break; #endif CASE_FLT_FN (BUILT_IN_NAN): @@ -9901,6 +9913,13 @@ fold_builtin_2 (tree fndecl, tree arg0, tree arg1, bool ignore) && validate_arg (arg1, REAL_TYPE)) return do_mpfr_bessel_n (arg0, arg1, type, mpfr_jn, NULL, 0); break; + + CASE_FLT_FN (BUILT_IN_YN): + if (validate_arg (arg0, INTEGER_TYPE) + && validate_arg (arg1, REAL_TYPE)) + return do_mpfr_bessel_n (arg0, arg1, type, mpfr_yn, + &dconst0, false); + break; #endif CASE_FLT_FN (BUILT_IN_ATAN2): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2be7405667..5d13049eb82 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-05-17 Kaveh R. Ghazi + * gcc.dg/torture/builtin-math-2.c: Test y0, y1, yn. + * gcc.dg/torture/builtin-math-4.c: Likewise. + * gcc.dg/torture/builtin-math-4.c: New test. 2007-05-17 Janis Johnson diff --git a/gcc/testsuite/gcc.dg/torture/builtin-math-2.c b/gcc/testsuite/gcc.dg/torture/builtin-math-2.c index 5153ae49214..f3cdaf623a8 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-math-2.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-math-2.c @@ -24,6 +24,12 @@ extern void fool (long double); fool (__builtin_##FUNC##l (ARG1##L, ARG2##L)); \ } while (0) +#define TESTIT2_I1(FUNC, ARG1, ARG2) do { \ + foof (__builtin_##FUNC##f (ARG1, ARG2##F)); \ + foo (__builtin_##FUNC (ARG1, ARG2)); \ + fool (__builtin_##FUNC##l (ARG1, ARG2##L)); \ +} while (0) + #define TESTIT2_I2ALL(FUNC, ARGF, MAXF, ARGD, MAXD, ARGLD, MAXLD) do { \ foof (__builtin_##FUNC##f (ARGF, MAXF)); \ foo (__builtin_##FUNC (ARGD, MAXD)); \ @@ -228,6 +234,24 @@ void bar() foof (__builtin_ilogbf (-__builtin_nanf(""))); foo (__builtin_ilogb (-__builtin_nan(""))); fool (__builtin_ilogbl (-__builtin_nanl(""))); + + /* The y* arg must be [0 ... Inf] EXclusive. */ + TESTIT (y0, -1.0); + TESTIT (y0, 0.0); + TESTIT (y0, -0.0); + + TESTIT (y1, -1.0); + TESTIT (y1, 0.0); + TESTIT (y1, -0.0); + + TESTIT2_I1 (yn, 2, -1.0); + TESTIT2_I1 (yn, 2, 0.0); + TESTIT2_I1 (yn, 2, -0.0); + + TESTIT2_I1 (yn, -3, -1.0); + TESTIT2_I1 (yn, -3, 0.0); + TESTIT2_I1 (yn, -3, -0.0); + } /* { dg-final { scan-tree-dump-times "exp2 " 9 "original" } } */ @@ -284,4 +308,13 @@ void bar() /* { dg-final { scan-tree-dump-times "ilogb " 6 "original" } } */ /* { dg-final { scan-tree-dump-times "ilogbf" 6 "original" } } */ /* { dg-final { scan-tree-dump-times "ilogbl" 6 "original" } } */ +/* { dg-final { scan-tree-dump-times "y0 " 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "y0f" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "y0l" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "y1 " 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "y1f" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "y1l" 3 "original" } } */ +/* { dg-final { scan-tree-dump-times "yn " 6 "original" } } */ +/* { dg-final { scan-tree-dump-times "ynf" 6 "original" } } */ +/* { dg-final { scan-tree-dump-times "ynl" 6 "original" } } */ /* { dg-final { cleanup-tree-dump "original" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/builtin-math-4.c b/gcc/testsuite/gcc.dg/torture/builtin-math-4.c index 294dd93eeb2..b7b8e5e7d55 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-math-4.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-math-4.c @@ -113,5 +113,24 @@ int main (void) TESTIT2_R (jn, -5, 4.6, -0.21, -0.20); /* jn(-5,4.6) == -0.207... */ TESTIT2_R (jn, -5, -4.6, 0.20, 0.21); /* jn(-5,-4.6) == 0.207... */ + TESTIT_R (y0, 5.0, -0.31, -0.30); /* y0(5) == -0.308... */ + TESTIT_R (y0, 0.1, -1.54, -1.53); /* y0(0.1) == -1.534... */ + + TESTIT_R (y1, 5.0, 0.14, 0.15); /* y1(5) == 0.147... */ + TESTIT_R (y1, 0.1, -6.46, -6.45); /* y1(0.1) == -6.458... */ + + TESTIT2_R (yn, -1, 3.0, -0.33, -0.32); /* yn(-1,3) == -0.324... */ + TESTIT2_R (yn, -1, 0.25, 2.70, 2.71); /* yn(-1,0.25) == 2.704... */ + + TESTIT2_R (yn, 2, 4.0, 0.21, 0.22); /* yn(2,4) == 0.215... */ + TESTIT2_R (yn, 2, 0.9, -1.95, -1.94); /* yn(2,0.9) == -1.945... */ + TESTIT2_R (yn, -2, 4.0, 0.21, 0.22); /* yn(-2,4) == 0.215... */ + TESTIT2_R (yn, -2, 0.9, -1.95, -1.94); /* yn(-2,0.9) == -1.945... */ + + TESTIT2_R (yn, 3, 6.0, 0.32, 0.33); /* yn(3,6) == 0.328... */ + TESTIT2_R (yn, 3, 0.89, -8.03, -8.02); /* yn(3,0.89) == -8.020... */ + TESTIT2_R (yn, -3, 8.0, -0.03, -0.02); /* yn(-3,8) == -0.026... */ + TESTIT2_R (yn, -3, 0.99, 5.98, 5.99); /* yn(-3,0.99) == 5.982... */ + return 0; }