ABS_EXPR anti range handling in extract_range_from_unary_expr() useless?

Richard Biener richard.guenther@gmail.com
Thu Jun 7 09:35:00 GMT 2018


On Thu, Jun 7, 2018 at 9:06 AM Aldy Hernandez <aldyh@redhat.com> wrote:
>
> Howdy.
>
> I'm looking at the ABS_EXPR code in extract_range_from_unary_expr() and
> have noticed that by the time we get here:
>
>        /* If a VR_ANTI_RANGEs contains zero, then we have
>          ~[-INF, min(MIN, MAX)].  */
>        if (vr0.type == VR_ANTI_RANGE)
>
> ...we have already handled VR_VARYING, VR_UNDEFINED, and symbolics.
> Which means, we only have VR_RANGE of constants to deal with.
> Furthermore, we have previously split a VR_ANTI_RANGE into its
> constituents and handled them piecemeal:
>
>    /* Now canonicalize anti-ranges to ranges when they are not symbolic
>       and express op ~[]  as (op []') U (op []'').  */
>    if (vr0.type == VR_ANTI_RANGE
>        && ranges_from_anti_range (&vr0, &vrtem0, &vrtem1))
>
> Am I missing something, or is this entire block dead code?

Looks like so.  Patch to remove it, replacing it with

gcc_assert (vr0.type != VR_ANTI_RANGE);

is pre-approved.

Richard.

> >       /* If a VR_ANTI_RANGEs contains zero, then we have
> >        ~[-INF, min(MIN, MAX)].  */
> >       if (vr0.type == VR_ANTI_RANGE)
> >       {
> >         if (range_includes_zero_p (vr0.min, vr0.max) == 1)
> >           {
> >             /* Take the lower of the two values.  */
> >             if (cmp != 1)
> >               max = min;
> >
> >             /* Create ~[-INF, min (abs(MIN), abs(MAX))]
> >                or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
> >                flag_wrapv is set and the original anti-range doesn't include
> >                TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
> >             if (TYPE_OVERFLOW_WRAPS (type))
> >               {
> >                 tree type_min_value = TYPE_MIN_VALUE (type);
> >
> >                 min = (vr0.min != type_min_value
> >                        ? int_const_binop (PLUS_EXPR, type_min_value,
> >                                           build_int_cst (TREE_TYPE (type_min_value), 1))
> >                        : type_min_value);
> >               }
> >             else
> >               min = TYPE_MIN_VALUE (type);
> >           }
> >         else
> >           {
> >             /* All else has failed, so create the range [0, INF], even for
> >                flag_wrapv since TYPE_MIN_VALUE is in the original
> >                anti-range.  */
> >             vr0.type = VR_RANGE;
> >             min = build_int_cst (type, 0);
> >             max = TYPE_MAX_VALUE (type);
> >           }
> >       }
>
> I tried putting a gcc_unreachable() there, and it never gets triggered
> in either a bootstrap or a full test run.  I also tried exercising
> programmatically extract_range_from_unary_expr() for the entire domain
> of a signed char and unsigned char, with and without flag_wrapv (ranges
> and anti-ranges), and I can't get the above code to trigger.
>
> Thanks.
> Aldy



More information about the Gcc mailing list