On Thu, Aug 23, 2018 at 4:50 PM Aldy Hernandez <al...@redhat.com> wrote:
>
>
>
> On 08/23/2018 05:59 AM, Richard Biener wrote:
> > On Wed, Aug 22, 2018 at 11:31 AM Aldy Hernandez <al...@redhat.com> wrote:
> >>
> >>
> >>
> >> On 08/21/2018 05:46 AM, Richard Biener wrote:
> >>> On Wed, Aug 15, 2018 at 3:33 AM Aldy Hernandez <al...@redhat.com> wrote:
> >>
> >>>> Finally, my apologies for including a tiny change to the
> >>>> POINTER_PLUS_EXPR handling code as well.  It came about the same set of
> >>>> auditing tests.
> >>>
> >>> Bah, please split up things here ;)  I've done a related change there
> >>> yesterday...
> >>>
> >>>>
> >>>> It turns out we can handle POINTER_PLUS_EXPR(~[0,0], [X,Y]) without
> >>>> bailing as VR_VARYING in extract_range_from_binary_expr_1.  In doing so,
> >>>> I also noticed that ~[0,0] is not the only non-null.  We could also have
> >>>> ~[0,2] and still know that the pointer is not zero.  I have adjusted
> >>>> range_is_nonnull accordingly.
> >>>
> >>> But there are other consumers and it would have been better to
> >>> change range_includes_zero_p to do the natural thing (get a VR) and
> >>> then remove range_is_nonnull as redundant if possible.
> >>
> >> Indeed.  Cleaning up range_includes_zero_p makes VRP and friends a lot
> >> cleaner.  Thanks for the suggestion.
> >>
> >> I lazily avoided cleaning up the division code affected in this patch
> >> too much, since it's going to be superseded by my division changes in
> >> the other patch.
> >>
> >> OK pending tests?
> >
> > -/* Return 1 if [MIN, MAX] includes the value zero, 0 if it does not
> > -   include the value zero, -2 if we cannot tell.  */
> > +/* Return 1 if *VR includes the value zero, 0 if it does not include
> > +   the value zero, or -2 if we cannot tell.  */
> >
> >   int
> > -range_includes_zero_p (tree min, tree max)
> > +range_includes_zero_p (const value_range *vr)
> >   {
> > -  tree zero = build_int_cst (TREE_TYPE (min), 0);
> > -  return value_inside_range (zero, min, max);
> > +  if (vr->type == VR_UNDEFINED || vr->type == VR_VARYING)
> > +    return -2;
> > +
> > +  tree zero = build_int_cst (TREE_TYPE (vr->min), 0);
> > +  if (vr->type == VR_RANGE)
> > +    return value_inside_range (zero, vr->min, vr->max);
> > +  else
> > +    return !value_inside_range (zero, vr->min, vr->max);
> >   }
> >
> > please make it return a bool.  VR_VARYING means the range does
> > include zero.  For VR_UNDEFINED we could say it doesn't or we choose
> > to not possibly optimize and thus return true (just do that for now).
> > That's because VR_VARYING is [-INF, INF] and VR_UNDEFINED is
> > an empty range.
>
> Done.
>
> >
> > I suppose the -2 for we cannot tell was for the case of symbolic
> > ranges where again we can conservatively return true
> > (and your return !value_inside_range for VR_ANTI_RANGE botched
> > the tri-state return value anyways...).
>
> Bah!  I sure botched up the anti range return.  That was the last
> bootstrap failure I was investigating.  You'd be amazed how many things
> mysteriously fail when things like ~[SYMBOL, SYMBOL] are assumed to be
> non-zero.
>
> Thanks for spotting this.  Bootstrap is happy now :-P.
>
> >
> > So, can you please rework that?
>
> Sure can!

@@ -1407,7 +1407,10 @@ extract_range_from_binary_expr_1 (value_range *vr,
       && code != POINTER_PLUS_EXPR
       && (vr0.type == VR_VARYING
          || vr1.type == VR_VARYING
-         || vr0.type != vr1.type
+         || (vr0.type != vr1.type
+             /* We can handle POINTER_PLUS_EXPR(~[0,0], [x,y]) below,
+                even though we have differing range kinds.  */
+             && code != POINTER_PLUS_EXPR)
          || symbolic_range_p (&vr0)
          || symbolic_range_p (&vr1)))
     {

is redundant now (spot the code != POINTER_PLUS_EXPR check at the
beginning of context)

OK with this hunk removed.

Thanks,
Richard.

> Attached.
>

Reply via email to