aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorliuhongt <hongtao.liu@intel.com>2021-04-28 14:52:59 +0800
committerliuhongt <hongtao.liu@intel.com>2021-06-22 09:34:47 +0800
commitb6efffa552cee6a20a58c91e5f41466c5715d73d (patch)
tree46b4eef0150046294b84a42ebcbcae0c02206807 /gcc
parent2f080224cfa9de0e215324c6ac242d6ee3f27172 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386-expand.c5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr100310.c12
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);
+}