On Mon, Jul 27, 2026 at 10:46 AM <[email protected]> wrote:
>
> From: Kyrylo Tkachov <[email protected]>
>
> ssa_uniform_vector_p is documented as returning the element a uniform
> vector is a splat from, and it handles VEC_DUPLICATE_EXPR when it is
> handed the bare tree.  It did not handle the much more common gimple
> form, where the splat is the RHS of an SSA definition: VEC_DUPLICATE_EXPR
> is a unary operation, so gimple_assign_single_p is false for it and the
> SSA_NAME path fell through to NULL_TREE.
>
> Splats started reaching the helper in that form with
> r17-2019-g770ff476d06f ("aarch64: Port NEON vector creation intrinsics to
> pragma-based framework"), after which vdup_n_u8 and friends fold to
>
>   uniform_vec_5 = [vec_duplicate_expr] _1;
>
> rather than to a CONSTRUCTOR, so ssa_uniform_vector_p stopped seeing
> through them.  Callers that lose out are the lowpart-to-highpart NEON
> builtin fold in the aarch64 back end, vector shift and division
> lowering in tree-vect-generic.cc, and the CONSTRUCTOR-of-splats
> simplification in tree-ssa-forwprop.cc.
>
> For gcc.target/aarch64/simd/fold_to_highpart_7.c this restores
>
>   ldr     q0, [x1]
>   ld1r    {v31.16b}, [x0]
>   umull2  v0.8h, v0.16b, v31.16b
>
> in place of a lowpart umull with the highpart fold missed.
> Bootstrapped and tested on aarch64-none-linux-gnu.
> Ok for trunk?
> Thanks,
> Kyrill
>
> gcc/ChangeLog:
>
>         * tree.cc (ssa_uniform_vector_p): Look through a
>         VEC_DUPLICATE_EXPR SSA definition.


There is also vec_same_elem_p in match.pd which seems to handle
something similar but based on a gimple stmt instead.
I wonder if ssa_uniform_vector_p should just use
gimple_match_vec_same_elem_p instead here?
Though vec_same_elem_p that might get too complex.


>
> Signed-off-by: Kyrylo Tkachov <[email protected]>
> ---
>  gcc/tree.cc | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 977bdaa0845..7292f45665f 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -10876,6 +10876,11 @@ ssa_uniform_vector_p (tree op)
>        gimple *def_stmt = SSA_NAME_DEF_STMT (op);
>        if (gimple_assign_single_p (def_stmt))
>         return uniform_vector_p (gimple_assign_rhs1 (def_stmt));
> +      /* A VEC_DUPLICATE_EXPR is a unary assignment, so it is not covered
> +        by the gimple_assign_single_p case above.  */
> +      if (is_gimple_assign (def_stmt)
> +         && gimple_assign_rhs_code (def_stmt) == VEC_DUPLICATE_EXPR)
> +       return gimple_assign_rhs1 (def_stmt);

Ok.

>      }
>    return NULL_TREE;
>  }
> --
> 2.50.1 (Apple Git-155)
>

Reply via email to