> Am 15.02.2026 um 03:07 schrieb Andrew Pinski <[email protected]>:
> 
> So a few more restrictions are needed here.
> First we don't need to change if the return statement is already
> a RESULT_DECL nor deference of the RESULT_DECL.
> Second proping a global variable into the return is ok for the most
> part except enumtls does not know how to expand that correctly and things
> go down hill. So restrict to non global vars now.
> 
> Bootstrapped and tested on x86_64-linux-gnu.
> Also tested the testcase with TLS turned off so enumtls ran.

Ok

Richard 

>    PR tree-optimization/124099
> 
> gcc/ChangeLog:
> 
>    * tree-ssa-forwprop.cc (optimize_agr_copyprop_return): Don't do anything
>    if the return is already result decl or a deference of result decl.
>    Also reject non local var decls.
> 
> gcc/testsuite/ChangeLog:
> 
>    * gcc.dg/torture/tls-return-1.c: New test.
> 
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
> gcc/testsuite/gcc.dg/torture/tls-return-1.c | 12 ++++++++++++
> gcc/tree-ssa-forwprop.cc                    | 15 +++++++++++++--
> 2 files changed, 25 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/torture/tls-return-1.c
> 
> diff --git a/gcc/testsuite/gcc.dg/torture/tls-return-1.c 
> b/gcc/testsuite/gcc.dg/torture/tls-return-1.c
> new file mode 100644
> index 00000000000..aa56e42904c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/tls-return-1.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +
> +/* PR tree-optimization/124099 */
> +
> +struct s1 { int t[2];};
> +__thread struct s1 t;
> +struct s1 g()
> +{
> +  return t;
> +}
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index c4fde7b4aae..a8a8e296b32 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -1734,11 +1734,22 @@ optimize_agr_copyprop_return (gimple *defstmt, 
> greturn *use,
>       || is_gimple_min_invariant (rvalue)
>       || TYPE_VOLATILE (TREE_TYPE (rvalue)))
>     return;
> +
> +  /* `<retval> = t;` is already the best it could be.
> +     Likewise `*<retval>_N(D) = t`.  */
> +  if (TREE_CODE (rvalue) == RESULT_DECL
> +      || (TREE_CODE (rvalue) == MEM_REF
> +      && TREE_CODE (TREE_OPERAND (rvalue, 0)) == SSA_NAME
> +      && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (rvalue, 0)))
> +           == RESULT_DECL))
> +    return;
>   tree newsrc = new_src_based_on_copy (rvalue, dest, src);
>   if (!newsrc)
>     return;
> -  /* Currently only support decls, could support VCEs too? */
> -  if (!DECL_P (newsrc))
> +  /* Currently only support non-global vars.
> +     See PR 124099 on enumtls not supporting expanding for GIMPLE_RETURN.
> +     FIXME: could support VCEs too?  */
> +  if (!VAR_P (newsrc) || is_global_var (newsrc))
>     return;
>   if (dump_file && (dump_flags & TDF_DETAILS))
>     {
> --
> 2.43.0
> 

Reply via email to