On Tue, 22 Feb 2022, Qing Zhao wrote: > __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. > > The patch has been bootstrapped and regress tested on both x86 and aarch64. > > Okay for trunk? > > Thanks. > > Qing > > ====================================== > From cf6620005f55d4a1f782332809445c270d22cf86 Mon Sep 17 00:00:00 2001 > From: qing zhao <qing.z...@oracle.com> > Date: Mon, 21 Feb 2022 16:38:31 +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. > (clear_padding_emit_loop): Likewise. > (clear_padding_type): Likewise. > (gimple_fold_builtin_clear_padding): Likewise. > > 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 | 31 +++++++++++++++------ > 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, 55 insertions(+), 8 deletions(-) > 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..1e18ba3465a 100644 > --- a/gcc/gimple-fold.cc > +++ b/gcc/gimple-fold.cc > @@ -4296,6 +4296,7 @@ clear_padding_flush (clear_padding_struct *buf, bool > full) > build_int_cst (buf->alias_type, > buf->off + padding_end > - padding_bytes)); > + suppress_warning (dst, OPT_Wuninitialized); > gimple *g = gimple_build_assign (dst, src); > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > @@ -4341,6 +4342,7 @@ clear_padding_flush (clear_padding_struct *buf, bool > full) > tree dst = build2_loc (buf->loc, MEM_REF, atype, > buf->base, > build_int_cst (buf->alias_type, off)); > + suppress_warning (dst, OPT_Wuninitialized); > gimple *g = gimple_build_assign (dst, src); > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > @@ -4370,6 +4372,7 @@ clear_padding_flush (clear_padding_struct *buf, bool > full) > atype = build_aligned_type (type, buf->align); > tree dst = build2_loc (buf->loc, MEM_REF, atype, buf->base, > build_int_cst (buf->alias_type, off)); > + suppress_warning (dst, OPT_Wuninitialized); > tree src; > gimple *g; > if (all_ones > @@ -4420,6 +4423,7 @@ clear_padding_flush (clear_padding_struct *buf, bool > full) > build_int_cst (buf->alias_type, > buf->off + end > - padding_bytes)); > + suppress_warning (dst, OPT_Wuninitialized); > gimple *g = gimple_build_assign (dst, src); > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > @@ -4620,14 +4624,18 @@ clear_padding_emit_loop (clear_padding_struct *buf, > tree type, > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > clear_padding_type (buf, type, buf->sz, for_auto_init); > clear_padding_flush (buf, true); > - g = gimple_build_assign (buf->base, POINTER_PLUS_EXPR, buf->base, > - size_int (buf->sz)); > + tree rhs = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (buf->base), > + buf->base, size_int (buf->sz)); > + suppress_warning (rhs, OPT_Wuninitialized); > + g = gimple_build_assign (buf->base, rhs);
why do we need to suppress warnings on a POINTER_PLUS_EXPR? The use of fold_build2 here is a step backwards btw, I'm not sure whether suppress_warning is properly preserved here. If needed, doesn't suppress_warning (g, OPT_Wuninitialized) work as well, thus suppress the warning on the stmt? > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > g = gimple_build_label (l2); > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > - g = gimple_build_cond (NE_EXPR, buf->base, end, l1, l3); > + tree cond_expr = fold_build2 (NE_EXPR, boolean_type_node, buf->base, end); > + suppress_warning (cond_expr, OPT_Wuninitialized); > + g = gimple_build_cond_from_tree (cond_expr, l1, l3); Likewise. > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > g = gimple_build_label (l3); > @@ -4774,12 +4782,16 @@ clear_padding_type (clear_padding_struct *buf, tree > type, > tree elttype = TREE_TYPE (type); > buf->base = create_tmp_var (build_pointer_type (elttype)); > tree end = make_ssa_name (TREE_TYPE (buf->base)); > - gimple *g = gimple_build_assign (buf->base, POINTER_PLUS_EXPR, > - base, size_int (off)); > + tree rhs = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), > + base, size_int (off)); > + suppress_warning (rhs, OPT_Wuninitialized); > + gimple *g = gimple_build_assign (buf->base, rhs); Likewise and below - I'd have expected we only need to suppress -Wuninitialized on memory references. Can you clarify? Thanks, Richard. > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > - g = gimple_build_assign (end, POINTER_PLUS_EXPR, buf->base, > - size_int (sz)); > + rhs = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (buf->base), > + buf->base, size_int (sz)); > + suppress_warning (rhs, OPT_Wuninitialized); > + g = gimple_build_assign (end, rhs); > gimple_set_location (g, buf->loc); > gsi_insert_before (buf->gsi, g, GSI_SAME_STMT); > buf->sz = fldsz; > @@ -4933,7 +4945,10 @@ gimple_fold_builtin_clear_padding > (gimple_stmt_iterator *gsi) > gimple *g = gimple_build_assign (buf.base, ptr); > gimple_set_location (g, loc); > gsi_insert_before (gsi, g, GSI_SAME_STMT); > - g = gimple_build_assign (end, POINTER_PLUS_EXPR, buf.base, sz); > + tree rhs = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (buf.base), > + buf.base, sz); > + suppress_warning (rhs, OPT_Wuninitialized); > + g = gimple_build_assign (end, rhs); > gimple_set_location (g, loc); > gsi_insert_before (gsi, g, GSI_SAME_STMT); > buf.sz = eltsz; > 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" } */ > +} > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)