This is a fix for a compile failure in gcc.c-torture/compile/pr70240.c with options -O1 -mmsa.
The expand code for replicated constant vectors with small immediate values was simply wrong and would never work. This code is not used in the simple case of initialising a variable with a constant vector from C code; so focussed test is non-trivial. Since an existing test triggers the issue then we have basic coverage in place. The whole mips_expand_vector_init function needs a review and possibly a rewrite as on reading through the code I see lots of, at least, confusing logic in there which seems unnecessary. gcc/ * config/mips/mips.c (mips_expand_vector_init): Create a const_vector to initialise a vector register instead of using a const_int. Committed. Thanks, Matthew diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d1deb52..dadfcc4 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -21757,11 +21757,12 @@ mips_expand_vector_init (rtx target, rtx vals) case V8HImode: case V4SImode: case V2DImode: - emit_move_insn (target, same); + temp = gen_rtx_CONST_VECTOR (vmode, XVEC (vals, 0)); + emit_move_insn (target, temp); return; default: - break; + gcc_unreachable (); } } temp = gen_reg_rtx (imode);