]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/91150 (wrong code with -O -mavx512vbmi due to wrong writemask)
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Aug 2019 12:49:27 +0000 (14:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Aug 2019 12:49:27 +0000 (14:49 +0200)
Backported from mainline
2019-07-30  Jakub Jelinek  <jakub@redhat.com>

PR target/91150
* config/i386/i386.c (expand_vec_perm_blend): Change mask type
from unsigned to unsigned HOST_WIDE_INT.  For E_V64QImode cast
comparison to unsigned HOST_WIDE_INT before shifting it left.

* gcc.target/i386/avx512bw-pr91150.c: New test.

From-SVN: r275164

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c [new file with mode: 0644]

index 2fa1b755c688a0f459536984f8082b71f1e47ac8..efb5a22004ea74e22d20ec54e53a421a8169cb0c 100644 (file)
@@ -1,6 +1,13 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-07-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/91150
+       * config/i386/i386.c (expand_vec_perm_blend): Change mask type
+       from unsigned to unsigned HOST_WIDE_INT.  For E_V64QImode cast
+       comparison to unsigned HOST_WIDE_INT before shifting it left.
+
        2019-07-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/78884
index 3658759a62e9f1d2270314817e3e9b8677b6eb3d..532ba05ceb98fe625788e2d3915eb6e75653dfd3 100644 (file)
@@ -46824,7 +46824,8 @@ static bool
 expand_vec_perm_blend (struct expand_vec_perm_d *d)
 {
   machine_mode mmode, vmode = d->vmode;
-  unsigned i, mask, nelt = d->nelt;
+  unsigned i, nelt = d->nelt;
+  unsigned HOST_WIDE_INT mask;
   rtx target, op0, op1, maskop, x;
   rtx rperm[32], vperm;
 
@@ -46878,7 +46879,7 @@ expand_vec_perm_blend (struct expand_vec_perm_d *d)
     case V16SImode:
     case V8DImode:
       for (i = 0; i < nelt; ++i)
-       mask |= (d->perm[i] >= nelt) << i;
+       mask |= ((unsigned HOST_WIDE_INT) (d->perm[i] >= nelt)) << i;
       break;
 
     case V2DImode:
index 048960ab12243cf6ca7a74773fe73b5ef867c35d..8dcdce7a406b59b83a40eab2d20f0ce46c10ff53 100644 (file)
@@ -1,6 +1,11 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-07-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/91150
+       * gcc.target/i386/avx512bw-pr91150.c: New test.
+
        2019-07-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/78884
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c b/gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c
new file mode 100644 (file)
index 0000000..4f809a0
--- /dev/null
@@ -0,0 +1,37 @@
+/* PR target/91150 */
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512bw" } */
+/* { dg-require-effective-target avx512bw } */
+
+#include "avx512bw-check.h"
+
+typedef unsigned char V __attribute__((vector_size (64)));
+
+__attribute__((noinline, noclone)) void
+foo (V *x, V *y, V *z)
+{
+  *x = __builtin_shuffle (*y, *z, (V) { 0, 1, 2, 3, 4, 5, 6, 7, 8,
+                                       9, 10, 11, 12, 13, 14, 15,
+                                       80, 81, 82, 83, 84, 85, 86, 87,
+                                       88, 89, 90, 91, 92, 93, 94, 95,
+                                       96, 97, 98, 99, 100, 101, 102, 103,
+                                       104, 105, 106, 107, 108, 109, 110, 111,
+                                       112, 113, 114, 115, 116, 117, 118, 119,
+                                       120, 121, 122, 123, 124, 125, 126, 127 });
+}
+
+static void
+avx512bw_test (void)
+{
+  union U { unsigned char a[64]; V v; } a, b, c;
+  int i;
+  for (i = 0; i < 64; i++)
+    {
+      b.a[i] = i + 1;
+      c.a[i] = i + 65;
+    }
+  foo (&a.v, &b.v, &c.v);
+  for (i = 0; i < 64; i++)
+    if (a.a[i] != (i < 16 ? i + 1 : i + 65))
+      __builtin_abort ();
+}