On Wed, Apr 29, 2026 at 2:03 AM Richard Biener <[email protected]> wrote:
>
> The following avoids (large) string duplication which can happen
> when folding aggregate reads to STRING_CSTs. There's unlikely
> to be followup optimization opportunities.
>
> Bootstrapped and tested on x86-64-unknown-linuyx-gnu (I was surprised
> there's no diagnostic testcase fallout).
>
> OK for trunk?
Ok.
>
> Thanks,
> Richard.
>
> PR tree-optimization/120702
> * gimple-fold.cc (maybe_fold_reference): Only fold
> register type reads.
>
> * gcc.dg/tree-ssa/pr120702.c: New testcase.
> ---
> gcc/gimple-fold.cc | 5 +++++
> gcc/testsuite/gcc.dg/tree-ssa/pr120702.c | 25 ++++++++++++++++++++++++
> 2 files changed, 30 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr120702.c
>
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index 501c1245116..b53478dbb3d 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 00000000000..fb0f8f73a73
> --- /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" } } */
> --
> 2.51.0