__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); 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); 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); 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" } */ +} -- 2.27.0