https://gcc.gnu.org/g:1d1b64a5bdcf2a9352479fb9f6f399ac2e5b8a98

commit r17-1164-g1d1b64a5bdcf2a9352479fb9f6f399ac2e5b8a98
Author: Richard Biener <[email protected]>
Date:   Wed Apr 29 09:19:43 2026 +0200

    tree-optimization/120702 - avoid folding loads to STRING_CSTs
    
    The following avoids (large) string duplication which can happen
    when folding aggregate reads to STRING_CSTs.  There's unlikely
    to be followup optimization opportunities.
    
            PR tree-optimization/120702
            * gimple-fold.cc (maybe_fold_reference): Only fold
            register type reads.
    
            * gcc.dg/tree-ssa/pr120702.c: New testcase.

Diff:
---
 gcc/gimple-fold.cc                       |  5 +++++
 gcc/testsuite/gcc.dg/tree-ssa/pr120702.c | 25 +++++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index dbe16bcb8117..1ceb5aa5fba7 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -306,6 +306,11 @@ maybe_fold_reference (tree expr)
 {
   tree result = NULL_TREE;
 
+  /* Avoid expensive fold_const_aggregate_ref early on aggregate loads
+     and esp. replacing STRING_CSTs inline.  */
+  if (!is_gimple_reg_type (TREE_TYPE (expr)))
+    return NULL_TREE;
+
   if ((TREE_CODE (expr) == VIEW_CONVERT_EXPR
        || TREE_CODE (expr) == REALPART_EXPR
        || TREE_CODE (expr) == IMAGPART_EXPR)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr120702.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr120702.c
new file mode 100644
index 000000000000..fb0f8f73a732
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr120702.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -fdump-tree-optimized" } */
+
+extern void *memcpy(void *, const void *, __SIZE_TYPE__);
+extern int memcmp(const void *, const void *, __SIZE_TYPE__);
+
+static const unsigned char orig[10]
+  = { 'J', '2', 'O', 'Z', 'F', '5', '0', 'F', 'Y', 'L' };
+
+static unsigned char test[10];
+
+int
+verify (void)
+{
+  return 0 == memcmp (test, orig, 10 * sizeof (orig[0]));
+}
+
+int
+benchmark (void)
+{
+  memcpy (test, orig, 10 * sizeof (orig[0]));
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not " = \"J2OZF50FYL\";" "optimized" } } */

Reply via email to