diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2024-10-15 16:51:33 +0200 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2024-10-15 16:52:55 +0200 |
commit | 80d7032067a3a5b76aecd657d9b35b0a8f5a941d (patch) | |
tree | c1d83bf86051bb822519ad2c1c2c3b5598fbd63e | |
parent | 8065982aebe0737300cc036ed30b55868b977b00 (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr117116.c | 18 |
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; +} |