On Wed, Apr 23, 2025 at 5:59 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> To speed up things slightly so not needing to call all the way through
> to match and simplify, we should return early for true/false on GIMPLE_COND.

I think we'd still canonicalize the various forms matched by
gimple_cond_true/false_p
to a standard one - we should go through resimplify2 which should constant fold
the compare and in the end we do gimple_cond_make_true/false.

I'm also not sure it's worth short-cutting this, it shouldn't be common to fold
an already canonical if (0) or if (1), no?

Richard.

> gcc/ChangeLog:
>
>         * gimple-fold.cc (fold_stmt_1): For GIMPLE_COND return early
>         for true/false.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/gimple-fold.cc | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index 94d5a1ebbd7..2381a82d2b1 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -6646,12 +6646,19 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, 
> tree (*valueize) (tree),
>        break;
>      case GIMPLE_COND:
>        {
> +       gcond *gc = as_a <gcond *> (stmt);
> +       /* If the cond is already true/false, just return false.  */
> +       if (gimple_cond_true_p (gc)
> +           || gimple_cond_false_p (gc))
> +         {
> +           fold_undefer_overflow_warnings (false, stmt, 0);
> +           return false;
> +         }
>         /* Canonicalize operand order.  */
> -       tree lhs = gimple_cond_lhs (stmt);
> -       tree rhs = gimple_cond_rhs (stmt);
> +       tree lhs = gimple_cond_lhs (gc);
> +       tree rhs = gimple_cond_rhs (gc);
>         if (tree_swap_operands_p (lhs, rhs))
>           {
> -           gcond *gc = as_a <gcond *> (stmt);
>             gimple_cond_set_lhs (gc, rhs);
>             gimple_cond_set_rhs (gc, lhs);
>             gimple_cond_set_code (gc,
> --
> 2.43.0
>

Reply via email to