On Tue, Dec 8, 2020 at 6:23 PM Jakub Jelinek <ja...@redhat.com> wrote: > > 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 >
Yes, thanks. -- BR, Hongtao