On Mon, May 12, 2025 at 7:16 PM Andrew Pinski <pins...@gmail.com> wrote:
>
> On Mon, May 12, 2025 at 3:51 AM Richard Biener
> <richard.guent...@gmail.com> wrote:
> >
> > On Sat, May 10, 2025 at 3:19 AM Andrew Pinski <quic_apin...@quicinc.com> 
> > wrote:
> > >
> > > with -ftrapping-math -fnon-call-exceptions and:
> > > ```
> > > tmp = FP0 CMP FP1;
> > >
> > > if (tmp != 0) ...
> > > ```
> > > a call fold_stmt on the GIMPLE_COND will replace the above with
> > > a new tmp each time and we even lose the eh informatin on the
> > > previous comparison too.
> > >
> > > gcc/ChangeLog:
> > >
> > >         * gimple-fold.cc (replace_stmt_with_simplification): Reject for
> > >         noncall exceptions replacing comparison with itself.
> > >
> > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> > > ---
> > >  gcc/gimple-fold.cc | 26 ++++++++++++++++++++++++++
> > >  1 file changed, 26 insertions(+)
> > >
> > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> > > index 7b3a3d30045..4ff5dbb8d50 100644
> > > --- a/gcc/gimple-fold.cc
> > > +++ b/gcc/gimple-fold.cc
> > > @@ -6276,6 +6276,32 @@ replace_stmt_with_simplification 
> > > (gimple_stmt_iterator *gsi,
> > >         }
> > >        else if (!inplace)
> > >         {
> > > +         /* For throwing comparisons, see if the GIMPLE_COND is the same 
> > > as
> > > +            the comparison would be.
> > > +            This can happen due to the match pattern for
> > > +            `(ne (cmp @0 @1) integer_zerop)` which creates a new 
> > > expression
> > > +            for the comparison.  */
> > > +         if (TREE_CODE_CLASS (code) == tcc_comparison
> > > +             && flag_exceptions
> > > +             && cfun->can_throw_non_call_exceptions
> >
> > I think you should allow !cfun here (aka treat it conservatively).
>
> The code right above does not check cfun and that is where I copied
> the condition :
> ```
>       else if (TREE_CODE_CLASS (code) == tcc_comparison
>   /* GIMPLE_CONDs condition may not throw.  */
>   && (!flag_exceptions
>       || !cfun->can_throw_non_call_exceptions
>       || !operation_could_trap_p (code,
>   FLOAT_TYPE_P (TREE_TYPE (ops[0])),
>   false, NULL_TREE)))
> ```
>
> Should we add the check for cfun there too?

Yeah, I think so.

> >
> > > +             && operation_could_trap_p (code,
> > > +                                        FLOAT_TYPE_P (TREE_TYPE 
> > > (ops[0])),
> > > +                                        false, NULL_TREE))
> > > +           {
> > > +             tree lhs = gimple_cond_lhs (cond_stmt);
> > > +             if (gimple_cond_code (cond_stmt) == NE_EXPR
> > > +                 && TREE_CODE (lhs) == SSA_NAME
> > > +                 && TREE_CODE (TREE_TYPE (lhs)) == BOOLEAN_TYPE
> >
> > Not sure about this - IIRC INTEGER_TYPE with appropriate precision
> > and sign is compatible.  I'd just drop this.
>
> I am going to change it to be INTEGRAL_TYPE_P; is that ok? The check
> on the type is mainly to reduce when we walk back (a slight
> optimization).

OK.

Thanks,
Richard.

> Thanks,
> Andrew Pinski
>
> >
> > Otherwise OK.  I prefer this one over guarding the match.pd pattern.
> >
> > Thanks,
> > Richard.
> >
> > > +                 && integer_zerop (gimple_cond_rhs (cond_stmt)))
> > > +               {
> > > +                 gimple *s = SSA_NAME_DEF_STMT (lhs);
> > > +                 if (is_gimple_assign (s)
> > > +                     && gimple_assign_rhs_code (s) == code
> > > +                     && operand_equal_p (gimple_assign_rhs1 (s), ops[0])
> > > +                     && operand_equal_p (gimple_assign_rhs2 (s), ops[1]))
> > > +                   return false;
> > > +               }
> > > +           }
> > >           tree res = maybe_push_res_to_seq (res_op, seq);
> > >           if (!res)
> > >             return false;
> > > --
> > > 2.43.0
> > >

Reply via email to