> Am 09.01.2026 um 12:05 schrieb Robin Dapp <[email protected]>:
>
>
>>
>>> Bootstrapped and regtested on x86, power10, and aarch64.
>>> Regtested on riscv64.
>>
>> Given its a constant permute(?) you can just always use ssizetyoe here.
>
> Ah, that's even simpler then, thanks. The attached v2 was bootstrapped and
> regtested as before.
Ok
Richard
> [PATCH v2] forwprop: Use ssizetype for mask [PR123414].
>
> RVV's vectors can get very large with LMUL8. In the PR we have
> 256-element char vectors which get permuted. For permuting them
> we use a mask vectype that is deduced from the element type
> without checking if the permute indices fit this type.
> That leads to an invalid permute mask which gets optimized away.
>
> This patch uses ssizetype as masktype instead.
>
> PR tree-optimization/123414
>
> gcc/ChangeLog:
>
> * tree-ssa-forwprop.cc (simplify_vector_constructor):
> Use ssizetype as mask type.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/riscv/rvv/autovec/pr123414.c: New test.
> ---
> .../gcc.target/riscv/rvv/autovec/pr123414.c | 29 +++++++++++++++++++
> gcc/tree-ssa-forwprop.cc | 22 +++-----------
> 2 files changed, 33 insertions(+), 18 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123414.c
>
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123414.c
> b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123414.c
> new file mode 100644
> index 00000000000..9a48085a562
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123414.c
> @@ -0,0 +1,29 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=rv64gcv_zvl256b -mrvv-max-lmul=m8 -O3 -fsigned-char
> -fno-strict-aliasing -fwrapv -fdump-tree-optimized -std=gnu99" } */
> +
> +signed char a=2;
> +long long b;
> +long c = 93;
> +int e[1][9];
> +
> +void
> +g (long cc, int ee[][9])
> +{
> + for (int i = 0; i < 4; i++)
> + for (int j = 0; j < 5; j++)
> + for (unsigned k = 0; k < 9; k++)
> + {
> + a *= cc;
> + for (int l = 0; l < 6; l += (ee[k] <= 0) + 2)
> + ;
> + }
> +}
> +
> +int main() {
> + g( c, e);
> + b = (int)a;
> + if (b != 34)
> + __builtin_abort ();
> +}
> +
> +/* { dg-final { scan-tree-dump-times
> "\[a-zA-Z_\]\[a-zA-Z0-9_\]+.=.VEC_PERM_EXPR <_\[0-9\]+, \\\{ 1(?:, 1){255}
> \\\}, \\\{ 0, 257, 258" 3 "optimized" } } */
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index c5bad3ddf38..b70fe8169ad 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -3829,8 +3829,8 @@ static bool
> simplify_vector_constructor (gimple_stmt_iterator *gsi)
> {
> gimple *stmt = gsi_stmt (*gsi);
> - tree op, orig[2], type, elem_type;
> - unsigned elem_size, i;
> + tree op, orig[2], type;
> + unsigned i;
> unsigned HOST_WIDE_INT nelts;
> unsigned HOST_WIDE_INT refnelts;
> enum tree_code conv_code;
> @@ -3843,8 +3843,6 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
>
> if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts))
> return false;
> - elem_type = TREE_TYPE (type);
> - elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
>
> orig[0] = NULL;
> orig[1] = NULL;
> @@ -4177,13 +4175,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
> machine_mode vmode = TYPE_MODE (perm_type);
> if (!can_vec_perm_const_p (vmode, vmode, indices))
> return false;
> - mask_type
> - = build_vector_type (build_nonstandard_integer_type (elem_size, 1),
> - refnelts);
> - if (GET_MODE_CLASS (TYPE_MODE (mask_type)) != MODE_VECTOR_INT
> - || maybe_ne (GET_MODE_SIZE (TYPE_MODE (mask_type)),
> - GET_MODE_SIZE (TYPE_MODE (perm_type))))
> - return false;
> + mask_type = build_vector_type (ssizetype, refnelts);
> tree op2 = vec_perm_indices_to_tree (mask_type, indices);
> bool converted_orig1 = false;
> gimple_seq stmts = NULL;
> @@ -4248,13 +4240,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
> machine_mode vmode = TYPE_MODE (type);
> if (!can_vec_perm_const_p (vmode, vmode, indices))
> return false;
> - mask_type
> - = build_vector_type (build_nonstandard_integer_type (elem_size, 1),
> - nelts);
> - if (GET_MODE_CLASS (TYPE_MODE (mask_type)) != MODE_VECTOR_INT
> - || maybe_ne (GET_MODE_SIZE (TYPE_MODE (mask_type)),
> - GET_MODE_SIZE (TYPE_MODE (type))))
> - return false;
> + mask_type = build_vector_type (ssizetype, nelts);
> blend_op2 = vec_perm_indices_to_tree (mask_type, indices);
> }
>
> --
> 2.52.0
>