diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-08-12 11:26:57 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-08-12 11:26:57 +0200 |
commit | 04b4f3152593f85b05974528d1607619dd77d702 (patch) | |
tree | 0eb7800d2424aa21abacf7343a299d158b6525f8 /gcc | |
parent | 01f8a8b48e50cbaa68b878d9f8a330b8c0736bed (diff) | |
download | gcc-04b4f3152593f85b05974528d1607619dd77d702.zip gcc-04b4f3152593f85b05974528d1607619dd77d702.tar.gz gcc-04b4f3152593f85b05974528d1607619dd77d702.tar.bz2 |
i386: Fix up V32HImode permutations with -mno-avx512bw [PR101860]
My patch from yesterday apparently broke some V32HImode permutations
as the testcase shows.
The first function assumed it would never be called in d->testing_p mode
and so went right away into emitting the code.
And the second one assumed V32HImode would never reach it, which now
can for the !TARGET_AVX512BW case. We don't have a instruction
in that case though.
2021-08-12 Jakub Jelinek <jakub@redhat.com>
PR target/101860
* config/i386/i386-expand.c (ix86_expand_vec_one_operand_perm_avx512):
If d->testing_p, return true after performing checks instead of
actually expanding the insn.
(expand_vec_perm_broadcast_1): Handle V32HImode - assert
!TARGET_AVX512BW and return false.
* gcc.target/i386/avx512f-pr101860.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386-expand.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/avx512f-pr101860.c | 5 |
2 files changed, 12 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index c708b33..a652b25 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -18116,6 +18116,9 @@ ix86_expand_vec_one_operand_perm_avx512 (struct expand_vec_perm_d *d) return false; } + if (d->testing_p) + return true; + target = d->target; op0 = d->op0; for (int i = 0; i < d->nelt; ++i) @@ -20481,6 +20484,10 @@ expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d) gcc_assert (!TARGET_AVX2 || d->perm[0]); return false; + case E_V32HImode: + gcc_assert (!TARGET_AVX512BW); + return false; + default: gcc_unreachable (); } diff --git a/gcc/testsuite/gcc.target/i386/avx512f-pr101860.c b/gcc/testsuite/gcc.target/i386/avx512f-pr101860.c new file mode 100644 index 0000000..1aadfa2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/avx512f-pr101860.c @@ -0,0 +1,5 @@ +/* PR target/101860 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mavx512f -mno-avx512bw" } */ + +#include "../../gcc.dg/torture/vshuf-v32hi.c" |