re PR target/85832 ([AVX512] possible shorter code when comparing with vector of...
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Jun 2018 13:49:55 +0000 (15:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 4 Jun 2018 13:49:55 +0000 (15:49 +0200)
PR target/85832
PR target/86036
* config/i386/sse.md (<avx512>_eq<mode>3<mask_scalar_merge_name>_1):
Use vptestnm rather than vptestm in (=Yc,v,C) variant.

* gcc.target/i386/avx512f-pr85832.c: Expect vptestnm rather than
vptestm.
* gcc.target/i386/avx512vl-pr85832.c: Likewise.
* gcc.target/i386/avx512vlbw-pr85832.c: Likewise.
* gcc.target/i386/avx512bw-pr85832.c: Likewise.
* gcc.target/i386/avx512bw-pr86036.c: New test.

From-SVN: r261148

gcc/ChangeLog
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512bw-pr85832.c
gcc/testsuite/gcc.target/i386/avx512bw-pr86036.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/avx512f-pr85832.c
gcc/testsuite/gcc.target/i386/avx512vl-pr85832.c
gcc/testsuite/gcc.target/i386/avx512vlbw-pr85832.c

index 83a7a4f..eea0298 100644 (file)
@@ -1,3 +1,10 @@
+2018-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/85832
+       PR target/86036
+       * config/i386/sse.md (<avx512>_eq<mode>3<mask_scalar_merge_name>_1):
+       Use vptestnm rather than vptestm in (=Yc,v,C) variant.
+
 2018-06-04  Richard Biener  <rguenther@suse.de>
 
        * tree-cfgcleanup.c (cleanup_tree_cfg_1): Fold into...
index 0825894..2d4e495 100644 (file)
   "TARGET_AVX512BW && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
   "@
    vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}
-   vptestm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
+   vptestnm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
   [(set_attr "type" "ssecmp")
    (set_attr "prefix_extra" "1")
    (set_attr "prefix" "evex")
   "TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
   "@
    vpcmpeq<ssemodesuffix>\t{%2, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %2}
-   vptestm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
+   vptestnm<ssemodesuffix>\t{%1, %1, %0<mask_scalar_merge_operand3>|%0<mask_scalar_merge_operand3>, %1, %1}"
   [(set_attr "type" "ssecmp")
    (set_attr "prefix_extra" "1")
    (set_attr "prefix" "evex")
index 6ec5c50..043a4f4 100644 (file)
@@ -1,3 +1,14 @@
+2018-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/85832
+       PR target/86036
+       * gcc.target/i386/avx512f-pr85832.c: Expect vptestnm rather than
+       vptestm.
+       * gcc.target/i386/avx512vl-pr85832.c: Likewise.
+       * gcc.target/i386/avx512vlbw-pr85832.c: Likewise.
+       * gcc.target/i386/avx512bw-pr85832.c: Likewise.
+       * gcc.target/i386/avx512bw-pr86036.c: New test.
+
 2018-06-04  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/86038
index 40e4a2a..a406e08 100644 (file)
@@ -1,8 +1,8 @@
 /* PR target/85832 */
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512bw -mno-avx512vl -masm=att" } */
-/* { dg-final { scan-assembler-times {\mvptestmb\M} 1 } } */
-/* { dg-final { scan-assembler-times {\mvptestmw\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmb\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmw\M} 1 } } */
 
 #include <x86intrin.h>
 
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-pr86036.c b/gcc/testsuite/gcc.target/i386/avx512bw-pr86036.c
new file mode 100644 (file)
index 0000000..47685e5
--- /dev/null
@@ -0,0 +1,48 @@
+/* PR target/86036 */
+/* { dg-do run } */
+/* { dg-options "-O -mavx512bw" } */
+/* { dg-require-effective-target avx512bw } */
+
+#define AVX512BW
+#include "avx512f-helper.h"
+
+typedef unsigned short V __attribute__ ((vector_size (64)));
+
+__attribute__((noipa)) V
+foo (V a)
+{
+  return a >= 3;
+}
+
+__attribute__((noipa)) V
+bar (V a)
+{
+  return a != 0;
+}
+
+__attribute__((noipa)) V
+baz (V a)
+{
+  return a == 0;
+}
+
+void
+TEST (void)
+{
+  V a = (V) { 3, 17, 2, 0, 9, 1, 2, 3, 0, 0, 0, 3, 3, 3, 3, 3,
+             9, 16387, 9, 3, 3, 0, 0, 3, 3, 3, 0, 0, 0, 0, 3, 3 };
+  V b = foo (a);
+  V c = (V) { -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, -1, -1, -1, -1,
+             -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, 0, 0, -1, -1 };
+  if (__builtin_memcmp (&b, &c, sizeof (b)))
+    abort ();
+  V d = bar (a);
+  V e = (V) { -1, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1,
+             -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, 0, 0, -1, -1 };
+  if (__builtin_memcmp (&d, &e, sizeof (d)))
+    abort ();
+  V f = baz (a);
+  V g = ~e;
+  if (__builtin_memcmp (&f, &g, sizeof (f)))
+    abort ();
+}
index 98b7140..a169776 100644 (file)
@@ -1,8 +1,8 @@
 /* PR target/85832 */
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512f -mno-avx512vl -mno-avx512bw -masm=att" } */
-/* { dg-final { scan-assembler-times {\mvptestmd\M} 1 } } */
-/* { dg-final { scan-assembler-times {\mvptestmq\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmd\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmq\M} 1 } } */
 
 #include <x86intrin.h>
 
index 6eb7178..09ed893 100644 (file)
@@ -1,8 +1,8 @@
 /* PR target/85832 */
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512vl -mno-avx512bw -masm=att" } */
-/* { dg-final { scan-assembler-times {\mvptestmd\M} 2 } } */
-/* { dg-final { scan-assembler-times {\mvptestmq\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmd\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmq\M} 2 } } */
 
 #include <x86intrin.h>
 
index 6fbdf5a..ee93e0d 100644 (file)
@@ -1,8 +1,8 @@
 /* PR target/85832 */
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512vl -mavx512bw -masm=att" } */
-/* { dg-final { scan-assembler-times {\mvptestmb\M} 2 } } */
-/* { dg-final { scan-assembler-times {\mvptestmw\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmb\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mvptestnmw\M} 2 } } */
 
 #include <x86intrin.h>