https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119114
--- Comment #19 from Li Pan <pan2.li at intel dot com> ---
> No you got it wrong.
> _121 will either be -1 or 0. _11 should be -1 or 0 too.
> So the question is what was the VEC_EXTRACT doing the right thing? Is it 0/-1
> or 0/1?
Oh, I see. Let me revisit the dump code.
> diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md
> index 92e6942b523..c484e9f3c70 100644
> --- a/gcc/config/riscv/autovec.md
> +++ b/gcc/config/riscv/autovec.md
> @@ -1451,14 +1451,16 @@ (define_expand "vec_extract<mode>qi"
>
> ;; Same for a BImode but still return a QImode.
> (define_expand "vec_extract<mode>bi"
> - [(set (match_operand:QI 0 "register_operand")
> - (vec_select:QI
> + [(set (match_operand:BI 0 "register_operand")
> + (vec_select:BI
> (match_operand:VB_VLS 1 "register_operand")
> (parallel
> [(match_operand 2 "nonmemory_operand")])))]
> "TARGET_VECTOR"
> {
> - emit_insn (gen_vec_extract<mode>qi (operands[0], operands[1],
> operands[2]));
> + rtl qir = gen_reg (QImode);
> + emit_insn (gen_vec_extract<mode>qi (qir, operands[1], operands[2]));
> + emit_move_insn (operands[0], gen_lowpart (BImode, qir));
> DONE;
> })
Have a quick try as above change, seems still fail here.