]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimple-fold: Improve optimize_memcpy_to_memset to handle STRING_CST [PR78408]
authorAndrew Pinski <quic_apinski@quicinc.com>
Fri, 21 Feb 2025 00:09:05 +0000 (16:09 -0800)
committerAndrew Pinski <quic_apinski@quicinc.com>
Fri, 18 Apr 2025 16:13:04 +0000 (09:13 -0700)
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>
gcc/gimple-fold.cc
gcc/testsuite/gcc.dg/pr78408-3.c [new file with mode: 0644]

index b6456139687497a1c3ff41dec1638a10d7551767..3e6b53d6a0f1861c980744e02e1582f610aae76f 100644 (file)
@@ -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 (file)
index 0000000..3de90d0
--- /dev/null
@@ -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;
+}
+