On Wed, May 14, 2025 at 7:39 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > This is the next step in removing forward_propagate_into_comparison > and forward_propagate_into_gimple_cond; In the case of `((int)(a cmp b)) != 0` > we want to do the transformation to `a cmp b` even if the cast is used twice. > This is exactly what > forward_propagate_into_comparison/forward_propagate_into_gimple_cond > do and does the copy.
Actually I am thinking we should change: this set of patterns: ``` (for cmp (simple_comparison) (simplify (cmp (convert@0 @00) (convert?@1 @10)) (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) /* Disable this optimization if we're casting a function pointer type on targets that require function pointer canonicalization. */ && !(targetm.have_canonicalize_funcptr_for_compare () && ((POINTER_TYPE_P (TREE_TYPE (@00)) && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@00)))) || (POINTER_TYPE_P (TREE_TYPE (@10)) && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@10)))))) && single_use (@0)) ``` In the case of: (if (TREE_CODE (@1) == INTEGER_CST) (cmp @00 ...) We don't need to care if @0 is single_use or not as we remove one cast. Plus all of the cases where we produce constants don't care about single_use either. So let's ignore this patch for now. I will get back to it tomorrow. Thanks, Andrew > > Bootstrapped and tested on x86_64-linux-gnu. > > gcc/ChangeLog: > > * match.pd (`(a cmp b) != false`, `(a cmp b) == true`, > `(a cmp b) != true`, `(a cmp b) == false`): Allow an > optional cast between the comparison and the eq/ne. > (`bool_val != false`, `bool_val == true`): Allow an optional > cast between the bool_val and the ne/eq. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/match.pd | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/gcc/match.pd b/gcc/match.pd > index 79485f9678a..ffb1695e6e6 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -6913,15 +6913,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (ncmp @0 @1))))) > /* The following bits are handled by fold_binary_op_with_conditional_arg. > */ > (simplify > - (ne (cmp@2 @0 @1) integer_zerop) > + (ne (convert? (cmp@2 @0 @1)) integer_zerop) > (if (types_match (type, TREE_TYPE (@2))) > (cmp @0 @1))) > (simplify > - (eq (cmp@2 @0 @1) integer_truep) > + (eq (convert? (cmp@2 @0 @1)) integer_truep) > (if (types_match (type, TREE_TYPE (@2))) > (cmp @0 @1))) > (simplify > - (ne (cmp@2 @0 @1) integer_truep) > + (ne (convert? (cmp@2 @0 @1)) integer_truep) > (if (types_match (type, TREE_TYPE (@2))) > (with { enum tree_code ic = invert_tree_comparison > (cmp, HONOR_NANS (@0)); } > @@ -6930,7 +6930,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (ic == ncmp) > (ncmp @0 @1)))))) > (simplify > - (eq (cmp@2 @0 @1) integer_zerop) > + (eq (convert? (cmp@2 @0 @1)) integer_zerop) > (if (types_match (type, TREE_TYPE (@2))) > (with { enum tree_code ic = invert_tree_comparison > (cmp, HONOR_NANS (@0)); } > @@ -8104,13 +8104,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > /* bool_var != 0 becomes bool_var. */ > (simplify > - (ne @0 integer_zerop) > + (ne (convert? @0) integer_zerop) > (if (TREE_CODE (TREE_TYPE (@0)) == BOOLEAN_TYPE > && types_match (type, TREE_TYPE (@0))) > (non_lvalue @0))) > /* bool_var == 1 becomes bool_var. */ > (simplify > - (eq @0 integer_onep) > + (eq (convert? @0) integer_onep) > (if (TREE_CODE (TREE_TYPE (@0)) == BOOLEAN_TYPE > && types_match (type, TREE_TYPE (@0))) > (non_lvalue @0))) > -- > 2.43.0 >