On Wed, Jan 8, 2020 at 6:31 PM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Wed, Jan 8, 2020 at 6:01 AM bin.cheng <bin.ch...@linux.alibaba.com> wrote:
> >
> > Sorry, here is the patch.
> > ------------------------------------------------------------------
> > Sender:bin.cheng <bin.ch...@linux.alibaba.com>
> > Sent At:2020 Jan. 8 (Wed.) 12:58
> > Recipient:GCC Patches <gcc-patches@gcc.gnu.org>
> > Subject:[PATCH GCC11]Improve uninitialized warning with value range info
> >
> >
> > Hi,
> >
> > Function use_pred_not_overlap_with_undef_path_pred of 
> > pass_late_warn_uninitialized
> > checks if predicate of variable use overlaps with predicate of undefined 
> > control flow path.
> > For now, it only checks ssa_var comparing against constant, this can be 
> > improved where
> > ssa_var compares against another ssa_var with value range info, as 
> > described in comment:
> >
> > +         /* Check value range info of rhs, do following transforms:
> > +              flag_var < [min, max]  ->  flag_var < max
> > +              flag_var > [min, max]  ->  flag_var > min
> > +
> > +            We can also transform LE_EXPR/GE_EXPR to LT_EXPR/GT_EXPR:
> > +              flag_var <= [min, max] ->  flag_var < [min, max+1]
> > +              flag_var >= [min, max] ->  flag_var > [min-1, max]
> > +            if no overflow/wrap.  */
> >
> > This change can avoid some false warning.  Bootstrap and test on x86_64, 
> > any comment?
>
> Definitely a good idea - the refactoring makes the patch hard to
> follow though.  The
> original code seems to pick any (the "first") compare against a constant.  You
> return the "first" but maybe from range info that might also be
> [-INF,+INF].  It seems
> that we'd want to pick the best so eventually sort the predicate chain
> so that compares
> against constants come first at least?  Not sure if it really makes a
> difference but
I don't know either, but I simply tried to not break existing code int
the patch.
Function prune_uninit_phi_opnds is called for the first compares against
constant, actually it should be called for each comparison, but I guess it's
just avoiding O(M*N) complexity here.


> even currently we could have i < 5, i < 1 so the "better" one later?
> It might also make
> sense to simply push three predicates for i < j, namely i < j (if ever
> useful), i < min(j)
> and max(i) < j to avoid repeatedly doing the range computations.
IIUC, with current implementation, it's not useful to check value rang
info for both sides of comparison because prune_uninit_phi_opnds
requires the flag_var be defined by PHI node in the same basic block
as PHI parameter.

Thanks,
bin
>
> Thanks,
> Richard.
>
> > Thanks,
> > bin
> >
> > 2020-01-08  Bin Cheng  <bin.li...@linux.alibaba.com>
> >
> >  * tree-ssa-uninit.c (find_var_cmp_const): New function.
> >  (use_pred_not_overlap_with_undef_path_pred): Call above.

Reply via email to