ABS_EXPR anti range handling in extract_range_from_unary_expr() useless?
Aldy Hernandez
aldyh@redhat.com
Thu Jun 7 08:21:00 GMT 2018
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?
> /* 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