From: Jakub Jelinek Date: Fri, 30 Aug 2019 12:49:27 +0000 (+0200) Subject: backport: re PR target/91150 (wrong code with -O -mavx512vbmi due to wrong writemask) X-Git-Tag: releases/gcc-7.5.0~199 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f2a425e2cd1c3b5a5a332b7b711498de225991a;p=thirdparty%2Fgcc.git backport: re PR target/91150 (wrong code with -O -mavx512vbmi due to wrong writemask) Backported from mainline 2019-07-30 Jakub Jelinek PR target/91150 * config/i386/i386.c (expand_vec_perm_blend): Change mask type from unsigned to unsigned HOST_WIDE_INT. For E_V64QImode cast comparison to unsigned HOST_WIDE_INT before shifting it left. * gcc.target/i386/avx512bw-pr91150.c: New test. From-SVN: r275164 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2fa1b755c688..efb5a22004ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-07-30 Jakub Jelinek + + PR target/91150 + * config/i386/i386.c (expand_vec_perm_blend): Change mask type + from unsigned to unsigned HOST_WIDE_INT. For E_V64QImode cast + comparison to unsigned HOST_WIDE_INT before shifting it left. + 2019-07-04 Jakub Jelinek PR middle-end/78884 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 3658759a62e9..532ba05ceb98 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -46824,7 +46824,8 @@ static bool expand_vec_perm_blend (struct expand_vec_perm_d *d) { machine_mode mmode, vmode = d->vmode; - unsigned i, mask, nelt = d->nelt; + unsigned i, nelt = d->nelt; + unsigned HOST_WIDE_INT mask; rtx target, op0, op1, maskop, x; rtx rperm[32], vperm; @@ -46878,7 +46879,7 @@ expand_vec_perm_blend (struct expand_vec_perm_d *d) case V16SImode: case V8DImode: for (i = 0; i < nelt; ++i) - mask |= (d->perm[i] >= nelt) << i; + mask |= ((unsigned HOST_WIDE_INT) (d->perm[i] >= nelt)) << i; break; case V2DImode: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 048960ab1224..8dcdce7a406b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-07-30 Jakub Jelinek + + PR target/91150 + * gcc.target/i386/avx512bw-pr91150.c: New test. + 2019-07-04 Jakub Jelinek PR middle-end/78884 diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c b/gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c new file mode 100644 index 000000000000..4f809a0f7f71 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/avx512bw-pr91150.c @@ -0,0 +1,37 @@ +/* PR target/91150 */ +/* { dg-do run } */ +/* { dg-options "-O2 -mavx512bw" } */ +/* { dg-require-effective-target avx512bw } */ + +#include "avx512bw-check.h" + +typedef unsigned char V __attribute__((vector_size (64))); + +__attribute__((noinline, noclone)) void +foo (V *x, V *y, V *z) +{ + *x = __builtin_shuffle (*y, *z, (V) { 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127 }); +} + +static void +avx512bw_test (void) +{ + union U { unsigned char a[64]; V v; } a, b, c; + int i; + for (i = 0; i < 64; i++) + { + b.a[i] = i + 1; + c.a[i] = i + 65; + } + foo (&a.v, &b.v, &c.v); + for (i = 0; i < 64; i++) + if (a.a[i] != (i < 16 ? i + 1 : i + 65)) + __builtin_abort (); +}