This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: ABS_EXPR anti range handling in extract_range_from_unary_expr() useless?
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Aldy Hernandez <aldyh at redhat dot com>
- Cc: GCC Development <gcc at gcc dot gnu dot org>, Andrew MacLeod <amacleod at redhat dot com>
- Date: Thu, 7 Jun 2018 11:31:10 +0200
- Subject: Re: ABS_EXPR anti range handling in extract_range_from_unary_expr() useless?
- References: <5f1013e0-1a13-d22a-5514-94d6d6142871@redhat.com>
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