Hi, Jakub and Richard:

This is the 3rd version of the patch, the major change compared to the previous 
version are:

1. Add warning_enabled_at guard before “suppress_warning”
2. Add location to the call to __builtin_clear_padding for auto init.

The patch has been bootstrapped and regress tested on both x86 and aarch64.
Okay for trunk?

Thanks.

Qing

==================================
From 8314ded4ca0f59c5a3ec431c9c3768fcaf2a0949 Mon Sep 17 00:00:00 2001
From: Qing Zhao <qing.z...@oracle.com>
Date: Thu, 24 Feb 2022 22:38:38 +0000
Subject: [PATCH] Suppress uninitialized warnings for new created uses from
 __builtin_clear_padding folding [PR104550]

__builtin_clear_padding(&object) will clear all the padding bits of the object.
actually, it doesn't involve any use of an user variable. Therefore, users do
not expect any uninitialized warning from it. It's reasonable to suppress
uninitialized warnings for all new created uses from __builtin_clear_padding
folding.

        PR middle-end/104550

gcc/ChangeLog:

        * gimple-fold.cc (clear_padding_flush): Suppress warnings for new
        created uses.
        * gimplify.cc (gimple_add_padding_init_for_auto_var): Set
        location for new created call to __builtin_clear_padding.

gcc/testsuite/ChangeLog:

        * gcc.dg/auto-init-pr104550-1.c: New test.
        * gcc.dg/auto-init-pr104550-2.c: New test.
        * gcc.dg/auto-init-pr104550-3.c: New test.
---
 gcc/gimple-fold.cc                          | 11 ++++++++++-
 gcc/gimplify.cc                             |  1 +
 gcc/testsuite/gcc.dg/auto-init-pr104550-1.c | 10 ++++++++++
 gcc/testsuite/gcc.dg/auto-init-pr104550-2.c | 11 +++++++++++
 gcc/testsuite/gcc.dg/auto-init-pr104550-3.c | 11 +++++++++++
 5 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/auto-init-pr104550-1.c
 create mode 100644 gcc/testsuite/gcc.dg/auto-init-pr104550-2.c
 create mode 100644 gcc/testsuite/gcc.dg/auto-init-pr104550-3.c

diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index 16f02c2d098d..67b4963ffd96 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -62,6 +62,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "attribs.h"
 #include "asan.h"
 #include "diagnostic-core.h"
+#include "diagnostic.h"
 #include "intl.h"
 #include "calls.h"
 #include "tree-vector-builder.h"
@@ -4379,7 +4380,15 @@ clear_padding_flush (clear_padding_struct *buf, bool 
full)
              else
                {
                  src = make_ssa_name (type);
-                 g = gimple_build_assign (src, unshare_expr (dst));
+                 tree tmp_dst = unshare_expr (dst);
+                 /* The folding introduces a read from the tmp_dst, we should
+                    prevent uninitialized warning analysis from issuing warning
+                    for such fake read.  */
+                 if (warning_enabled_at (buf->loc, OPT_Wuninitialized)
+                     || warning_enabled_at (buf->loc,
+                                            OPT_Wmaybe_uninitialized))
+                   suppress_warning (tmp_dst, OPT_Wuninitialized);
+                 g = gimple_build_assign (src, tmp_dst);
                  gimple_set_location (g, buf->loc);
                  gsi_insert_before (buf->gsi, g, GSI_SAME_STMT);
                  tree mask = native_interpret_expr (type,
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index f570daa015a5..977cf458f858 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -1823,6 +1823,7 @@ gimple_add_padding_init_for_auto_var (tree decl, bool 
is_vla,
 
   gimple *call = gimple_build_call (fn, 2, addr_of_decl,
                                    build_one_cst (TREE_TYPE (addr_of_decl)));
+  gimple_set_location (call, EXPR_LOCATION (decl));
   gimplify_seq_add_stmt (seq_p, call);
 }
 
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c 
b/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c
new file mode 100644
index 000000000000..a08110c3a170
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c
@@ -0,0 +1,10 @@
+/* PR 104550*/
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=pattern" } */
+struct vx_audio_level {
+ int has_monitor_level : 1;
+};
+
+void vx_set_monitor_level() {
+ struct vx_audio_level info; /* { dg-bogus "info" "is used uninitialized" } */
+}
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c 
b/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c
new file mode 100644
index 000000000000..2c395b32d322
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-2.c
@@ -0,0 +1,11 @@
+/* PR 104550 */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=zero" } */
+struct vx_audio_level {
+ int has_monitor_level : 1;
+};
+
+void vx_set_monitor_level() {
+ struct vx_audio_level info; 
+ __builtin_clear_padding (&info);  /* { dg-bogus "info" "is used 
uninitialized" } */ 
+}
diff --git a/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c 
b/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c
new file mode 100644
index 000000000000..9893e37f12d8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/auto-init-pr104550-3.c
@@ -0,0 +1,11 @@
+/* PR 104550 */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized -ftrivial-auto-var-init=pattern" } */
+struct vx_audio_level {
+ int has_monitor_level : 1;
+};
+
+void vx_set_monitor_level() {
+ struct vx_audio_level info;   /* { dg-bogus "info" "is used uninitialized" } 
*/
+ __builtin_clear_padding (&info);  /* { dg-bogus "info" "is used 
uninitialized" } */ 
+}
-- 
2.27.0


Reply via email to