https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117171
Bug ID: 117171
Summary: FAIL: gcc.dg/vect/vect-early-break_82.c with forced
SLP
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
gcc.dg/vect/vect-early-break_82.c fails because we are asked to create a
vector(2) <signed-boolean:64> external. The
_23 = _21 & _22
with the external _22 = x$imag_6 == $t$imag_16 stmt isn't covered by
pattern detection. For non-SLP we are doing the "obvious" here:
note: created new init_stmt: _81 = _22 ? -1 : 0;
note: created new init_stmt: vect_cst__82 = {_81, _81};
but with AVX512 this shows
vector(8) <signed-boolean:1> vect_cst__82;
_81 = _22 ? -1 : 0;
vect_cst__82 = {_81, _81, _81, _81, _81, _81, _81, _81};
which is sub-optimal, esp. when there'll be more than one def (SLP!)
involved. Instead we'd want to generate
_81 = { _22, _22, ... };
vect_cst__82 = _81 != { 0, 0, ... };
thus a vector compare we need to have support for.
This is in the end the famous vect_maybe_update_slp_op_vectype
/* For external defs refuse to produce VECTOR_BOOLEAN_TYPE_P, those
should be handled by patters. Allow vect_constant_def for now. */
if (VECTOR_BOOLEAN_TYPE_P (vectype)
&& SLP_TREE_DEF_TYPE (op) == vect_external_def)
return false;
we'd need to improve. Alternatively operations on mask bools need to be
pattern-handled as well.