diff options
author | Andrew Pinski <quic_apinski@quicinc.com> | 2025-02-20 16:09:05 -0800 |
---|---|---|
committer | Andrew Pinski <quic_apinski@quicinc.com> | 2025-04-18 09:13:04 -0700 |
commit | 94f275432f7ea4781ec7c05fa9d1d81ef6cb3fc1 (patch) | |
tree | 76c708a854f92db998702fa81c15e516c6985360 | |
parent | baf6ad5dad55a7aa1e75d4ccadc05347b4506a1f (diff) | |
download | gcc-94f275432f7ea4781ec7c05fa9d1d81ef6cb3fc1.zip gcc-94f275432f7ea4781ec7c05fa9d1d81ef6cb3fc1.tar.gz gcc-94f275432f7ea4781ec7c05fa9d1d81ef6cb3fc1.tar.bz2 |
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 <quic_apinski@quicinc.com>
-rw-r--r-- | gcc/gimple-fold.cc | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr78408-3.c | 14 |
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index b645613..3e6b53d 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -920,6 +920,23 @@ optimize_memcpy_to_memset (gimple_stmt_iterator *gsip, tree dest, tree src, tree 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)) src2 = gimple_assign_lhs (defstmt); diff --git a/gcc/testsuite/gcc.dg/pr78408-3.c b/gcc/testsuite/gcc.dg/pr78408-3.c new file mode 100644 index 0000000..3de90d0 --- /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; +} + |