On Tue, Apr 28, 2020 at 11:28 AM Stefan Schulze Frielinghaus via
Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
>
> While bootstrapping GCC on S/390 the following warning/error is raised:
>
> gcc/var-tracking.c:10239:34: error: 'pre' may be used uninitialized in this 
> function [-Werror=maybe-uninitialized]
> 10239 |       VTI (bb)->out.stack_adjust += pre;
>       |                                  ^
>
> The lines of interest are:
>
>   HOST_WIDE_INT pre, post = 0;
>   // ...
>   if (!frame_pointer_needed)
>     {
>       insn_stack_adjust_offset_pre_post (insn, &pre, &post);
>       // ...
>     }
>
>   // ...
>   adjust_insn (bb, insn);
>
>   if (!frame_pointer_needed && pre)
>     VTI (bb)->out.stack_adjust += pre;
>
> Both if statements depend on global variable frame_pointer_needed.  In 
> function
> insn_stack_adjust_offset_pre_post local variable pre is initialized.  The
> problematic part is the function call between both if statements.  Since
> adjust_insn also calls functions which are defined in a different compilation
> unit, we are not able to prove that global variable frame_pointer_needed is 
> not
> altered by adjust_insn and its siblings.  Thus we must assume that
> frame_pointer_needed may be true before the call and false afterwards which
> renders the warning true (admitted the location hint is not totally perfect).
> By initialising pre we silence the warning.
>
> Bootstrapped and regtested on S/390. Ok for master?

I think even better would be to move the pre declaration inside

          FOR_BB_INSNS_SAFE (bb, insn, next)
            {
              if (INSN_P (insn))
                {

initialized with zero and then elide the !frame_pointer_needed part
of

                  if (!frame_pointer_needed && pre)

can you check that works?  OK if it does.

Btw, does s390 have different inlining parameters somehow?

Richard.

> gcc/ChangeLog:
>
> 2020-04-28  Stefan Schulze Frielinghaus  <stefa...@linux.ibm.com>
>
>         * var-tracking.c (vt_initialize): Initialize local variable pre.
> ---
>  gcc/var-tracking.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> index 0d39326aa63..f693a4f83fe 100644
> --- a/gcc/var-tracking.c
> +++ b/gcc/var-tracking.c
> @@ -10171,7 +10171,7 @@ vt_initialize (void)
>    FOR_EACH_BB_FN (bb, cfun)
>      {
>        rtx_insn *insn;
> -      HOST_WIDE_INT pre, post = 0;
> +      HOST_WIDE_INT pre = 0, post = 0;
>        basic_block first_bb, last_bb;
>
>        if (MAY_HAVE_DEBUG_BIND_INSNS)
> --
> 2.25.3
>

Reply via email to