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