On Tue, Mar 05, 2019 at 08:53:00AM +0000, Richard Sandiford wrote: > Sorry, commented on the bug before seeing this patch.
Sorry, I've committed before seeing your comment in the PR (and responded there after seeing it). > I don't think this is the way to go though. If we want match.pd > rules to have early checks for whether an ifn is supported, I think we > should get genmatch to do that itself rather than have to remember > to do it manually for each match.pd condition. Why? Most of the patterns don't introduce IFN_COND_* out of other code, just simplify existing IFN_COND_*. And those that adjust existing ones don't need these extra checks first. > In this case, isn't the underying problem that we only support some > vector conditions in VEC_COND_EXPRs and not as stand-alone comparisons? That is not a bug, I believe VEC_COND_EXPRs have been supported far earlier than those vec_cmp* optabs have been and VEC_COND_EXPRs is the only thing you want to use on targets which don't really have any mask registers for vectors, where the result of comparison is really vectorized x == y ? -1 : 0. vec_cmp* have been introduced for AVX512F I believe and are for the case when you store the result of the comparison in some bitset (mask), usually the mask has some other type than the vector it is comparing etc. (VECTOR_BOOLEAN_P at the GIMPLE type usually). > Shouldn't we address that directly and then treat the early checks as > a separate compile-time optimisation? > > As far as the patch itself goes, I don't understand why you have: > > internal_fn cond_fn = get_conditional_internal_fn (uncond_op); } > > when the cond_op iterator already gives the conditional internal function. I guess you're right and that could simplify the changes. That would be (untested except for make cc1): 2019-03-05 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/89570 * match.pd (vec_cond into cond_op simplification): Don't use get_conditional_internal_fn, use as_internal_fn (cond_op). --- gcc/match.pd.jj 2019-03-05 09:43:46.555727525 +0100 +++ gcc/match.pd 2019-03-05 10:05:20.089630138 +0100 @@ -5182,18 +5182,14 @@ (define_operator_list COND_TERNARY cond_op (COND_BINARY) (simplify (vec_cond @0 (view_convert? (uncond_op@4 @1 @2)) @3) - (with { tree op_type = TREE_TYPE (@4); - internal_fn cond_fn = get_conditional_internal_fn (uncond_op); } - (if (cond_fn != IFN_LAST - && vectorized_internal_fn_supported_p (cond_fn, op_type) + (with { tree op_type = TREE_TYPE (@4); } + (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type) && element_precision (type) == element_precision (op_type)) (view_convert (cond_op @0 @1 @2 (view_convert:op_type @3)))))) (simplify (vec_cond @0 @1 (view_convert? (uncond_op@4 @2 @3))) - (with { tree op_type = TREE_TYPE (@4); - internal_fn cond_fn = get_conditional_internal_fn (uncond_op); } - (if (cond_fn != IFN_LAST - && vectorized_internal_fn_supported_p (cond_fn, op_type) + (with { tree op_type = TREE_TYPE (@4); } + (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type) && element_precision (type) == element_precision (op_type)) (view_convert (cond_op (bit_not @0) @2 @3 (view_convert:op_type @1))))))) @@ -5202,20 +5198,14 @@ (define_operator_list COND_TERNARY cond_op (COND_TERNARY) (simplify (vec_cond @0 (view_convert? (uncond_op@5 @1 @2 @3)) @4) - (with { tree op_type = TREE_TYPE (@5); - internal_fn cond_fn - = get_conditional_internal_fn (as_internal_fn (uncond_op)); } - (if (cond_fn != IFN_LAST - && vectorized_internal_fn_supported_p (cond_fn, op_type) + (with { tree op_type = TREE_TYPE (@5); } + (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type) && element_precision (type) == element_precision (op_type)) (view_convert (cond_op @0 @1 @2 @3 (view_convert:op_type @4)))))) (simplify (vec_cond @0 @1 (view_convert? (uncond_op@5 @2 @3 @4))) - (with { tree op_type = TREE_TYPE (@5); - internal_fn cond_fn - = get_conditional_internal_fn (as_internal_fn (uncond_op)); } - (if (cond_fn != IFN_LAST - && vectorized_internal_fn_supported_p (cond_fn, op_type) + (with { tree op_type = TREE_TYPE (@5); } + (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type) && element_precision (type) == element_precision (op_type)) (view_convert (cond_op (bit_not @0) @2 @3 @4 (view_convert:op_type @1))))))) Jakub