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

Reply via email to