Hi:
  ix86_expand_fp_vec_cmp/ix86_expand_int_vec_cmp are used by vec_cmpmn
for vector comparison to vector mask, but ix86_expand_sse_cmp(which is
called in upper 2 functions.) may return integer mask whenever integer
mask is available, so convert integer mask back to vector mask if
needed.

gcc/ChangeLog:

        PR target/98537
        * config/i386/i386-expand.c (ix86_expand_fp_vec_cmp):
        When cmp is integer mask, convert it to vector.
        (ix86_expand_int_vec_cmp): Ditto.

gcc/testsuite/ChangeLog:

        PR target/98537
        * g++.target/i386/avx512bw-pr98537-1.C: New test.
        * g++.target/i386/avx512vl-pr98537-1.C: New test.
        * g++.target/i386/avx512vl-pr98537-2.C: New test.

--
BR,
Hongtao
From f7c8341793639c401199d5029053244cd7e5f828 Mon Sep 17 00:00:00 2001
From: liuhongt <hongtao.liu@intel.com>
Date: Wed, 6 Jan 2021 11:24:00 +0800
Subject: [PATCH] [AVX512] Fix ICE: Convert integer mask to vector in
 ix86_expand_fp_vec_cmp/ix86_expand_int_vec_cmp [PR98537]

gcc/ChangeLog:

	PR target/98537
	* config/i386/i386-expand.c (ix86_expand_fp_vec_cmp):
	When cmp is integer mask, convert it to vector.
	(ix86_expand_int_vec_cmp): Ditto.

gcc/testsuite/ChangeLog:

	PR target/98537
	* g++.target/i386/avx512bw-pr98537-1.C: New test.
	* g++.target/i386/avx512vl-pr98537-1.C: New test.
	* g++.target/i386/avx512vl-pr98537-2.C: New test.
---
 gcc/config/i386/i386-expand.c                 | 28 +++++++++++--
 .../g++.target/i386/avx512bw-pr98537-1.C      | 11 +++++
 .../g++.target/i386/avx512vl-pr98537-1.C      | 40 +++++++++++++++++++
 .../g++.target/i386/avx512vl-pr98537-2.C      |  8 ++++
 4 files changed, 84 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C
 create mode 100644 gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C
 create mode 100644 gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C

diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index 6e08fd32726..c879953b023 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -3991,6 +3991,7 @@ bool
 ix86_expand_fp_vec_cmp (rtx operands[])
 {
   enum rtx_code code = GET_CODE (operands[1]);
+  machine_mode dest_mode = GET_MODE (operands[0]);
   rtx cmp;
 
   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
@@ -4024,8 +4025,18 @@ ix86_expand_fp_vec_cmp (rtx operands[])
     cmp = ix86_expand_sse_cmp (operands[0], code, operands[2], operands[3],
 			       operands[1], operands[2]);
 
-  if (operands[0] != cmp)
-    emit_move_insn (operands[0], cmp);
+    if (operands[0] != cmp)
+    {
+      if (GET_MODE (cmp) == dest_mode)
+	emit_move_insn (operands[0], cmp);
+      else
+	{
+	  gcc_assert (ix86_valid_mask_cmp_mode (dest_mode));
+	  ix86_expand_sse_movcc (operands[0], cmp,
+				 CONSTM1_RTX (dest_mode),
+				 CONST0_RTX (dest_mode));
+	}
+    }
 
   return true;
 }
@@ -4286,6 +4297,7 @@ bool
 ix86_expand_int_vec_cmp (rtx operands[])
 {
   rtx_code code = GET_CODE (operands[1]);
+  machine_mode dest_mode = GET_MODE (operands[0]);
   bool negate = false;
   rtx cmp = ix86_expand_int_sse_cmp (operands[0], code, operands[2],
 				     operands[3], NULL, NULL, &negate);
@@ -4301,7 +4313,17 @@ ix86_expand_int_vec_cmp (rtx operands[])
   gcc_assert (!negate);
 
   if (operands[0] != cmp)
-    emit_move_insn (operands[0], cmp);
+    {
+      if (GET_MODE (cmp) == dest_mode)
+	emit_move_insn (operands[0], cmp);
+      else
+	{
+	  gcc_assert (ix86_valid_mask_cmp_mode (dest_mode));
+	  ix86_expand_sse_movcc (operands[0], cmp,
+				 CONSTM1_RTX (dest_mode),
+				 CONST0_RTX (dest_mode));
+	}
+    }
 
   return true;
 }
diff --git a/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C b/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C
new file mode 100644
index 00000000000..969684a222b
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C
@@ -0,0 +1,11 @@
+/* PR target/98537 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64 -std=c++11" } */
+
+#define TYPEV char
+#define TYPEW short
+
+#define T_ARR						\
+  __attribute__ ((target ("avx512vl,avx512bw")))
+
+#include "avx512vl-pr98537-1.C"
diff --git a/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C
new file mode 100644
index 00000000000..b2ba91111da
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-1.C
@@ -0,0 +1,40 @@
+/* PR target/98537 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64 -std=c++11" } */
+
+#ifndef TYPEV
+#define TYPEV int
+#endif
+
+#ifndef TYPEW
+#define TYPEW long long
+#endif
+
+#ifndef T_ARR
+#define T_ARR					\
+  __attribute__ ((target ("avx512vl")))
+#endif
+
+typedef TYPEV V __attribute__((__vector_size__(32)));
+typedef TYPEW W __attribute__((__vector_size__(32)));
+
+W c, d;
+struct B {};
+B e;
+struct C { W i; };
+void foo (C);
+
+C
+operator== (B, B)
+{
+  W r = (V)c == (V)d;
+  return {r};
+}
+
+void
+T_ARR
+bar ()
+{
+  B a;
+  foo (a == e);
+}
diff --git a/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C
new file mode 100644
index 00000000000..42c9682746d
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/avx512vl-pr98537-2.C
@@ -0,0 +1,8 @@
+/* PR target/98537 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64 -std=c++11" } */
+
+#define TYPEV float
+#define TYPEW double
+
+#include "avx512vl-pr98537-1.C"
-- 
2.18.1

Reply via email to