aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-05-25 14:36:03 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-05-25 14:36:03 +0200
commitb55f342bdd8bec16b727a5889c589dd85c5ca3c3 (patch)
treeb8c50ed8706218048b0b1b202e265706550cc1ef /gcc
parent8e846c6670b85cd69a5760a604d8f9ce0dbc3730 (diff)
downloadgcc-b55f342bdd8bec16b727a5889c589dd85c5ca3c3.zip
gcc-b55f342bdd8bec16b727a5889c589dd85c5ca3c3.tar.gz
gcc-b55f342bdd8bec16b727a5889c589dd85c5ca3c3.tar.bz2
re PR target/85832 ([AVX512] possible shorter code when comparing with vector of zeros)
PR target/85832 * config/i386/sse.md (<avx512>_eq<mode>3<mask_scalar_merge_name>_1): Add (=Yk,v,C) variant using vptestm insn. Use TARGET_AVX512BW in test instead of TARGET_AVX512F for VI12_AVX512VL iterator. * gcc.target/i386/avx512f-pr85832.c: New test. * gcc.target/i386/avx512vl-pr85832.c: New test. * gcc.target/i386/avx512bw-pr85832.c: New test. * gcc.target/i386/avx512vlbw-pr85832.c: New test. From-SVN: r260756
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/sse.md22
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/avx512bw-pr85832.c19
-rw-r--r--gcc/testsuite/gcc.target/i386/avx512f-pr85832.c19
-rw-r--r--gcc/testsuite/gcc.target/i386/avx512vl-pr85832.c31
-rw-r--r--gcc/testsuite/gcc.target/i386/avx512vlbw-pr85832.c31
7 files changed, 128 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4d8410e..adaa0b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-05-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/85832
+ * config/i386/sse.md (<avx512>_eq<mode>3<mask_scalar_merge_name>_1):
+ Add (=Yk,v,C) variant using vptestm insn. Use TARGET_AVX512BW
+ in test instead of TARGET_AVX512F for VI12_AVX512VL iterator.
+
2018-05-25 Richard Biener <rguenther@suse.de>
* tree-vect-data-refs.c (vect_find_stmt_data_reference): New
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index afe18d6..a11180f 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -11207,26 +11207,30 @@
"ix86_fixup_binary_operands_no_copy (EQ, <MODE>mode, operands);")
(define_insn "<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
- [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
+ [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk,Yk")
(unspec:<avx512fmaskmode>
- [(match_operand:VI12_AVX512VL 1 "nonimmediate_operand" "%v")
- (match_operand:VI12_AVX512VL 2 "nonimmediate_operand" "vm")]
+ [(match_operand:VI12_AVX512VL 1 "vector_move_operand" "%v,v")
+ (match_operand:VI12_AVX512VL 2 "vector_move_operand" "vm,C")]
UNSPEC_MASKED_EQ))]
- "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}"
+ "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}"
[(set_attr "type" "ssecmp")
(set_attr "prefix_extra" "1")
(set_attr "prefix" "evex")
(set_attr "mode" "<sseinsnmode>")])
(define_insn "<avx512>_eq<mode>3<mask_scalar_merge_name>_1"
- [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk")
+ [(set (match_operand:<avx512fmaskmode> 0 "register_operand" "=Yk,Yk")
(unspec:<avx512fmaskmode>
- [(match_operand:VI48_AVX512VL 1 "nonimmediate_operand" "%v")
- (match_operand:VI48_AVX512VL 2 "nonimmediate_operand" "vm")]
+ [(match_operand:VI48_AVX512VL 1 "vector_move_operand" "%v,v")
+ (match_operand:VI48_AVX512VL 2 "vector_move_operand" "vm,C")]
UNSPEC_MASKED_EQ))]
"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}"
+ "@
+ 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}"
[(set_attr "type" "ssecmp")
(set_attr "prefix_extra" "1")
(set_attr "prefix" "evex")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7d7fc8c..62862e5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2018-05-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/85832
+ * gcc.target/i386/avx512f-pr85832.c: New test.
+ * gcc.target/i386/avx512vl-pr85832.c: New test.
+ * gcc.target/i386/avx512bw-pr85832.c: New test.
+ * gcc.target/i386/avx512vlbw-pr85832.c: New test.
+
2018-05-25 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/85720
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-pr85832.c b/gcc/testsuite/gcc.target/i386/avx512bw-pr85832.c
new file mode 100644
index 0000000..40e4a2a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512bw-pr85832.c
@@ -0,0 +1,19 @@
+/* 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 } } */
+
+#include <x86intrin.h>
+
+int
+f1 (__m512i x)
+{
+ return _mm512_cmpeq_epi8_mask (x, _mm512_setzero_si512 ());
+}
+
+int
+f2 (__m512i x)
+{
+ return _mm512_cmpeq_epi16_mask (x, _mm512_setzero_si512 ());
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-pr85832.c b/gcc/testsuite/gcc.target/i386/avx512f-pr85832.c
new file mode 100644
index 0000000..98b7140
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512f-pr85832.c
@@ -0,0 +1,19 @@
+/* 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 } } */
+
+#include <x86intrin.h>
+
+int
+f1 (__m512i x)
+{
+ return _mm512_cmpeq_epi32_mask (x, _mm512_setzero_si512 ());
+}
+
+int
+f2 (__m512i x)
+{
+ return _mm512_cmpeq_epi64_mask (x, _mm512_setzero_si512 ());
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vl-pr85832.c b/gcc/testsuite/gcc.target/i386/avx512vl-pr85832.c
new file mode 100644
index 0000000..6eb71781
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vl-pr85832.c
@@ -0,0 +1,31 @@
+/* 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 } } */
+
+#include <x86intrin.h>
+
+int
+f1 (__m256i x)
+{
+ return _mm256_cmpeq_epi32_mask (x, _mm256_setzero_si256 ());
+}
+
+int
+f2 (__m256i x)
+{
+ return _mm256_cmpeq_epi64_mask (x, _mm256_setzero_si256 ());
+}
+
+int
+f3 (__m128i x)
+{
+ return _mm_cmpeq_epi32_mask (x, _mm_setzero_si128 ());
+}
+
+int
+f4 (__m128i x)
+{
+ return _mm_cmpeq_epi64_mask (x, _mm_setzero_si128 ());
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512vlbw-pr85832.c b/gcc/testsuite/gcc.target/i386/avx512vlbw-pr85832.c
new file mode 100644
index 0000000..6fbdf5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx512vlbw-pr85832.c
@@ -0,0 +1,31 @@
+/* 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 } } */
+
+#include <x86intrin.h>
+
+int
+f1 (__m256i x)
+{
+ return _mm256_cmpeq_epi8_mask (x, _mm256_setzero_si256 ());
+}
+
+int
+f2 (__m256i x)
+{
+ return _mm256_cmpeq_epi16_mask (x, _mm256_setzero_si256 ());
+}
+
+int
+f3 (__m128i x)
+{
+ return _mm_cmpeq_epi8_mask (x, _mm_setzero_si128 ());
+}
+
+int
+f4 (__m128i x)
+{
+ return _mm_cmpeq_epi16_mask (x, _mm_setzero_si128 ());
+}