On Thu, May 8, 2025 at 9:05 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > This is like the patch where we don't want to replace `bool_name != 0` > with `bool_name` but for instead for INTEGER_CST. The only thing > difference is there are a few different forms for always true/always > false; only handle it if it was in the canonical form. A few new helpers are > added for the canonical form detection. > > This also replaces the previous version of the patch which did an early > exit from fold_stmt_1 instead so we can change the non-canonical form > into a canonical in the end.
OK. > gcc/ChangeLog: > > * gimple.h (gimple_cond_true_canonical_p): New function. > (gimple_cond_false_canonical_p): New function. > * gimple-fold.cc (replace_stmt_with_simplification): Return > false if replacing the operands of GIMPLE_COND with an INTEGER_CST > and already in canonical form. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/gimple-fold.cc | 15 +++++++++++++-- > gcc/gimple.h | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 43 insertions(+), 2 deletions(-) > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc > index f801e8b6d41..e63fd6f2f2f 100644 > --- a/gcc/gimple-fold.cc > +++ b/gcc/gimple-fold.cc > @@ -6258,10 +6258,21 @@ replace_stmt_with_simplification > (gimple_stmt_iterator *gsi, > } > else if (code == INTEGER_CST) > { > + /* Make into the canonical form `1 != 0` and `0 != 0`. > + If already in the canonical form return false > + saying nothing has been done. */ > if (integer_zerop (ops[0])) > - gimple_cond_make_false (cond_stmt); > + { > + if (gimple_cond_false_canonical_p (cond_stmt)) > + return false; > + gimple_cond_make_false (cond_stmt); > + } > else > - gimple_cond_make_true (cond_stmt); > + { > + if (gimple_cond_true_canonical_p (cond_stmt)) > + return false; > + gimple_cond_make_true (cond_stmt); > + } > } > else if (!inplace) > { > diff --git a/gcc/gimple.h b/gcc/gimple.h > index 032365f3da2..977ff1c923c 100644 > --- a/gcc/gimple.h > +++ b/gcc/gimple.h > @@ -3875,6 +3875,21 @@ gimple_cond_true_p (const gcond *gs) > return false; > } > > +/* Check if conditional statement GS is in the caonical form of 'if (1 != > 0)'. */ > + > +inline bool > +gimple_cond_true_canonical_p (const gcond *gs) > +{ > + tree lhs = gimple_cond_lhs (gs); > + tree rhs = gimple_cond_rhs (gs); > + tree_code code = gimple_cond_code (gs); > + if (code == NE_EXPR > + && lhs == boolean_true_node > + && rhs == boolean_false_node) > + return true; > + return false; > +} > + > /* Check if conditional statement GS is of the form 'if (1 != 1)', > 'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */ > > @@ -3900,6 +3915,21 @@ gimple_cond_false_p (const gcond *gs) > return false; > } > > +/* Check if conditional statement GS is in the caonical form of 'if (0 != > 0)'. */ > + > +inline bool > +gimple_cond_false_canonical_p (const gcond *gs) > +{ > + tree lhs = gimple_cond_lhs (gs); > + tree rhs = gimple_cond_rhs (gs); > + tree_code code = gimple_cond_code (gs); > + if (code == NE_EXPR > + && lhs == boolean_false_node > + && rhs == boolean_false_node) > + return true; > + return false; > +} > + > /* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS. */ > > inline void > -- > 2.43.0 >