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 <[email protected]>
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