aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2024-10-15 16:51:33 +0200
committerUros Bizjak <ubizjak@gmail.com>2024-10-15 16:52:55 +0200
commit80d7032067a3a5b76aecd657d9b35b0a8f5a941d (patch)
treec1d83bf86051bb822519ad2c1c2c3b5598fbd63e
parent8065982aebe0737300cc036ed30b55868b977b00 (diff)
downloadgcc-80d7032067a3a5b76aecd657d9b35b0a8f5a941d.zip
gcc-80d7032067a3a5b76aecd657d9b35b0a8f5a941d.tar.gz
gcc-80d7032067a3a5b76aecd657d9b35b0a8f5a941d.tar.bz2
i386: Fix expand_vector_set for VEC_MERGE/VEC_DUPLICATE RTX [PR117116]
Middle end can generate SYMBOL_REF RTX as a value "val" in the call to expand_vector_set, but SYMBOL_REF RTX is not accepted in <sse2p4_1>_pinsr<ssemodesuffix> insn pattern, generated via VEC_MERGE/VEC_DUPLICATE RTX path. Force the value into a register before VEC_MERGE/VEC_DUPLICATE RTX is generated if it doesn't satisfy nonimmediate_operand predicate. PR target/117116 gcc/ChangeLog: * config/i386/i386-expand.cc (expand_vector_set): Force "val" into a register before VEC_MERGE/VEC_DUPLICATE RTX is generated if it doesn't satisfy nonimmediate_operand predicate. gcc/testsuite/ChangeLog: * gcc.target/i386/pr117116.c: New test.
-rw-r--r--gcc/config/i386/i386-expand.cc2
-rw-r--r--gcc/testsuite/gcc.target/i386/pr117116.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 2b774ff..63f5e34 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -18263,6 +18263,8 @@ quarter:
else if (use_vec_merge)
{
do_vec_merge:
+ if (!nonimmediate_operand (val, inner_mode))
+ val = force_reg (inner_mode, val);
tmp = gen_rtx_VEC_DUPLICATE (mode, val);
tmp = gen_rtx_VEC_MERGE (mode, tmp, target,
GEN_INT (HOST_WIDE_INT_1U << elt));
diff --git a/gcc/testsuite/gcc.target/i386/pr117116.c b/gcc/testsuite/gcc.target/i386/pr117116.c
new file mode 100644
index 0000000..d6e2884
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr117116.c
@@ -0,0 +1,18 @@
+/* PR target/117116 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx2" } */
+
+typedef void (*StmFct)();
+typedef struct {
+ StmFct fct_getc;
+ StmFct fct_putc;
+ StmFct fct_flush;
+ StmFct fct_close;
+} StmInf;
+
+StmInf TTY_Getc_pstm;
+
+void TTY_Getc() {
+ TTY_Getc_pstm.fct_getc = TTY_Getc;
+ TTY_Getc_pstm.fct_putc = TTY_Getc_pstm.fct_flush = TTY_Getc_pstm.fct_close = (StmFct)1;
+}