On Mon, 27 Feb 2023, Qing Zhao wrote:

> Ping.

OK.

Thanks,
Richard.

> Qing
> 
> Begin forwarded message:
> 
> From: Qing Zhao <qing.z...@oracle.com<mailto:qing.z...@oracle.com>>
> Subject: [V2][PATCH] Fixing PR107411
> Date: February 21, 2023 at 9:46:04 AM EST
> To: ja...@redhat.com<mailto:ja...@redhat.com>, 
> rguent...@suse.de<mailto:rguent...@suse.de>
> Cc: gcc-patches@gcc.gnu.org<mailto:gcc-patches@gcc.gnu.org>, Qing Zhao 
> <qing.z...@oracle.com<mailto:qing.z...@oracle.com>>
> 
> This is the 2nd version of the patch.
> compared to the first version, the major change is:
> 
> use sprintf to replace xasprintf per Jacub's suggestion.
> 
> bootstrapped and regression tested on both x86 and aarch64.
> 
> Okay for committing?
> 
> thanks.
> 
> Qing
> 
> =======================
> 
> 
> This is a bug in tree-ssa-uninit.cc<http://tree-ssa-uninit.cc>.
> When doing the following:
> 
>  /* Ignore the call to .DEFERRED_INIT that define the original
>     var itself as the following case:
>       temp = .DEFERRED_INIT (4, 2, “alt_reloc");
>       alt_reloc = temp;
>     In order to avoid generating warning for the fake usage
>     at alt_reloc = temp.
>  */
> 
> We need to compare the var name inside the .DEFERRED_INIT call
> (the 3rd argument) and the name for the LHS variable. if they are the same,
> we will NOT report the warning.
> 
> There is one issue when we get the name for the LHS variable. when the
> variable doesn't have a DECL_NAME (it's not a user declared variable,
> which is the case for this bug):
> 
>  _1 = .DEFERRED_INIT (4, 2, &"D.2389"[0]);
>  D.2389 = _1;
> 
> The current checking just ignores this case, and still report the warning.
> 
> The fix is very simple, when getting the name for the LHS variable, we should
> consider this case and come up with the name the same way as we construct the
> 3rd argument for the call to .DEFERRED_INIT (please refer to the routine
> "gimple_add_init_for_auto_var")
> 
> PR middle-end/107411
> 
> gcc/ChangeLog:
> 
> PR middle-end/107411
> * gimplify.cc<http://gimplify.cc> (gimple_add_init_for_auto_var): Use sprintf 
> to replace
> xasprintf.
> * tree-ssa-uninit.cc<http://tree-ssa-uninit.cc> (warn_uninit): Handle the 
> case when the
> LHS varaible of a .DEFERRED_INIT call doesn't have a DECL_NAME.
> 
> gcc/testsuite/ChangeLog:
> 
> PR middle-end/107411
> * g++.dg/pr107411.C: New test.
> ---
> gcc/gimplify.cc<http://gimplify.cc>                 |  4 ++--
> gcc/testsuite/g++.dg/pr107411.C | 10 ++++++++++
> gcc/tree-ssa-uninit.cc<http://tree-ssa-uninit.cc>          | 23 
> ++++++++++++++++-------
> 3 files changed, 28 insertions(+), 9 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/pr107411.C
> 
> diff --git a/gcc/gimplify.cc<http://gimplify.cc> 
> b/gcc/gimplify.cc<http://gimplify.cc>
> index 96845154a92..35d1ea22623 100644
> --- a/gcc/gimplify.cc<http://gimplify.cc>
> +++ b/gcc/gimplify.cc<http://gimplify.cc>
> @@ -1775,9 +1775,9 @@ gimple_add_init_for_auto_var (tree decl,
> 
>   else
>     {
> -      char *decl_name_anonymous = xasprintf ("D.%u", DECL_UID (decl));
> +      char decl_name_anonymous[3 + (HOST_BITS_PER_INT + 2) / 3];
> +      sprintf (decl_name_anonymous, "D.%u", DECL_UID (decl));
>       decl_name = build_string_literal (decl_name_anonymous);
> -      free (decl_name_anonymous);
>     }
> 
>   tree call = build_call_expr_internal_loc (loc, IFN_DEFERRED_INIT,
> diff --git a/gcc/testsuite/g++.dg/pr107411.C b/gcc/testsuite/g++.dg/pr107411.C
> new file mode 100644
> index 00000000000..7eefecae4f3
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr107411.C
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Werror=uninitialized -ftrivial-auto-var-init=zero"  } */
> +int t();
> +void f(int);
> +
> +void j()
> +{
> +  const int& e = t();
> +  f(e);
> +}
> diff --git a/gcc/tree-ssa-uninit.cc<http://tree-ssa-uninit.cc> 
> b/gcc/tree-ssa-uninit.cc<http://tree-ssa-uninit.cc>
> index c555cf5cd50..9f720ae1f4f 100644
> --- a/gcc/tree-ssa-uninit.cc<http://tree-ssa-uninit.cc>
> +++ b/gcc/tree-ssa-uninit.cc<http://tree-ssa-uninit.cc>
> @@ -224,8 +224,6 @@ warn_uninit (opt_code opt, tree t, tree var, gimple 
> *context,
>     at alt_reloc = temp.
>  */
>  tree lhs_var = NULL_TREE;
> -  tree lhs_var_name = NULL_TREE;
> -  const char *lhs_var_name_str = NULL;
> 
>  /* Get the variable name from the 3rd argument of call.  */
>  tree var_name = gimple_call_arg (var_def_stmt, 2);
> @@ -239,11 +237,22 @@ warn_uninit (opt_code opt, tree t, tree var, gimple 
> *context,
>      else if (TREE_CODE (gimple_assign_lhs (context)) == SSA_NAME)
> lhs_var = SSA_NAME_VAR (gimple_assign_lhs (context));
>    }
> -  if (lhs_var
> -      && (lhs_var_name = DECL_NAME (lhs_var))
> -      && (lhs_var_name_str = IDENTIFIER_POINTER (lhs_var_name))
> -      && (strcmp (lhs_var_name_str, var_name_str) == 0))
> -    return;
> +  if (lhs_var)
> +    {
> +      /* Get the name string for the LHS_VAR.
> + Refer to routine gimple_add_init_for_auto_var.  */
> +      if (DECL_NAME (lhs_var)
> +  && (strcmp (IDENTIFIER_POINTER (DECL_NAME (lhs_var)),
> +      var_name_str) == 0))
> + return;
> +      else if (!DECL_NAME (lhs_var))
> + {
> +  char lhs_var_name_str_buf[3 + (HOST_BITS_PER_INT + 2) / 3];
> +  sprintf (lhs_var_name_str_buf, "D.%u", DECL_UID (lhs_var));
> +  if (strcmp (lhs_var_name_str_buf, var_name_str) == 0)
> +    return;
> + }
> +    }
>  gcc_assert (var_name_str && var_def_stmt);
> }
>     }
> --
> 2.31.1
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)

Reply via email to