LGTM.
> From: "Robin Dapp"<[email protected]>
> Date: Tue, Jun 16, 2026, 18:45
> Subject: [PATCH] RISC-V: Fix more scalar mode_idx instances [PR125478].
> To: "gcc-patches"<[email protected]>
> Cc: <[email protected]>, <[email protected]>, <[email protected]>,
> <[email protected]>, <[email protected]>
> Hi,
>
> This is another case of PR123022 and PR116149 where we query a scalar source
> operand instead of a vector operand, leading to a wrong AVL during avlprop.
>
> This patch moves viwalu, vfwalu, viwmul, and vfwmul to the proper
> bucket. I wonder why I didn't do that the last two times but it seems
> to be the correct choice now :)
>
> Regtested on rv64gcv_zvl512b and waiting for the CI.
>
> Regards
> Robin
>
> PR target/125478
>
> gcc/ChangeLog:
>
> * config/riscv/vector.md: Set widen-alu mode_idx to 3.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/riscv/rvv/autovec/pr125478.c: New test.
> ---
> gcc/config/riscv/vector.md | 16 +++----------
> .../gcc.target/riscv/rvv/autovec/pr125478.c | 23 +++++++++++++++++++
> 2 files changed, 26 insertions(+), 13 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125478.c
>
> diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
> index fba631d670f..4f523f7c722 100644
> --- a/gcc/config/riscv/vector.md
> +++ b/gcc/config/riscv/vector.md
> @@ -858,10 +858,10 @@ (define_attr "mode_idx" ""
> (const_int 2)
>
> (eq_attr "type"
> "vstux,vstox,vssegts,vssegtux,vssegtox,vfcvtftoi,vfwcvtitof,vfwcvtftoi,
> -
> vfwcvtftof,vmsfs,vired,viwred,vfredu,vfredo,vfwredu,vfwredo,vwsll")
> +
> vfwcvtftof,vmsfs,vired,viwred,vfredu,vfredo,vfwredu,vfwredo,vwsll,viwalu,vfwalu,viwmul,vfwmul")
> (const_int 3)
>
> - (eq_attr "type"
> "viwalu,viwmul,viwmuladd,vfwalu,vfwmul,vfwmuladd")
> + (eq_attr "type" "viwmuladd,vfwmuladd")
> (const_int 4)]
> (const_int INVALID_ATTRIBUTE)))
>
> @@ -4256,7 +4256,6 @@ (define_insn
> "@pred_single_widen_<plus_minus:optab><any_extend:su><mode>_scalar"
> "TARGET_VECTOR"
> "vw<plus_minus:insn><any_extend:u>.wx\t%0,%3,%z4%p1"
> [(set_attr "type" "vi<widen_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<V_DOUBLE_TRUNC>")])
>
> (define_insn "@pred_single_widen_add<any_extend:su><mode>_extended_scalar"
> @@ -4279,7 +4278,6 @@ (define_insn
> "@pred_single_widen_add<any_extend:su><mode>_extended_scalar"
> "TARGET_VECTOR"
> "vwadd<any_extend:u>.wx\t%0,%3,%z4%p1"
> [(set_attr "type" "viwalu")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<V_DOUBLE_TRUNC>")])
>
> (define_insn "@pred_single_widen_sub<any_extend:su><mode>_extended_scalar"
> @@ -4302,7 +4300,6 @@ (define_insn
> "@pred_single_widen_sub<any_extend:su><mode>_extended_scalar"
> "TARGET_VECTOR"
> "vwsub<any_extend:u>.wx\t%0,%3,%z4%p1"
> [(set_attr "type" "viwalu")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<V_DOUBLE_TRUNC>")])
>
> (define_insn "@pred_widen_mulsu<mode>"
> @@ -4523,7 +4520,6 @@ (define_insn "@pred_<optab><mode>_scalar"
> "TARGET_VECTOR"
> "v<insn>.vx\t%0,%3,%4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_insn "@pred_<optab><mode>_scalar"
> @@ -4545,7 +4541,6 @@ (define_insn "@pred_<optab><mode>_scalar"
> "TARGET_VECTOR"
> "v<insn>.vx\t%0,%3,%4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_expand "@pred_<optab><mode>_scalar"
> @@ -4600,7 +4595,6 @@ (define_insn "*pred_<optab><mode>_scalar"
> "TARGET_VECTOR"
> "v<insn>.vx\t%0,%3,%4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_insn "*pred_<optab><mode>_extended_scalar"
> @@ -4623,7 +4617,6 @@ (define_insn "*pred_<optab><mode>_extended_scalar"
> "TARGET_VECTOR && !TARGET_64BIT"
> "v<insn>.vx\t%0,%3,%4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_expand "@pred_<optab><mode>_scalar"
> @@ -4678,7 +4671,6 @@ (define_insn "*pred_<optab><mode>_scalar"
> "TARGET_VECTOR"
> "v<insn>.vx\t%0,%3,%z4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_insn "*pred_<optab><mode>_extended_scalar"
> @@ -4701,7 +4693,6 @@ (define_insn "*pred_<optab><mode>_extended_scalar"
> "TARGET_VECTOR && !TARGET_64BIT"
> "v<insn>.vx\t%0,%3,%z4%p1"
> [(set_attr "type" "<int_binop_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_insn "@pred_<sat_op><mode>"
> @@ -4747,7 +4738,6 @@ (define_insn "@pred_<sat_op><mode>_scalar"
> "TARGET_VECTOR"
> "v<sat_op>.vx\t%0,%3,%z4%p1"
> [(set_attr "type" "<sat_insn_type>")
> - (set_attr "mode_idx" "3")
> (set_attr "mode" "<MODE>")])
>
> (define_insn "@pred_<sat_op><mode>_scalar"
> @@ -7352,7 +7342,7 @@ (define_insn "@pred_dual_widen_<optab><mode>_scalar"
> [(set_attr "type" "vf<widen_binop_insn_type>")
> (set_attr "mode" "<V_DOUBLE_TRUNC>")
> (set (attr "frm_mode")
> - (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))])
> + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))])
>
> (define_insn "@pred_single_widen_add<mode>"
> [(set (match_operand:VWEXTF 0 "register_operand" "=&vr,
> &vr")
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125478.c
> b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125478.c
> new file mode 100644
> index 00000000000..46bccc594cd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125478.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -mrvv-vector-bits=zvl
> -fdump-rtl-avlprop-details" } */
> +
> +long long a;
> +long b;
> +char c[169];
> +int d;
> +
> +int main() {
> + for (long g=0; g<13; ++g)
> + for (long h=0; h<13; ++h)
> + c[g*13 +h] = 8;
> +
> + for (unsigned g=0; g<13; g++)
> + for (int h=0; h<13; h +=3)
> + b += (c[g*13+h]) >> c[g*13 +9];
> +
> + a = (int)b;
> + if (a != 0)
> + __builtin_abort ();
> +}
> +
> +/* { dg-final { scan-rtl-dump-not "Propagating AVL: \\(const_int 1
> \\\[0x1\\\]\\)" "avlprop" } } */
> --
> 2.54.0
>