[r11-5391 Regression] FAIL: gcc.target/i386/avx512vl-vxorpd-2.c execution test on Linux/x86_64

Jakub Jelinek jakub@redhat.com
Tue Dec 8 10:22:56 GMT 2020


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  <jakub@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



More information about the Gcc-regression mailing list