Hi,

This is the 2nd version of the patch.
The original patch is at:

https://gcc.gnu.org/pipermail/gcc-patches/2021-December/586341.html

In addition to resolve the two issues mentioned in the original patch,
This patch also can be used as a very good workaround for the issue in PR103720
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103720

And as I checked, the patch can fix all the bogus uninitialized warnings when
building kernel with -O2 + -ftrivial-auto-var-init=zero + -Wuninitialized.

So, this is a very important patch that need to be included into gcc12.

Compared to the 1st patch, the major changes are to resolve Martin’s comments on
tree-ssa-uninit.c

1.  Add some meaningful temporaries to break the long expression to make it
     Readable. And also add comments to explain the purpose of the statement;

2.  Resolve the memory leakage of the dynamically created string.

The patch has been bootstrapped and regressing tested on both x86 and aarch64, 
no issues.
Okay for commit?

thanks.

Qing

=================================================

******Compared to the 1st version, the code change is:

 --- a/gcc/tree-ssa-uninit.c
 +++ b/gcc/tree-ssa-uninit.c
 @@ -182,9 +182,22 @@ warn_uninit (opt_code opt, tree t, tree var, const char 
*gmsgid,
@@ -798,26 +798,35 @@
    if (!var && !SSA_NAME_VAR (t))
      {
        gimple *def_stmt = SSA_NAME_DEF_STMT (t);
-@@ -197,9 +210,34 @@ warn_uninit (opt_code opt, tree t, tree var, const char 
*gmsgid,
+@@ -197,9 +210,43 @@ warn_uninit (opt_code opt, tree t, tree var, const char 
*gmsgid,
               && zerop (gimple_assign_rhs2 (def_stmt)))
             var = SSA_NAME_VAR (v);
         }
 +
 +      if (gimple_call_internal_p (def_stmt, IFN_DEFERRED_INIT))
 +       {
++        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.  */
 +         var_name = gimple_call_arg (def_stmt, 2);
 +         var_name = TREE_OPERAND (TREE_OPERAND (var_name, 0), 0);
 +         var_name_str = TREE_STRING_POINTER (var_name);
 +
-+        if (is_gimple_assign (context)
-+            && TREE_CODE (gimple_assign_lhs (context)) == VAR_DECL
-+            && DECL_NAME (gimple_assign_lhs (context))
-+            && IDENTIFIER_POINTER (DECL_NAME (gimple_assign_lhs (context))))
-+          if (strcmp
-+                (IDENTIFIER_POINTER (DECL_NAME (gimple_assign_lhs (context))),
-+                 var_name_str) == 0)
-+            return;
++        /* Ignore the call to .DEFERRED_INIT that define the original
++           var itself.  */
++        if (is_gimple_assign (context))
++          {
++            if (TREE_CODE (gimple_assign_lhs (context)) == VAR_DECL)
++              lhs_var = gimple_assign_lhs (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;
 +
 +         /* Get the variable declaration location from the def_stmt.  */
 +         var_decl_loc = gimple_location (def_stmt);
@@ -834,7 +843,7 @@
      return;

    /* Avoid warning if we've already done so or if the warning has been
-@@ -207,36 +245,56 @@ warn_uninit (opt_code opt, tree t, tree var, const char 
*gmsgid,
+@@ -207,36 +254,54 @@ warn_uninit (opt_code opt, tree t, tree var, const char 
*gmsgid,
    if (((warning_suppressed_p (context, OPT_Wuninitialized)
         || (gimple_assign_single_p (context)
             && get_no_uninit_warning (gimple_assign_rhs1 (context)))))
@@ -863,25 +872,24 @@

    auto_diagnostic_group d;
 -  if (!warning_at (location, opt, gmsgid, var))
+-    return;
 +  char *gmsgid_final = XNEWVEC (char, strlen (gmsgid) + 5);
 +  gmsgid_final[0] = 0;
-+  if (var)
-+    strcat (gmsgid_final, "%qD ");
-+  else if (var_name)
-+    strcat (gmsgid_final, "%qs ");
++  strcat (gmsgid_final, var ? "%qD " : "%qs ");
 +  strcat (gmsgid_final, gmsgid);
 +
-+  if (var && !warning_at (location, opt, gmsgid_final, var))
-+    return;
-+  else if (var_name && !warning_at (location, opt, gmsgid_final, 
var_name_str))
-     return;
++  if ((var && !warning_at (location, opt, gmsgid_final, var))
++      || (var_name && !warning_at (location, opt, gmsgid_final, 
var_name_str)))
++    {
++      XDELETE (gmsgid_final);
++      return;
++    }
++  XDELETE (gmsgid_final);

    /* Avoid subsequent warnings for reads of the same variable again.  */
 -  suppress_warning (var, opt);
-+  if (var)
-+    suppress_warning (var, opt);
-+  else if (repl_var)
-+    suppress_warning (repl_var, opt);
++  if (var || repl_var)
++    suppress_warning (var ? var : repl_var, opt);

    /* Issue a note pointing to the read variable unless the warning
       is at the same location.  */
@@ -898,7 +906,7 @@
  }

******The complete patch is:




Attachment: 0001-Enable-Wuninitialized-ftrivial-auto-var-init-for-add.patch
Description: 0001-Enable-Wuninitialized-ftrivial-auto-var-init-for-add.patch

Reply via email to