Cache reals for 1/4, 1/6 and 1/9
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 7 Oct 2015 08:09:45 +0000 (08:09 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 7 Oct 2015 08:09:45 +0000 (08:09 +0000)
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.

From-SVN: r228561

gcc/ChangeLog
gcc/builtins.c
gcc/real.c
gcc/real.h

index db6f1b6792ec6f47945be992fb6d760eaeecfac6..fdef683d37c0f0b2dd61494305d27ec7424a5619 100644 (file)
@@ -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
index 89bea60a09df38f5872933168a7200e33f6efbe6..8fa3927d33912e430589e7e142ca60d107ebe4f0 100644 (file)
@@ -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);
                }
            }
index 49d6739eddd659cc82f07dc8e88506ead68c7efc..f633ffd2e88fb9afb6c60136e3355463f46fa062 100644 (file)
@@ -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).  */
 
index 149727953de33f89f13b7fe1b07178e93cd8f3b2..706859b6c64dadfb491bc43e3f985a25dcf5a926 100644 (file)
@@ -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);