On Fri, Feb 21, 2025 at 5:11 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> While looking into PR 118947, I noticed that optimize_memcpy_to_memset didn't
> handle STRING_CST which are also used for a memset of 0 but for char arrays.
> This fixes that and improves optimize_memcpy_to_memset to handle that case.
>
> This fixes part of PR 118947 but not the whole thing; we still need to skip 
> over
> vdefs in some cases.
>
> Boostrapped and tested on x86_64-linux-gnu.

OK.

Thanks,
Richard.

>         PR tree-optimization/78408
>         PR tree-optimization/118947
>
> gcc/ChangeLog:
>
>         * gimple-fold.cc (optimize_memcpy_to_memset): Handle STRING_CST case 
> too.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr78408-3.c: New test.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/gimple-fold.cc               | 17 +++++++++++++++++
>  gcc/testsuite/gcc.dg/pr78408-3.c | 14 ++++++++++++++
>  2 files changed, 31 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr78408-3.c
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index 0380c7af4c2..1a48778da5a 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -919,6 +919,23 @@ optimize_memcpy_to_memset (gimple_stmt_iterator *gsip, 
> tree dest, tree src, tree
>    poly_int64 offset, offset2;
>    tree val = integer_zero_node;
>    if (gimple_store_p (defstmt)
> +      && gimple_assign_single_p (defstmt)
> +      && TREE_CODE (gimple_assign_rhs1 (defstmt)) == STRING_CST
> +      && !gimple_clobber_p (defstmt))
> +    {
> +      tree str = gimple_assign_rhs1 (defstmt);
> +      src2 = gimple_assign_lhs (defstmt);
> +      /* The string must contain all null char's for now.  */
> +      for (int i = 0; i < TREE_STRING_LENGTH (str); i++)
> +       {
> +         if (TREE_STRING_POINTER (str)[i] != 0)
> +           {
> +             src2 = NULL_TREE;
> +             break;
> +           }
> +       }
> +    }
> +  else if (gimple_store_p (defstmt)
>        && gimple_assign_single_p (defstmt)
>        && TREE_CODE (gimple_assign_rhs1 (defstmt)) == CONSTRUCTOR
>        && !gimple_clobber_p (defstmt))
> diff --git a/gcc/testsuite/gcc.dg/pr78408-3.c 
> b/gcc/testsuite/gcc.dg/pr78408-3.c
> new file mode 100644
> index 00000000000..3de90d02392
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr78408-3.c
> @@ -0,0 +1,14 @@
> +/* PR tree-optimization/78408 */
> +/* { dg-do compile { target size32plus } } */
> +/* { dg-options "-O2 -fdump-tree-forwprop1-details" } */
> +/* { dg-final { scan-tree-dump-times "after previous" 1 "forwprop1" } } */
> +
> +void* aaa();
> +void* bbb()
> +{
> +    void* ret = aaa();
> +    char buf[32] = {};
> +    __builtin_memcpy(ret, buf, 32);
> +    return ret;
> +}
> +
> --
> 2.43.0
>

Reply via email to