https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111794
--- Comment #9 from Robin Dapp <rdapp at gcc dot gnu.org> --- Yes, that's from pattern recog: slp.c:11:20: note: === vect_pattern_recog === slp.c:11:20: note: vect_recog_mask_conversion_pattern: detected: _5 = _2 & _4; slp.c:11:20: note: mask_conversion pattern recognized: patt_157 = patt_156 & _4; slp.c:11:20: note: extra pattern stmt: patt_156 = (<signed-boolean:1>) _2; slp.c:11:20: note: vect_recog_bool_pattern: detected: _6 = (int) _5; slp.c:11:20: note: bool pattern recognized: patt_159 = (int) patt_158; slp.c:11:20: note: extra pattern stmt: patt_158 = _5 ? 1 : 0; slp.c:11:20: note: vect_recog_mask_conversion_pattern: detected: _11 = _8 & _10; slp.c:11:20: note: mask_conversion pattern recognized: patt_161 = patt_160 & _10; slp.c:11:20: note: extra pattern stmt: patt_160 = (<signed-boolean:1>) _8; ... In vect_recog_mask_conversion_pattern we arrive at if (TYPE_PRECISION (rhs1_type) < TYPE_PRECISION (rhs2_type)) { vectype1 = get_mask_type_for_scalar_type (vinfo, rhs1_type); if (!vectype1) return NULL; rhs2 = build_mask_conversion (vinfo, rhs2, vectype1, stmt_vinfo); } else { vectype1 = get_mask_type_for_scalar_type (vinfo, rhs2_type); if (!vectype1) return NULL; rhs1 = build_mask_conversion (vinfo, rhs1, vectype1, stmt_vinfo); } lhs = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL); pattern_stmt = gimple_build_assign (lhs, rhs_code, rhs1, rhs2); vectype1 is then e.g. vector([8,8]) <signed-boolean:1>. Then vect_recog_bool_pattern creates the COND_EXPR. Testsuites are running with your proposed change.