On Thu, Jun 7, 2018 at 9:06 AM Aldy Hernandez <[email protected]> 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