Hi, This is the 2nd version for this bug per our discussion.
Compared to the previous patch, this patch ONLY suppresses warnings for the fake read that was introduced with folding. The patch has been bootstrapped and regress tested on both x86 and aarch64. Okay for trunk? Thanks. Qing ====================== >From a858be0fd979e05a6f54ac340e34bf85ddbc7067 Mon Sep 17 00:00:00 2001 From: Qing Zhao <qing.z...@oracle.com> Date: Wed, 23 Feb 2022 23:45:10 +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. 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 | 7 ++++++- 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 +++++++++++ 4 files changed, 38 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 16f02c2d098..e11a775ad9f 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -4379,7 +4379,12 @@ 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. */ + 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/testsuite/gcc.dg/auto-init-pr104550-1.c b/gcc/testsuite/gcc.dg/auto-init-pr104550-1.c new file mode 100644 index 00000000000..a08110c3a17 --- /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 00000000000..2c395b32d32 --- /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 00000000000..9893e37f12d --- /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