diff options
author | liuhongt <hongtao.liu@intel.com> | 2021-04-28 14:52:59 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2021-06-22 09:34:47 +0800 |
commit | b6efffa552cee6a20a58c91e5f41466c5715d73d (patch) | |
tree | 46b4eef0150046294b84a42ebcbcae0c02206807 | |
parent | 2f080224cfa9de0e215324c6ac242d6ee3f27172 (diff) | |
download | gcc-b6efffa552cee6a20a58c91e5f41466c5715d73d.zip gcc-b6efffa552cee6a20a58c91e5f41466c5715d73d.tar.gz gcc-b6efffa552cee6a20a58c91e5f41466c5715d73d.tar.bz2 |
Fix ICE for vpexpand*.
gcc/ChangeLog
PR target/100310
* config/i386/i386-expand.c
(ix86_expand_special_args_builtin): Keep constm1_operand only
if it satisfies insn's operand predicate.
gcc/testsuite/ChangeLog
PR target/100310
* gcc.target/i386/pr100310.c: New test.
-rw-r--r-- | gcc/config/i386/i386-expand.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr100310.c | 12 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index 8f4e4e4..cc2eaee 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -10969,11 +10969,12 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, op = fixup_modeless_constant (op, mode); - /* NB: 3-operands load implied it's a mask load, + /* NB: 3-operands load implied it's a mask load or v{p}expand*, and that mask operand shoud be at the end. Keep all-ones mask which would be simplified by the expander. */ if (nargs == 3 && i == 2 && klass == load - && constm1_operand (op, mode)) + && constm1_operand (op, mode) + && insn_p->operand[i].predicate (op, mode)) ; else if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode) op = copy_to_mode_reg (mode, op); diff --git a/gcc/testsuite/gcc.target/i386/pr100310.c b/gcc/testsuite/gcc.target/i386/pr100310.c new file mode 100644 index 0000000..54ace18 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr100310.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mavx512f -O2" } */ +#include <immintrin.h> + +double *p; +volatile __m512d x; +volatile __mmask8 m; + +void foo() +{ + x = _mm512_mask_expandloadu_pd (x, 255, p); +} |