On Mon, May 12, 2025 at 10:52 PM 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.
>
> Changes since v1:
> * v2: Use INTEGRAL_TYPE_P instead of a check against BOOLEAN_TYPE.
>       Add testcase which shows where losing of landing pad happened.

OK (adding of !cfun || could be done as followup - as you noted other code
doesn't either - but I think stmt folding from IPA w/o set_cfun should be OK
in theory - in practice we might not even do this or we might run into issues).

Richard.

>         PR tree-optimization/119903
> gcc/ChangeLog:
>
>         * gimple-fold.cc (replace_stmt_with_simplification): Reject for
>         noncall exceptions replacing comparison with itself.
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/tree-ssa/pr119903-1.C: New test.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/gimple-fold.cc                         | 26 ++++++++++++++++++++++
>  gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C | 24 ++++++++++++++++++++
>  2 files changed, 50 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index e63fd6f2f2f..b8c1588365e 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
> +             && 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
> +                 && INTEGRAL_TYPE_P (TREE_TYPE (lhs))
> +                 && 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;
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C 
> b/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
> new file mode 100644
> index 00000000000..605f989a2eb
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
> @@ -0,0 +1,24 @@
> +// { dg-do compile { target c++11 } }
> +// { dg-options "-O2 -fnon-call-exceptions -ftrapping-math 
> -fdump-tree-optimized-eh" }
> +
> +// PR tree-optimization/119903
> +// match and simplify would cause the internal throwable fp comparison
> +// to become only external throwable and lose the landing pad.
> +
> +int f() noexcept;
> +int g() noexcept;
> +
> +int m(double a)
> +{
> +  try {
> +    if (a < 1.0)
> +      return f();
> +    return g();
> +  }catch(...)
> +  {
> +        return -1;
> +  }
> +}
> +
> +// Make sure There is a landing pad for the non-call exception from the 
> comparison.
> +// { dg-final { scan-tree-dump "LP " "optimized" } }
> --
> 2.43.0
>

Reply via email to