On Mon, May 5, 2025 at 3:45 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> Like the patch to phiopt (r15-4033-g1f619fe25925a5f7), this adds rewriting
> of VCE to gimple_with_undefined_signed_overflow/rewrite_to_defined_overflow.
> I have not seen a case yet for needing this rewrite but this step is needed
> to use gimple_with_undefined_signed_overflow/rewrite_to_defined_overflow from
> phiopt.

So what again was the "undefinedness" here?  And why is this relevant
for _signed overflow_?  Wouldn't it be at least no problem to V_C_E
a lower-precision value to a higher precision?

Maybe we should simply reject V_C_Es of non-mode-precision entities
on GIMPLE, much like we reject BIT_FIELD_REFs of those.

> Bootstrappd and tested on x86_64-linux-gnu.
>
> gcc/ChangeLog:
>
>         PR tree-optimization/116939
>         * gimple-fold.cc (gimple_with_undefined_signed_overflow): Return true
>         for VCE with integral types.
>         (rewrite_to_defined_overflow): Handle VCE rewriting to a cast.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/gimple-fold.cc | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index c060ef81a42..a6a7fcbb8c1 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -10602,6 +10602,14 @@ gimple_with_undefined_signed_overflow (gimple *stmt)
>    if (!INTEGRAL_TYPE_P (lhs_type)
>        && !POINTER_TYPE_P (lhs_type))
>      return false;
> +  tree rhs = gimple_assign_rhs1 (stmt);
> +  /* VCE from integral types to another integral types but with
> +     different precisions need to be changed into casts
> +     to be well defined. */
> +  if (gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
> +      && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
> +      && is_gimple_val (TREE_OPERAND (rhs, 0)))
> +    return true;
>    if (!TYPE_OVERFLOW_UNDEFINED (lhs_type))
>      return false;
>    if (!arith_code_with_undefined_signed_overflow
> @@ -10630,10 +10638,28 @@ rewrite_to_defined_overflow (gimple_stmt_iterator 
> *gsi, gimple *stmt,
>                "overflow ");
>        print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
>      }
> -
> +  gimple_seq stmts = NULL;
> +  /* VCE from integral types to another integral types but with
> +     different precisions need to be changed into casts
> +     to be well defined. */
> +  if (gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR)
> +    {
> +      tree rhs = gimple_assign_rhs1 (stmt);
> +      tree new_rhs = TREE_OPERAND (rhs, 0);
> +      gcc_assert (is_gimple_val (new_rhs));
> +      gimple_assign_set_rhs_code (stmt, NOP_EXPR);
> +      gimple_assign_set_rhs1 (stmt, new_rhs);
> +      if (in_place)
> +         update_stmt (stmt);
> +      else
> +       {
> +         gimple_set_modified (stmt, true);
> +         gimple_seq_add_stmt (&stmts, stmt);
> +       }
> +      return stmts;
> +    }
>    tree lhs = gimple_assign_lhs (stmt);
>    tree type = unsigned_type_for (TREE_TYPE (lhs));
> -  gimple_seq stmts = NULL;
>    if (gimple_assign_rhs_code (stmt) == ABS_EXPR)
>      gimple_assign_set_rhs_code (stmt, ABSU_EXPR);
>    else
> --
> 2.34.1
>

Reply via email to