diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc index c57a8f56dac3..909c11e4195b 100644 --- a/gcc/config/i386/i386-expand.cc +++ b/gcc/config/i386/i386-expand.cc @@ -16541,6 +16541,8 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt) 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 000000000000..d6e28848a4b3 --- /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; +}