On Sat, 20 Aug 2022, Andrew Pinski wrote:

> On Sat, Aug 20, 2022 at 3:34 PM Andreas Schwab <sch...@linux-m68k.org> wrote:
> >
> > This breaks bootstrap:
> >
> > ../../gcc/tree-vect-loop-manip.cc: In function 'void 
> > vect_gen_vector_loop_niters(loop_vec_info, tree, tree_node**, tree_node**, 
> > bool)':
> > ../../gcc/tree-vect-loop-manip.cc:1981:26: error: 'const_vf' may be used 
> > uninitialized [-Werror=maybe-uninitialized]
> >  1981 |   unsigned HOST_WIDE_INT const_vf;
> >       |                          ^~~~~~~~
> > cc1plus: all warnings being treated as errors
> > make[3]: *** [Makefile:1146: tree-vect-loop-manip.o] Error 1
> > make[2]: *** [Makefile:4977: all-stage2-gcc] Error 2
> > make[1]: *** [Makefile:30363: stage2-bubble] Error 2
> > make: *** [Makefile:1065: all] Error 2
> 
> 
> This looks like a real uninitialized variable issue.
> I even can't tell if the paths that lead to using const_vf will be
> always set so how we expect GCC to do the same.
> The code that uses const_vf was added with r11-5820-cdcbef3c3310,
> CCing the author there.

The key is

  tree log_vf = NULL_TREE;
...
  unsigned HOST_WIDE_INT const_vf;
  if (vf.is_constant (&const_vf)
      && !LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
    {
...
      log_vf = build_int_cst (type, exact_log2 (const_vf));
...
    }
...
      if (stmts != NULL && log_vf)
        {
... use const_vf ...

so it's uninit analysis little mind that is confused.  There is code
that's supposed to handle the situation (setting flag under condition,
testing that flag instead of condition) but maybe it's too twisted
here.  One could refector this as

 bool const_vf_p = vf.is_constant (&const_vf);
 if (const_vf_p
     && ...)
...
   if (stmts != NULL && const_vf_p)
...

and hope uninits mind is good enough to see log_vf is not used
uninitialized.

I can also look into why uninit doesn't get it, but preprocessed
source would be handy then.

Richard.

Reply via email to