Mitigate -Wmaybe-uninitialized in expmed.cc.

Message ID 96e57488-2dba-f4f1-4215-9ee3f259bb3a@suse.cz
State Committed
Commit c5c523723149112d117a6d3b259dfd95b032a545
Headers
Series Mitigate -Wmaybe-uninitialized in expmed.cc. |

Commit Message

Martin Liška May 16, 2022, 8:37 a.m. UTC
  It's the warning I see every time I build GCC:

In file included from /home/marxin/Programming/gcc/gcc/coretypes.h:478,
                 from /home/marxin/Programming/gcc/gcc/expmed.cc:26:
In function ‘poly_uint16 mode_to_bytes(machine_mode)’,
    inlined from ‘typename if_nonpoly<typename T::measurement_type>::type GET_MODE_SIZE(const T&) [with T = scalar_int_mode]’ at /home/marxin/Programming/gcc/gcc/machmode.h:647:24,
    inlined from ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’ at /home/marxin/Programming/gcc/gcc/expmed.cc:5728:56:
/home/marxin/Programming/gcc/gcc/machmode.h:550:49: warning: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ may be used uninitialized [-Wmaybe-uninitialized]
  550 |           ? mode_size_inline (mode) : mode_size[mode]);
      |                                                 ^~~~
/home/marxin/Programming/gcc/gcc/expmed.cc: In function ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’:
/home/marxin/Programming/gcc/gcc/expmed.cc:5657:19: note: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ was declared here
 5657 |   scalar_int_mode int_mode;
      |                   ^~~~~~~~

Can we please mitigate it?

gcc/ChangeLog:

	* expmed.cc (emit_store_flag_1): Mitigate -Wmaybe-uninitialized
	warning.
---
 gcc/expmed.cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Richard Sandiford May 16, 2022, 8:56 a.m. UTC | #1
Martin Liška <mliska@suse.cz> writes:
> It's the warning I see every time I build GCC:
>
> In file included from /home/marxin/Programming/gcc/gcc/coretypes.h:478,
>                  from /home/marxin/Programming/gcc/gcc/expmed.cc:26:
> In function ‘poly_uint16 mode_to_bytes(machine_mode)’,
>     inlined from ‘typename if_nonpoly<typename T::measurement_type>::type GET_MODE_SIZE(const T&) [with T = scalar_int_mode]’ at /home/marxin/Programming/gcc/gcc/machmode.h:647:24,
>     inlined from ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’ at /home/marxin/Programming/gcc/gcc/expmed.cc:5728:56:
> /home/marxin/Programming/gcc/gcc/machmode.h:550:49: warning: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ may be used uninitialized [-Wmaybe-uninitialized]
>   550 |           ? mode_size_inline (mode) : mode_size[mode]);
>       |                                                 ^~~~
> /home/marxin/Programming/gcc/gcc/expmed.cc: In function ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’:
> /home/marxin/Programming/gcc/gcc/expmed.cc:5657:19: note: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ was declared here
>  5657 |   scalar_int_mode int_mode;
>       |                   ^~~~~~~~
>
> Can we please mitigate it?
>
> gcc/ChangeLog:
>
> 	* expmed.cc (emit_store_flag_1): Mitigate -Wmaybe-uninitialized
> 	warning.

Not a strong objection, but TBH I'd rather we didn't work around false
positives like this.

Richard

> ---
>  gcc/expmed.cc | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gcc/expmed.cc b/gcc/expmed.cc
> index 41738c1efe9..f23d63471ea 100644
> --- a/gcc/expmed.cc
> +++ b/gcc/expmed.cc
> @@ -5654,7 +5654,7 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
>  
>    /* If we are comparing a double-word integer with zero or -1, we can
>       convert the comparison into one involving a single word.  */
> -  scalar_int_mode int_mode;
> +  scalar_int_mode int_mode = {};
>    if (is_int_mode (mode, &int_mode)
>        && GET_MODE_BITSIZE (int_mode) == BITS_PER_WORD * 2
>        && (!MEM_P (op0) || ! MEM_VOLATILE_P (op0)))
  
Richard Biener May 16, 2022, 10:32 a.m. UTC | #2
On Mon, May 16, 2022 at 11:18 AM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Martin Liška <mliska@suse.cz> writes:
> > It's the warning I see every time I build GCC:
> >
> > In file included from /home/marxin/Programming/gcc/gcc/coretypes.h:478,
> >                  from /home/marxin/Programming/gcc/gcc/expmed.cc:26:
> > In function ‘poly_uint16 mode_to_bytes(machine_mode)’,
> >     inlined from ‘typename if_nonpoly<typename T::measurement_type>::type GET_MODE_SIZE(const T&) [with T = scalar_int_mode]’ at /home/marxin/Programming/gcc/gcc/machmode.h:647:24,
> >     inlined from ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’ at /home/marxin/Programming/gcc/gcc/expmed.cc:5728:56:
> > /home/marxin/Programming/gcc/gcc/machmode.h:550:49: warning: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ may be used uninitialized [-Wmaybe-uninitialized]
> >   550 |           ? mode_size_inline (mode) : mode_size[mode]);
> >       |                                                 ^~~~
> > /home/marxin/Programming/gcc/gcc/expmed.cc: In function ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’:
> > /home/marxin/Programming/gcc/gcc/expmed.cc:5657:19: note: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ was declared here
> >  5657 |   scalar_int_mode int_mode;
> >       |                   ^~~~~~~~
> >
> > Can we please mitigate it?
> >
> > gcc/ChangeLog:
> >
> >       * expmed.cc (emit_store_flag_1): Mitigate -Wmaybe-uninitialized
> >       warning.
>
> Not a strong objection, but TBH I'd rather we didn't work around false
> positives like this.

It only seems to happen with your host compiler though?  The set of

# These files are to have specific diagnostics suppressed, or are not to
# be subject to -Werror:
# flex output may yield harmless "no previous prototype" warnings
build/gengtype-lex.o-warn = -Wno-error
gengtype-lex.o-warn = -Wno-error
libgcov-util.o-warn = -Wno-error
libgcov-driver-tool.o-warn = -Wno-error
libgcov-merge-tool.o-warn = -Wno-error
gimple-match.o-warn = -Wno-unused
generic-match.o-warn = -Wno-unused
dfp.o-warn = -Wno-strict-aliasing

doesn't include expmed.o at least.

> Richard
>
> > ---
> >  gcc/expmed.cc | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/gcc/expmed.cc b/gcc/expmed.cc
> > index 41738c1efe9..f23d63471ea 100644
> > --- a/gcc/expmed.cc
> > +++ b/gcc/expmed.cc
> > @@ -5654,7 +5654,7 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
> >
> >    /* If we are comparing a double-word integer with zero or -1, we can
> >       convert the comparison into one involving a single word.  */
> > -  scalar_int_mode int_mode;
> > +  scalar_int_mode int_mode = {};
> >    if (is_int_mode (mode, &int_mode)
> >        && GET_MODE_BITSIZE (int_mode) == BITS_PER_WORD * 2
> >        && (!MEM_P (op0) || ! MEM_VOLATILE_P (op0)))
  
Martin Liška May 17, 2022, 2:35 p.m. UTC | #3
On 5/16/22 12:32, Richard Biener wrote:
> It only seems to happen with your host compiler though?  The set of

Yes, happens with just released 12.1 as host compiler:

g++ -fcf-protection -fno-PIE -c   -g -O2     -DIN_GCC -fPIC    -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common  -DHAVE_CONFIG_H -I. -I. -I/home/marxin/Programming/gcc/gcc -I/home/marxin/Programming/gcc/gcc/. -I/home/marxin/Programming/gcc/gcc/../include -I/home/marxin/Programming/gcc/gcc/../libcpp/include -I/home/marxin/Programming/gcc/gcc/../libcody  -I/home/marxin/Programming/gcc/gcc/../libdecnumber -I/home/marxin/Programming/gcc/gcc/../libdecnumber/bid -I../libdecnumber -I/home/marxin/Programming/gcc/gcc/../libbacktrace   -o expmed.o -MT expmed.o -MMD -MP -MF ./.deps/expmed.TPo /home/marxin/Programming/gcc/gcc/expmed.cc
In file included from /home/marxin/Programming/gcc/gcc/coretypes.h:478,
                 from /home/marxin/Programming/gcc/gcc/expmed.cc:26:
In function ‘poly_uint16 mode_to_bytes(machine_mode)’,
    inlined from ‘typename if_nonpoly<typename T::measurement_type>::type GET_MODE_SIZE(const T&) [with T = scalar_int_mode]’ at /home/marxin/Programming/gcc/gcc/machmode.h:647:24,
    inlined from ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’ at /home/marxin/Programming/gcc/gcc/expmed.cc:5728:56:
/home/marxin/Programming/gcc/gcc/machmode.h:550:49: warning: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ may be used uninitialized [-Wmaybe-uninitialized]
  550 |           ? mode_size_inline (mode) : mode_size[mode]);
      |                                                 ^~~~
/home/marxin/Programming/gcc/gcc/expmed.cc: In function ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’:
/home/marxin/Programming/gcc/gcc/expmed.cc:5657:19: note: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ was declared here
 5657 |   scalar_int_mode int_mode;
      |                   ^~~~~~~~

Cheers,
Martin
  
Martin Liška May 19, 2022, 2:17 p.m. UTC | #4
On 5/16/22 10:56, Richard Sandiford wrote:
> Martin Liška <mliska@suse.cz> writes:
>> It's the warning I see every time I build GCC:
>>
>> In file included from /home/marxin/Programming/gcc/gcc/coretypes.h:478,
>>                  from /home/marxin/Programming/gcc/gcc/expmed.cc:26:
>> In function ‘poly_uint16 mode_to_bytes(machine_mode)’,
>>     inlined from ‘typename if_nonpoly<typename T::measurement_type>::type GET_MODE_SIZE(const T&) [with T = scalar_int_mode]’ at /home/marxin/Programming/gcc/gcc/machmode.h:647:24,
>>     inlined from ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’ at /home/marxin/Programming/gcc/gcc/expmed.cc:5728:56:
>> /home/marxin/Programming/gcc/gcc/machmode.h:550:49: warning: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ may be used uninitialized [-Wmaybe-uninitialized]
>>   550 |           ? mode_size_inline (mode) : mode_size[mode]);
>>       |                                                 ^~~~
>> /home/marxin/Programming/gcc/gcc/expmed.cc: In function ‘rtx_def* emit_store_flag_1(rtx, rtx_code, rtx, rtx, machine_mode, int, int, machine_mode)’:
>> /home/marxin/Programming/gcc/gcc/expmed.cc:5657:19: note: ‘*(unsigned int*)((char*)&int_mode + offsetof(scalar_int_mode, scalar_int_mode::m_mode))’ was declared here
>>  5657 |   scalar_int_mode int_mode;
>>       |                   ^~~~~~~~
>>
>> Can we please mitigate it?
>>
>> gcc/ChangeLog:
>>
>> 	* expmed.cc (emit_store_flag_1): Mitigate -Wmaybe-uninitialized
>> 	warning.
> 
> Not a strong objection, but TBH I'd rather we didn't work around false
> positives like this.

Sure, but as you know, -Wmaybe-uninitialized has pretty high rate
of false positivity :/

Martin

> 
> Richard
> 
>> ---
>>  gcc/expmed.cc | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/gcc/expmed.cc b/gcc/expmed.cc
>> index 41738c1efe9..f23d63471ea 100644
>> --- a/gcc/expmed.cc
>> +++ b/gcc/expmed.cc
>> @@ -5654,7 +5654,7 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
>>  
>>    /* If we are comparing a double-word integer with zero or -1, we can
>>       convert the comparison into one involving a single word.  */
>> -  scalar_int_mode int_mode;
>> +  scalar_int_mode int_mode = {};
>>    if (is_int_mode (mode, &int_mode)
>>        && GET_MODE_BITSIZE (int_mode) == BITS_PER_WORD * 2
>>        && (!MEM_P (op0) || ! MEM_VOLATILE_P (op0)))
  

Patch

diff --git a/gcc/expmed.cc b/gcc/expmed.cc
index 41738c1efe9..f23d63471ea 100644
--- a/gcc/expmed.cc
+++ b/gcc/expmed.cc
@@ -5654,7 +5654,7 @@  emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
 
   /* If we are comparing a double-word integer with zero or -1, we can
      convert the comparison into one involving a single word.  */
-  scalar_int_mode int_mode;
+  scalar_int_mode int_mode = {};
   if (is_int_mode (mode, &int_mode)
       && GET_MODE_BITSIZE (int_mode) == BITS_PER_WORD * 2
       && (!MEM_P (op0) || ! MEM_VOLATILE_P (op0)))