Hi, Richard,

> On Feb 23, 2022, at 1:38 AM, Richard Biener <rguent...@suse.de> wrote:
> 
> 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?

This is the place I was not sure either.  Need some discussion…

From my understanding, __builtin_clear_padding (&object), does not _use_ any 
variable,
 therefore, no uninitialized usage warning should be emitted for it. 

Therefore, during the folding of __builtin_clear_padding, all the artificial 
usages of variables 
that were introduced by the folding should be suppressed from issue 
uninitialized warning.

That’s the basic idea. 

As a result, I added suppress_warning for all the possible usages of a variable 
introduced during
The folding. 

So, my question here is:   does the new expression “POINTER_PLUS_EXPR 
(buf->base, buf->size)” 
Introduce a usage of the “buf->base”?  If so, then we should suppress warning 
for this expression, 
Right?


>  The
> use of fold_build2 here is a step backwards btw, I'm not sure
> whether suppress_warning is properly preserved here.

Don’t quite understand here, what’s you mean by “a step backwards”?

>  If needed,
> doesn't suppress_warning (g, OPT_Wuninitialized) work as well,
> thus suppress the warning on the stmt?

I am not sure here. 
> 
>>   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?

Based on the current testing case of PR104550, suppress_warning for memory 
references is enough to
resolve the bug,  however, if the folding of __builtin_clear_padding might 
introduce new loops, it will 
emit POINTER_PLUS_EXPR, I am not sure whether we need to suppress warning for 
them.

Thanks.

Qing

> 
> 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)

Reply via email to