On Mon, May 12, 2025 at 7:32 PM Andrew Pinski <pins...@gmail.com> wrote:
>
> On Mon, May 12, 2025 at 3:56 AM Richard Biener
> <richard.guent...@gmail.com> wrote:
> >
> > On Sat, May 10, 2025 at 3:13 AM Andrew Pinski <quic_apin...@quicinc.com> 
> > wrote:
> > >
> > > This move this canonicalization from forwprop 
> > > (forward_propagate_into_gimple_cond)
> > > to gimple-fold.
> > > This is a step in removing forward_propagate_into_gimple_cond from 
> > > forwprop.
> >
> > I don't think fold_stmt should mess with the CFG, so NACK.
>
> I had that suspicion too.
>
> > The code has to
> > stay in forwprop, possibly it's also sth for CFG cleanup
> > cleanup_control_expr_graph
> > where we convert single-case switch () to if ().
>
> CFG cleanup definitely seems like a good place for this.

Agreed, so go for that.

Richard.

> Thanks,
> Andrew
>
> >
> > > Bootstrapped and tested on x86_64-linux-gnu.
> > >
> > > gcc/ChangeLog:
> > >
> > >         * gimple-fold.cc (replace_stmt_with_simplification): Canonicalize
> > >         `_Bool == 0` and `_Bool != 1` into `_Bool != 0` with swapping
> > >         the edges.
> > >
> > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> > > ---
> > >  gcc/gimple-fold.cc | 19 ++++++++++++++++++-
> > >  1 file changed, 18 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> > > index c3a9f6356d4..e6d1384c416 100644
> > > --- a/gcc/gimple-fold.cc
> > > +++ b/gcc/gimple-fold.cc
> > > @@ -6079,7 +6079,24 @@ replace_stmt_with_simplification 
> > > (gimple_stmt_iterator *gsi,
> > >      {
> > >        gcc_assert (res_op->code.is_tree_code ());
> > >        auto code = tree_code (res_op->code);
> > > -      if (TREE_CODE_CLASS (code) == tcc_comparison
> > > +      /* Canonicalize _Bool == 0 and _Bool != 1 to _Bool != 0 by 
> > > swapping edges.  */
> > > +      if ((TREE_CODE (TREE_TYPE (ops[0])) == BOOLEAN_TYPE
> > > +          || (INTEGRAL_TYPE_P (TREE_TYPE (ops[0]))
> > > +              && TYPE_PRECISION (TREE_TYPE (ops[0])) == 1))
> > > +          && ((code == EQ_EXPR
> > > +               && integer_zerop (ops[1]))
> > > +              || (code == NE_EXPR
> > > +                  && integer_onep (ops[1])))
> > > +           && gimple_bb (stmt))
> > > +       {
> > > +         basic_block bb = gimple_bb (stmt);
> > > +         gimple_cond_set_code (cond_stmt, NE_EXPR);
> > > +         gimple_cond_set_lhs (cond_stmt, ops[0]);
> > > +         gimple_cond_set_rhs (cond_stmt, build_zero_cst (TREE_TYPE 
> > > (ops[0])));
> > > +         EDGE_SUCC (bb, 0)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
> > > +         EDGE_SUCC (bb, 1)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
> > > +       }
> > > +      else if (TREE_CODE_CLASS (code) == tcc_comparison
> > >           /* GIMPLE_CONDs condition may not throw.  */
> > >           && (!flag_exceptions
> > >               || !cfun->can_throw_non_call_exceptions
> > > --
> > > 2.43.0
> > >

Reply via email to