On Tue, Feb 02, 2021 at 09:38:09AM +0000, Richard Sandiford wrote: > > +/* In PROP_gimple_lvec mode, perform extra checking if RES_OP and return > > + true if RES_OP is not appropriate - would require vector operations that > > + would need to be lowered before expansion. */ > > + > > +bool > > +check_gimple_lvec (gimple_match_op *res_op) > > Guess this is personal preference, but the return value seems inverted. > I'd have expected true if something is OK and false if something isn't.
Sure, I can change that. > > + default: > > + if (!VECTOR_MODE_P (mode)) > > + return true; > > + op = optab_for_tree_code (code, type, optab_default); > > + if (op == unknown_optab > > + && code == NEGATE_EXPR > > + && INTEGRAL_TYPE_P (TREE_TYPE (type))) > > + op = optab_for_tree_code (MINUS_EXPR, type, optab_default); > > + if (op && optab_handler (op, mode) != CODE_FOR_nothing) > > + return false; > > + return true; > > This doesn't look right for things like SVE comparisons, where the > result is a VECTOR_BOOLEAN_TYPE_P with MODE_VECTOR_BOOL and where > the inputs are something else. I guess it might also affect FP > comparisons on most targets. So how does that get through expand_vector_operations_1 ? I don't see there anything that would catch it until: if (compute_type == NULL_TREE) compute_type = get_compute_type (code, op, type); if (compute_type == type) return; and the above is an attempt to do what get_compute_type does. expand_vector_comparison indeed has one case: /* As seen in PR95830, we should not expand comparisons that are only feeding a VEC_COND_EXPR statement. */ ... and if expand_vector_comparison returns NULL, nothing is lowered. But we can't really look at immediate uses during the checking :(. So do you suggest for now letting all comparisons get through? Jakub