On Sun, Sep 3, 2023 at 6:19 PM Andrew Pinski via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> This improves rewrite_to_defined_overflow slightly if we already
> have an unsigned type. The only place where this seems to show up
> is ifcombine. It removes one extra statement which gets added and
> then later on removed.

What specific case is that?  It sounds like we call the function when
it isn't needed?  I also think that refactoring to a special case when
the LHS type already is OK will result in better code in the end.

Richard.

> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
>
> gcc/ChangeLog:
>
>         PR tree-optimization/111276
>         * gimple-fold.cc (rewrite_to_defined_overflow): Don't
>         add a new lhs if we already the unsigned type.
> ---
>  gcc/gimple-fold.cc | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index fd01810581a..2fcafeada37 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -8721,10 +8721,19 @@ rewrite_to_defined_overflow (gimple *stmt, bool 
> in_place /* = false */)
>         op = gimple_convert (&stmts, type, op);
>         gimple_set_op (stmt, i, op);
>        }
> -  gimple_assign_set_lhs (stmt, make_ssa_name (type, stmt));
> +  bool needs_cast_back = false;
> +  if (!useless_type_conversion_p (type, TREE_TYPE (lhs)))
> +    {
> +      gimple_assign_set_lhs (stmt, make_ssa_name (type, stmt));
> +      needs_cast_back = true;
> +    }
> +
>    if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
>      gimple_assign_set_rhs_code (stmt, PLUS_EXPR);
> -  gimple_set_modified (stmt, true);
> +
> +  if (needs_cast_back || stmts)
> +    gimple_set_modified (stmt, true);
> +
>    if (in_place)
>      {
>        gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
> @@ -8734,6 +8743,10 @@ rewrite_to_defined_overflow (gimple *stmt, bool 
> in_place /* = false */)
>      }
>    else
>      gimple_seq_add_stmt (&stmts, stmt);
> +
> +  if (!needs_cast_back)
> +    return stmts;
> +
>    gimple *cvt = gimple_build_assign (lhs, NOP_EXPR, gimple_assign_lhs 
> (stmt));
>    if (in_place)
>      {
> --
> 2.31.1
>

Reply via email to