Fix test-math-vector-sincos.h aliasing.
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.
This commit is contained in:
parent
ff80ec4283
commit
ffe308e4fc
|
@ -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.
|
||||
|
|
|
@ -17,14 +17,14 @@
|
|||
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); \
|
||||
|
|
Loading…
Reference in New Issue