Speed up math/test-tgmath2.c

Message ID 1478293571.4630.29.camel@caviumnetworks.com
State New, archived
Headers

Commit Message

Steve Ellcey Nov. 4, 2016, 9:06 p.m. UTC
  On Fri, 2016-11-04 at 17:25 +0000, Joseph Myers wrote:
> On Fri, 4 Nov 2016, Steve Ellcey wrote:
> 
> > 
> > > 
> > > +  return test_cos (vint1, vllong1)
> > > +	 + test_fabs (vint1, vllong1)
> > > +	 + test_conj (vint1, vllong1)
> > > +	 + test_expm1 (vint1, vllong1)
> > > +	 + test_lrint (vint1, vllong1)
> > > +	 + test_ldexp (vint1, vllong1)
> > > +	 + test_atan2 (vint1, vllong1)
> > > +	 + test_remquo (vint1, vllong1)
> > > +	 + test_pow (vint1, vllong1)
> > > +	 + test_fma_1 (vint1, vllong1)
> > > +	 + test_fma_2 (vint1, vllong1)
> > > +	 + test_fma_3 (vint1, vllong1)
> > > +	 + test_fma_4 (vint1, vllong1);
> You don't want to add up test results like that; you should OR them 
> together instead, to avoid the potential for test results adding up
> to 77 
> and wrongly becoming UNSUPPORTED.  (In this case of course there
> aren't 
> enough tests to get to 77, but the principle applies that you should
> avoid 
> the test return being a count of something.)

Here is a modified and retested patch.

Steve Ellcey
sellcey@caviumnetworks.com


2016-11-04  Steve Ellcey  <sellcey@caviumnetworks.com>

	* math/test-tgmath2.c: Split up test function.
  

Comments

Joseph Myers Nov. 4, 2016, 9:26 p.m. UTC | #1
On Fri, 4 Nov 2016, Steve Ellcey wrote:

> Here is a modified and retested patch.

The expression ORing together lots of function call results has 
indeterminate order of evaluation.  While the test should work running the 
test functions in any order, on the whole I think it would be better to 
make the order determinate, by doing

result = test_cos (vint1, vllong1);
result |= test_fabs (vint1, vllong1);

etc.
  

Patch

diff --git a/math/test-tgmath2.c b/math/test-tgmath2.c
index b376fd6..b2cff6b 100644
--- a/math/test-tgmath2.c
+++ b/math/test-tgmath2.c
@@ -89,12 +89,6 @@  enum
 int count;
 int counts[Tlast][C_last];
 
-int
-test (const int Vint4, const long long int Vllong4)
-{
-  int result = 0;
-  int quo = 0;
-
 #define FAIL(str) \
   do								\
     {								\
@@ -138,6 +132,11 @@  test (const int Vint4, const long long int Vllong4)
   while (0)
 #define TEST(expr, type, fn) TEST2(expr, type, type, fn)
 
+int
+test_cos (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   TEST (cos (vfloat1), float, cos);
   TEST (cos (vdouble1), double, cos);
   TEST (cos (vldouble1), ldouble, cos);
@@ -155,6 +154,14 @@  test (const int Vint4, const long long int Vllong4)
   TEST (cos (Vcdouble1), cdouble, cos);
   TEST (cos (Vcldouble1), cldouble, cos);
 
+  return result;
+}
+
+int
+test_fabs (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   TEST (fabs (vfloat1), float, fabs);
   TEST (fabs (vdouble1), double, fabs);
   TEST (fabs (vldouble1), ldouble, fabs);
@@ -180,6 +187,13 @@  test (const int Vint4, const long long int Vllong4)
   TEST (fabs (Vcdouble1), double, cabs);
   TEST (fabs (Vcldouble1), ldouble, cabs);
 
+  return result;
+}
+
+int
+test_conj (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
   TEST (conj (vfloat1), cfloat, conj);
   TEST (conj (vdouble1), cdouble, conj);
   TEST (conj (vldouble1), cldouble, conj);
@@ -197,6 +211,14 @@  test (const int Vint4, const long long int Vllong4)
   TEST (conj (Vcdouble1), cdouble, conj);
   TEST (conj (Vcldouble1), cldouble, conj);
 
+  return result;
+}
+
+int
+test_expm1 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   TEST (expm1 (vfloat1), float, expm1);
   TEST (expm1 (vdouble1), double, expm1);
   TEST (expm1 (vldouble1), ldouble, expm1);
@@ -208,6 +230,13 @@  test (const int Vint4, const long long int Vllong4)
   TEST (expm1 (Vint1), double, expm1);
   TEST (expm1 (Vllong1), double, expm1);
 
+  return result;
+}
+
+int
+test_lrint (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
   TEST2 (lrint (vfloat1), float, long int, lrint);
   TEST2 (lrint (vdouble1), double, long int, lrint);
   TEST2 (lrint (vldouble1), ldouble, long int, lrint);
@@ -219,6 +248,14 @@  test (const int Vint4, const long long int Vllong4)
   TEST2 (lrint (Vint1), double, long int, lrint);
   TEST2 (lrint (Vllong1), double, long int, lrint);
 
+  return result;
+}
+
+int
+test_ldexp (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   TEST (ldexp (vfloat1, 6), float, ldexp);
   TEST (ldexp (vdouble1, 6), double, ldexp);
   TEST (ldexp (vldouble1, 6), ldouble, ldexp);
@@ -230,6 +267,9 @@  test (const int Vint4, const long long int Vllong4)
   TEST (ldexp (Vint1, 6), double, ldexp);
   TEST (ldexp (Vllong1, 6), double, ldexp);
 
+  return result;
+}
+
 #define FIRST(x, y) (y, x)
 #define SECOND(x, y) (x, y)
 #define NON_LDBL_TEST(fn, argm, arg, type, fnt) \
@@ -307,25 +347,82 @@  test (const int Vint4, const long long int Vllong4)
   NON_LDBL_CTEST (fn, FIRST, Vcdouble2, cdouble, fnt); \
   NON_LDBL_CTEST (fn, SECOND, Vcdouble2, cdouble, fnt);
 
+int
+test_atan2 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   BINARY_TEST (atan2, atan2);
 
+  return result;
+}
+
+int
+test_remquo (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+  int quo = 0;
+
 #define my_remquo(x, y) remquo (x, y, &quo)
   BINARY_TEST (my_remquo, remquo);
 #undef my_remquo
 
+  return result;
+}
+
+int
+test_pow (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
   BINARY_CTEST (pow, pow);
 
-  /* Testing all arguments of fma would be just too expensive,
-     so test just some.  */
+  return result;
+}
+
+/* Testing all arguments of fma would be just too expensive,
+   so test just some.  */
+
+int
+test_fma_1 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
 #define my_fma(x, y) fma (x, y, vfloat3)
   BINARY_TEST (my_fma, fma);
 #undef my_fma
+
+  return result;
+}
+
+int
+test_fma_2 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
 #define my_fma(x, y) fma (x, vfloat3, y)
   BINARY_TEST (my_fma, fma);
 #undef my_fma
+
+  return result;
+}
+
+int
+test_fma_3 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
+
 #define my_fma(x, y) fma (Vfloat3, x, y)
   BINARY_TEST (my_fma, fma);
 #undef my_fma
+
+  return result;
+}
+
+int
+test_fma_4 (const int Vint4, const long long int Vllong4)
+{
+  int result = 0;
   TEST (fma (vdouble1, Vdouble2, vllong3), double, fma);
   TEST (fma (vint1, Vint2, vint3), double, fma);
   TEST (fma (Vldouble1, vldouble2, Vldouble3), ldouble, fma);
@@ -337,7 +434,19 @@  test (const int Vint4, const long long int Vllong4)
 static int
 do_test (void)
 {
-  return test (vint1, vllong1);
+  return test_cos (vint1, vllong1)
+	 | test_fabs (vint1, vllong1)
+	 | test_conj (vint1, vllong1)
+	 | test_expm1 (vint1, vllong1)
+	 | test_lrint (vint1, vllong1)
+	 | test_ldexp (vint1, vllong1)
+	 | test_atan2 (vint1, vllong1)
+	 | test_remquo (vint1, vllong1)
+	 | test_pow (vint1, vllong1)
+	 | test_fma_1 (vint1, vllong1)
+	 | test_fma_2 (vint1, vllong1)
+	 | test_fma_3 (vint1, vllong1)
+	 | test_fma_4 (vint1, vllong1);
 }
 
 /* Now generate the three functions.  */