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) >
