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

Reply via email to