On Mon, Nov 30, 2020 at 06:16:06PM +0800, Hongtao Liu via Gcc-patches wrote: > Add no strict aliasing to function CALC, since there are > > "long long tmp = (*(long long *) &src1[i]) ^ (*(long long *) &src2[i]);" > in function CALC. > > > modified gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c > @@ -9,6 +9,7 @@ > #include "avx512f-mask-type.h" > > void > +__attribute__ ((optimize ("no-strict-aliasing"), noinline)) > CALC (double *s1, double *s2, double *r) > { > int i; > modified gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c
I think that is not the best fix, the CALC routines just want to model the behavior of the instructions, they are just part of the verification that the rest of the test works correctly and so we can just rewrite the code not to violate aliasing. Fixed thusly, committed to the trunk as obvious: 2020-12-08 Jakub Jelinek <ja...@redhat.com> * gcc.target/i386/avx512dq-vandnpd-2.c (CALC): Use union to avoid aliasing violations. * gcc.target/i386/avx512dq-vandnps-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vandpd-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vandps-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vorpd-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vorps-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vxorpd-2.c (CALC): Likewise. * gcc.target/i386/avx512dq-vxorps-2.c (CALC): Likewise. --- gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c.jj 2020-01-14 20:02:47.785594824 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vandnpd-2.c 2020-12-08 11:12:37.106053066 +0100 @@ -16,8 +16,11 @@ CALC (double *s1, double *s2, double *r) for (i = 0; i < SIZE; i++) { - tmp = (~(*(long long *) &s1[i])) & (*(long long *) &s2[i]); - r[i] = *(double *) &tmp; + union U { double d; long long l; } u1, u2; + u1.d = s1[i]; + u2.d = s2[i]; + u1.l = (~u1.l) & u2.l; + r[i] = u1.d; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vandnps-2.c.jj 2020-01-14 20:02:47.785594824 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vandnps-2.c 2020-12-08 11:12:55.033852659 +0100 @@ -16,8 +16,11 @@ CALC (float *s1, float *s2, float *r) for (i = 0; i < SIZE; i++) { - tmp = (~(*(int *) &s1[i])) & (*(int *) &s2[i]); - r[i] = *(float *) &tmp; + union U { float f; int i; } u1, u2; + u1.f = s1[i]; + u2.f = s2[i]; + u1.i = (~u1.i) & u2.i; + r[i] = u1.f; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c.jj 2020-01-14 20:02:47.785594824 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vandpd-2.c 2020-12-08 11:10:03.767767230 +0100 @@ -16,8 +16,11 @@ CALC (double *s1, double *s2, double *r) for (i = 0; i < SIZE; i++) { - tmp = (*(long long *) &s1[i]) & (*(long long *) &s2[i]); - r[i] = *(double *) &tmp; + union U { double d; long long l; } u1, u2; + u1.d = s1[i]; + u2.d = s2[i]; + u1.l &= u2.l; + r[i] = u1.d; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vandps-2.c.jj 2020-01-14 20:02:47.785594824 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vandps-2.c 2020-12-08 11:11:51.548562356 +0100 @@ -16,8 +16,11 @@ CALC (float *s1, float *s2, float *r) for (i = 0; i < SIZE; i++) { - tmp = (*(int *) &s1[i]) & (*(int *) &s2[i]); - r[i] = *(float *) &tmp; + union U { float f; int i; } u1, u2; + u1.f = s1[i]; + u2.f = s2[i]; + u1.i &= u2.i; + r[i] = u1.f; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vorpd-2.c.jj 2020-01-14 20:02:47.786594810 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vorpd-2.c 2020-12-08 11:15:35.497058846 +0100 @@ -15,8 +15,11 @@ CALC (double *src1, double *src2, double for (i = 0; i < SIZE; i++) { - long long tmp = (*(long long *) &src1[i]) | (*(long long *) &src2[i]); - dst[i] = *(double *) &tmp; + union U { double d; long long l; } u1, u2; + u1.d = src1[i]; + u2.d = src2[i]; + u1.l |= u2.l; + dst[i] = u1.d; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vorps-2.c.jj 2020-01-14 20:02:47.786594810 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vorps-2.c 2020-12-08 11:15:45.737944364 +0100 @@ -15,8 +15,11 @@ CALC (float *src1, float *src2, float *d for (i = 0; i < SIZE; i++) { - int tmp = (*(int *) &src1[i]) | (*(int *) &src2[i]); - dst[i] = *(float *) &tmp; + union U { float f; int i; } u1, u2; + u1.f = src1[i]; + u2.f = src2[i]; + u1.i |= u2.i; + dst[i] = u1.f; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-2.c.jj 2020-01-14 20:02:47.787594795 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vxorpd-2.c 2020-12-08 11:15:59.644788891 +0100 @@ -15,8 +15,11 @@ CALC (double *src1, double *src2, double for (i = 0; i < SIZE; i++) { - long long tmp = (*(long long *) &src1[i]) ^ (*(long long *) &src2[i]); - dst[i] = *(double *) &tmp; + union U { double d; long long l; } u1, u2; + u1.d = src1[i]; + u2.d = src2[i]; + u1.l ^= u2.l; + dst[i] = u1.d; } } --- gcc/testsuite/gcc.target/i386/avx512dq-vxorps-2.c.jj 2020-01-14 20:02:47.787594795 +0100 +++ gcc/testsuite/gcc.target/i386/avx512dq-vxorps-2.c 2020-12-08 11:16:07.549700530 +0100 @@ -15,8 +15,11 @@ CALC (float *src1, float *src2, float *d for (i = 0; i < SIZE; i++) { - int tmp = (*(int *) &src1[i]) ^ (*(int *) &src2[i]); - dst[i] = *(float *) &tmp; + union U { float f; int i; } u1, u2; + u1.f = src1[i]; + u2.f = src2[i]; + u1.i ^= u2.i; + dst[i] = u1.f; } } Jakub