diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-10-07 08:09:45 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-10-07 08:09:45 +0000 |
commit | 0ebc7d37c973a46a2a3a42a0255f39bc012a756f (patch) | |
tree | 26df13af657839b7995fa4de21f93310ada1c766 | |
parent | ebd1f44d5481e9a5f2d811d74979b6e04b18bffd (diff) | |
download | gcc-0ebc7d37c973a46a2a3a42a0255f39bc012a756f.tar.gz |
Cache reals for 1/4, 1/6 and 1/9
We have a global 1/2 and a cached 1/3, but recalculate 1/4, 1/6 and 1/9
each time we need them. That seems a bit arbitrary and makes the folding
code more noisy (especially once it's moved to match.pd).
This patch caches the other three constants too. Bootstrapped &
regression-tested on x86_64-linux-gnu.
gcc/
* real.h (dconst_quarter, dconst_sixth, dconst_ninth): New macros.
(dconst_quarter_ptr, dconst_sixth_ptr, dconst_ninth_ptr): Declare.
* real.c (CACHED_FRACTION): New helper macro.
(dconst_third_ptr): Use it.
(dconst_quarter_ptr, dconst_sixth_ptr, dconst_ninth_ptr): New.
* builtins.c (fold_builtin_sqrt): Use dconst_quarter and
dconst_sixth.
(fold_builtin_cbrt): Use dconst_sixth and dconst_ninth.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228561 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/builtins.c | 31 | ||||
-rw-r--r-- | gcc/real.c | 35 | ||||
-rw-r--r-- | gcc/real.h | 16 |
4 files changed, 48 insertions, 45 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db6f1b6792e..fdef683d37c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-10-07 Richard Sandiford <richard.sandiford@arm.com> + + * real.h (dconst_quarter, dconst_sixth, dconst_ninth): New macros. + (dconst_quarter_ptr, dconst_sixth_ptr, dconst_ninth_ptr): Declare. + * real.c (CACHED_FRACTION): New helper macro. + (dconst_third_ptr): Use it. + (dconst_quarter_ptr, dconst_sixth_ptr, dconst_ninth_ptr): New. + * builtins.c (fold_builtin_sqrt): Use dconst_quarter and + dconst_sixth. + (fold_builtin_cbrt): Use dconst_sixth and dconst_ninth. + 2015-10-06 Jeff Law <law@redhat.com> PR tree-optimization/67816 diff --git a/gcc/builtins.c b/gcc/builtins.c index 89bea60a09d..8fa3927d339 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7742,20 +7742,10 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) if (powfn) { tree arg0 = CALL_EXPR_ARG (arg, 0); - tree tree_root; - /* The inner root was either sqrt or cbrt. */ - /* This was a conditional expression but it triggered a bug - in Sun C 5.5. */ - REAL_VALUE_TYPE dconstroot; - if (BUILTIN_SQRT_P (fcode)) - dconstroot = dconsthalf; - else - dconstroot = dconst_third (); - - /* Adjust for the outer root. */ - SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - tree_root = build_real_truncate (type, dconstroot); - return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); + tree arg1 = (BUILTIN_SQRT_P (fcode) + ? build_real (type, dconst_quarter ()) + : build_real_truncate (type, dconst_sixth ())); + return build_call_expr_loc (loc, powfn, 2, arg0, arg1); } } @@ -7815,11 +7805,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (powfn) { tree arg0 = CALL_EXPR_ARG (arg, 0); - tree tree_root; - REAL_VALUE_TYPE dconstroot = dconst_third (); - - SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - tree_root = build_real_truncate (type, dconstroot); + tree tree_root = build_real_truncate (type, dconst_sixth ()); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7834,12 +7820,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (powfn) { - tree tree_root; - REAL_VALUE_TYPE dconstroot; - - real_arithmetic (&dconstroot, MULT_EXPR, - dconst_third_ptr (), dconst_third_ptr ()); - tree_root = build_real_truncate (type, dconstroot); + tree tree_root = build_real_truncate (type, dconst_ninth ()); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } diff --git a/gcc/real.c b/gcc/real.c index 49d6739eddd..f633ffd2e88 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -2395,21 +2395,26 @@ dconst_e_ptr (void) return &value; } -/* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */ - -const REAL_VALUE_TYPE * -dconst_third_ptr (void) -{ - static REAL_VALUE_TYPE value; - - /* Initialize mathematical constants for constant folding builtins. - These constants need to be given to at least 160 bits precision. */ - if (value.cl == rvc_zero) - { - real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3)); - } - return &value; -} +/* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n. */ + +#define CACHED_FRACTION(NAME, N) \ + const REAL_VALUE_TYPE * \ + NAME (void) \ + { \ + static REAL_VALUE_TYPE value; \ + \ + /* Initialize mathematical constants for constant folding builtins. \ + These constants need to be given to at least 160 bits \ + precision. */ \ + if (value.cl == rvc_zero) \ + real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (N)); \ + return &value; \ + } + +CACHED_FRACTION (dconst_third_ptr, 3) +CACHED_FRACTION (dconst_quarter_ptr, 4) +CACHED_FRACTION (dconst_sixth_ptr, 6) +CACHED_FRACTION (dconst_ninth_ptr, 9) /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */ diff --git a/gcc/real.h b/gcc/real.h index 149727953de..706859b6c64 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -409,15 +409,21 @@ extern REAL_VALUE_TYPE dconst2; extern REAL_VALUE_TYPE dconstm1; extern REAL_VALUE_TYPE dconsthalf; -#define dconst_e() (*dconst_e_ptr ()) -#define dconst_third() (*dconst_third_ptr ()) -#define dconst_sqrt2() (*dconst_sqrt2_ptr ()) +#define dconst_e() (*dconst_e_ptr ()) +#define dconst_third() (*dconst_third_ptr ()) +#define dconst_quarter() (*dconst_quarter_ptr ()) +#define dconst_sixth() (*dconst_sixth_ptr ()) +#define dconst_ninth() (*dconst_ninth_ptr ()) +#define dconst_sqrt2() (*dconst_sqrt2_ptr ()) /* Function to return the real value special constant 'e'. */ extern const REAL_VALUE_TYPE * dconst_e_ptr (void); -/* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */ -extern const REAL_VALUE_TYPE * dconst_third_ptr (void); +/* Returns a cached REAL_VALUE_TYPE corresponding to 1/n, for various n. */ +extern const REAL_VALUE_TYPE *dconst_third_ptr (void); +extern const REAL_VALUE_TYPE *dconst_quarter_ptr (void); +extern const REAL_VALUE_TYPE *dconst_sixth_ptr (void); +extern const REAL_VALUE_TYPE *dconst_ninth_ptr (void); /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */ extern const REAL_VALUE_TYPE * dconst_sqrt2_ptr (void); |