https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115659
--- Comment #5 from Kewen Lin <linkw at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #2) > Note I think this could help scalar code too: > ``` > int a[1], b[1], c[1]; > > void > test (void) > { > a[0] = (b[0] == c[0]) ? -1 : a[0]; > } > > void > test1 (void) > { > a[0] = (-(b[0] == c[0])) | a[0]; > } > > ``` > Good catch! > So this could be something like: > ``` > (simplify > (cond @0 @1 integer_all_ones_p) > (bit_ior (negate (convert @0)) @1)) > (simplify > (vec_cond @0 @1 integer_all_ones_p) > (bit_ior (view_convert @0) @1)) > ``` Missing negate for the vector one? > The second one might need a target_supports_op_p for the bit_ior. Thanks for the hints! This looks more simplified than still keeping vec_cond, do we need to consider the target costing on cond (conditional select) vs. negate + or?