https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92295
--- Comment #1 from Hongtao.liu <crazylht at gmail dot com> --- Created attachment 47143 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47143&action=edit This patch can fix this issue In ix86_expand_vector_init_concat, vector are initialized per 2 elements, that's why it failed to generate vpbroadcast, any purpose of this code??? ---------- 13784 /* FIXME: We process inputs backward to help RA. PR 36222. */ 13785 i = n - 1; 13786 j = (n >> 1) - 1; 13787 for (; i > 0; i -= 2, j--) 13788 { 13789 first[j] = gen_reg_rtx (cmode); 13790 v = gen_rtvec (2, ops[i - 1], ops[i]); 13791 ix86_expand_vector_init (false, first[j], 13792 gen_rtx_PARALLEL (cmode, v)); 13793 } 13794 13795 n >>= 1; 13796 if (n > 4) ------------ it can be implemented like --- 13776 /* FIXME: We process inputs backward to help RA. PR 36222. */ 13777 i = n - 1; 13778 for (j = 1; j != -1; j--) 13779 { 13780 half[j] = gen_reg_rtx (half_mode); 13781 switch (n >> 1) 13782 { 13783 case 2: 13784 v = gen_rtvec (2, ops[i-1], ops[i]); 13785 i -= 2; 13786 break; 13787 case 4: 13788 v = gen_rtvec (4, ops[i-3], ops[i-2], ops[i-1], ops[i]); 13789 i -= 4; 13790 break; 13791 case 8: 13792 v = gen_rtvec (8, ops[i-7], ops[i-6], ops[i-5], ops[i-4], 13793 ops[i-3], ops[i-2], ops[i-1], ops[i]); 13794 i -= 8; 13795 break; 13796 default: 13797 gcc_unreachable (); 13798 } 13799 ix86_expand_vector_init (false, half[j], 13800 gen_rtx_PARALLEL (half_mode, v)); 13801 } 13802 13803 ix86_expand_vector_init_concat (mode, target, half, 2); 13804 break; --- Bootstrap and regression test is ok.