From: Andrew Pinski Date: Fri, 21 Feb 2025 00:09:05 +0000 (-0800) Subject: gimple-fold: Improve optimize_memcpy_to_memset to handle STRING_CST [PR78408] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94f275432f7ea4781ec7c05fa9d1d81ef6cb3fc1;p=thirdparty%2Fgcc.git gimple-fold: Improve optimize_memcpy_to_memset to handle STRING_CST [PR78408] 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. 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 --- diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index b6456139687..3e6b53d6a0f 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; +} +