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 >