From 59afd44ffb1bd55fc84b4a36107a9bdba708e9a0 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 17 Oct 2024 14:27:13 +0200 Subject: [PATCH] Relax boolean processing in vect_maybe_update_slp_op_vectype The following makes VECTOR_BOOLEAN_TYPE_P processing consistent with what we do without SLP. The original motivation for rejecting of VECTOR_BOOLEAN_TYPE_P extern defs was bad code generation. But the non-SLP codepath happily goes along - but always hits the case of an uniform vector and this case specifically we can now code-generate optimally. So the following allows single-lane externs as well. Requiring patterns to code-generate can have bad influence on the vectorization factor though a prototype patch of mine shows that generating vector compares externally isn't always trivial. The patch fixes the gcc.dg/vect/vect-early-break_82.c FAIL on x86_64 when --param vect-force-slp=1 is in effect. PR tree-optimization/117171 * tree-vect-stmts.cc (vect_maybe_update_slp_op_vectype): Relax vect_external_def VECTOR_BOOLEAN_TYPE_P constraint. --- gcc/tree-vect-stmts.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 6967d50288e..e7f14c3144c 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -14290,9 +14290,12 @@ vect_maybe_update_slp_op_vectype (slp_tree op, tree vectype) if (SLP_TREE_VECTYPE (op)) return types_compatible_p (SLP_TREE_VECTYPE (op), vectype); /* For external defs refuse to produce VECTOR_BOOLEAN_TYPE_P, those - should be handled by patters. Allow vect_constant_def for now. */ + should be handled by patters. Allow vect_constant_def for now + as well as the trivial single-lane uniform vect_external_def case + both of which we code-generate reasonably. */ if (VECTOR_BOOLEAN_TYPE_P (vectype) - && SLP_TREE_DEF_TYPE (op) == vect_external_def) + && SLP_TREE_DEF_TYPE (op) == vect_external_def + && SLP_TREE_LANES (op) > 1) return false; SLP_TREE_VECTYPE (op) = vectype; return true; -- 2.47.2