Fix test-math-vector-sincos.h aliasing.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 15 Mar 2017 17:32:46 +0000 (17:32 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 15 Mar 2017 17:32:46 +0000 (17:32 +0000)
x86_64 libmvec tests have been failing to build lately with GCC
mainline with -Wuninitialized errors, and Markus Trippelsdorf traced
this to an aliasing issue
<https://sourceware.org/ml/libc-alpha/2017-03/msg00169.html>.

This patch fixes the aliasing issue, so that the vectors-of-pointers
are initialized using a union instead of pointer casts.  This also
fixes the testsuite build failures with GCC mainline.

Tested for x86_64 (full testsuite with GCC 6; testsuite build with GCC
mainline with build-many-glibcs.py).

* sysdeps/x86/fpu/test-math-vector-sincos.h (INIT_VEC_PTRS_LOOP):
Use a union when storing pointers.
(VECTOR_WRAPPER_fFF_2): Do not take address of integer vector and
cast result when passing to INIT_VEC_PTRS_LOOP.
(VECTOR_WRAPPER_fFF_3): Likewise.
(VECTOR_WRAPPER_fFF_4): Likewise.

ChangeLog
sysdeps/x86/fpu/test-math-vector-sincos.h

index 9885c59..06d7673 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-03-15  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/x86/fpu/test-math-vector-sincos.h (INIT_VEC_PTRS_LOOP):
+       Use a union when storing pointers.
+       (VECTOR_WRAPPER_fFF_2): Do not take address of integer vector and
+       cast result when passing to INIT_VEC_PTRS_LOOP.
+       (VECTOR_WRAPPER_fFF_3): Likewise.
+       (VECTOR_WRAPPER_fFF_4): Likewise.
+
 2017-03-14  Gabriel F. T. Gomes  <gftg@linux.vnet.ibm.com>
 
        * include/bits/mathcalls-helper-functions.h: New file.
index 5043b32..95282a3 100644 (file)
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define INIT_VEC_PTRS_LOOP(vec, val, len)                      \
-  do                                                           \
-    {                                                          \
-      for (i = 0; i < len; i++)                                        \
-        {                                                      \
-          vec[i] = &val[i];                                    \
-        }                                                      \
-    }                                                          \
+#define INIT_VEC_PTRS_LOOP(vec, val, len)                              \
+  do                                                                   \
+    {                                                                  \
+      union { VEC_INT_TYPE v; __typeof__ ((val)[0]) *a[(len)]; } u;    \
+      for (i = 0; i < len; i++)                                                \
+       u.a[i] = &(val)[i];                                             \
+      (vec) = u.v;                                                     \
+    }                                                                  \
   while (0)
 
 /* Wrapper for vector sincos/sincosf compatible with x86_64 and x32 variants
@@ -40,8 +40,8 @@ void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)             \
   VEC_TYPE mx;                                                 \
   VEC_INT_TYPE mr, mr1;                                                \
   INIT_VEC_LOOP (mx, x, VEC_LEN);                              \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr), r_loc, VEC_LEN);       \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr1), r1_loc, VEC_LEN);     \
+  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN);                     \
+  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN);                   \
   vector_func (mx, mr, mr1);                                   \
   TEST_VEC_LOOP (r_loc, VEC_LEN);                              \
   TEST_VEC_LOOP (r1_loc, VEC_LEN);                             \
@@ -63,8 +63,8 @@ void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)             \
   VEC_TYPE mx;                                                 \
   VEC_INT_TYPE mr, mr1;                                                \
   INIT_VEC_LOOP (mx, x, VEC_LEN);                              \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr), r_loc, VEC_LEN/2);     \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr1), r1_loc, VEC_LEN/2);   \
+  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/2);                   \
+  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/2);                 \
   vector_func (mx, mr, mr, mr1, mr1);                          \
   TEST_VEC_LOOP (r_loc, VEC_LEN/2);                            \
   TEST_VEC_LOOP (r1_loc, VEC_LEN/2);                           \
@@ -87,8 +87,8 @@ void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)             \
   VEC_TYPE mx;                                                 \
   VEC_INT_TYPE mr, mr1;                                                \
   INIT_VEC_LOOP (mx, x, VEC_LEN);                              \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr), r_loc, VEC_LEN/4);     \
-  INIT_VEC_PTRS_LOOP (((FLOAT **) &mr1), r1_loc, VEC_LEN/4);   \
+  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/4);                   \
+  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/4);                 \
   vector_func (mx, mr, mr, mr, mr, mr1, mr1, mr1, mr1);                \
   TEST_VEC_LOOP (r_loc, VEC_LEN/4);                            \
   TEST_VEC_LOOP (r1_loc, VEC_LEN/4);                           \