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.
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);
}
return NULL_TREE;
}
--
2.50.1 (Apple Git-155)