public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Aldy Hernandez <aldyh@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: VRP: abstract out wide int CONVERT_EXPR_P code
Date: Tue, 04 Sep 2018 12:50:00 -0000	[thread overview]
Message-ID: <CAFiYyc0vVy_qqZxO8gXp-k4NK=0w=chi4NpyiWv9C-VT4C4aeQ@mail.gmail.com> (raw)
In-Reply-To: <30744ab3-510b-fc67-ad59-906fd54c50cf@redhat.com>

On Tue, Sep 4, 2018 at 2:41 PM Aldy Hernandez <aldyh@redhat.com> wrote:
>
>
>
> On 09/04/2018 07:58 AM, Richard Biener wrote:
> > On Mon, Sep 3, 2018 at 1:32 PM Aldy Hernandez <aldyh@redhat.com> wrote:
> >>
> >>
> >>
> >> On 08/28/2018 05:27 AM, Richard Biener wrote:
> >>> On Mon, Aug 27, 2018 at 2:24 PM Aldy Hernandez <aldyh@redhat.com> wrote:
> >>>>
> >>>> Howdy!
> >>>>
> >>>> Phew, I think this is the last abstraction.  This handles the unary
> >>>> CONVERT_EXPR_P code.
> >>>>
> >>>> It's the usual story-- normalize the symbolics to [-MIN,+MAX] and handle
> >>>> everything generically.
> >>>>
> >>>> Normalizing the symbolics brought about some nice surprises.  We now
> >>>> handle a few things we were punting on before, which I've documented in
> >>>> the patch, but can remove if so desired.  I wrote them mainly for myself:
> >>>>
> >>>> /* NOTES: Previously we were returning VARYING for all symbolics, but
> >>>>       we can do better by treating them as [-MIN, +MAX].  For
> >>>>       example, converting [SYM, SYM] from INT to LONG UNSIGNED,
> >>>>       we can return: ~[0x8000000, 0xffffffff7fffffff].
> >>>>
> >>>>       We were also failing to convert ~[0,0] from char* to unsigned,
> >>>>       instead choosing to return VR_VARYING.  Now we return ~[0,0].  */
> >>>>
> >>>> Tested on x86-64 by the usual bootstrap and regtest gymnastics,
> >>>> including --enable-languages=all, because my past sins are still
> >>>> haunting me.
> >>>>
> >>>> OK?
> >>>
> >>> The new wide_int_range_convert_tree looks odd given it returns
> >>> tree's.  I'd have expected an API that does the conversion resulting
> >>> in a wide_int range and the VRP code adapting to that by converting
> >>> the result to trees.
> >>
> >> Rewritten as suggested.
> >>
> >> A few notes.
> >>
> >> First.  I am not using widest_int as was done previously.  We were
> >> passing 0/false to the overflow args in force_fit_type so the call was
> >> just degrading into wide_int_to_tree() anyhow.  Am I missing some
> >> subtlety here, and must we use widest_int and then force_fit_type on the
> >> caller?
> >
> > The issue is that the wide-ints get "converted", so it's indeed subtle.
>
> This seems like it should be documented-- at the very least in
> wide_int_range_convert.

I don't think you need it there.

> What do you mean "converted"?  I'd like to understand this better before
> I write out the comment :).  Do we lose precision by keeping it in a
> wide_int as opposed to a widest_int?

As you're using wide_int::from that "changes" precision now.

> Also, can we have the caller to wide_int_range_convert() use
> wide_int_to_tree directly instead of passing through force_fit_type?

I think so.

> It
> seems force_fit_type with overflowable=0 and overflowed=false is just a
> call to wide_int_to_tree anyhow.
>
> >
> > +      || wi::rshift (wi::sub (vr0_max, vr0_min),
> > +                    wi::uhwi (outer_prec, inner_prec),
> > +                    inner_sign) == 0)
> >
> > this was previously allowed only for VR_RANGEs - now it's also for
> > VR_ANTI_RANGE.
> > That looks incorrect.  Testcase welcome ;)
>
> See change to extract_range_into_wide_ints.  VR_ANTI_RANGEs of constants
> will remain as is, whereas VR_ANTI_RANGEs of symbols will degrade into
> [-MIN,+MAX] and be handled generically.
>
> Also, see comment:
>
> +      /* We normalize everything to a VR_RANGE, but for constant
> +        anti-ranges we must handle them by leaving the final result
> +        as an anti range.  This allows us to convert things like
> +        ~[0,5] seamlessly.  */

Yes, but for truncation of ~[0, 5] from say int to short it's not correct
to make the result ~[0, 5], is it?  At least the original code dropped
that to VARYING.  For the same reason truncating [3, 765] from
short to unsigned char isn't [3, 253].  But maybe I'm missing something.

> >
> > +      return (!wi::eq_p (min, wi::min_value (outer_prec, outer_sign))
> > +             || !wi::eq_p (max, wi::max_value (outer_prec, outer_sign)));
> >
> > so you return false for VARYING?  Why?  I'd simply return true and
> > return VARYING in the new type in the path you return false.
>
> Since symbols and VR_VARYING and other things get turned into a
> [-MIN,+MAX] by extract_range_into_wide_ints, it's a lot easier to handle
> things generically and return varying when the range spans the entire
> domain.  It also keeps with the rest of the wide_int_range_* functions
> that return false when we know it's going to be VR_VARYING.

Ah, OK, didn't know they did that.  Not sure if that's convenient though
given VR_VARYING has no representation in the wide-int-range "range"
so callers chaining ops would need to do sth like

if (!wide_int_range_* (...., &out_min, &out_max))
  {
    out_min = wide_int::min (prec);
    out_max = wide_int::max (prec);
  }
if (!wide_int_range_* (out_min, out_max, ....))
...

to not lose cases where VARYING inputs produce non-VARYING results?

Richard.

> Aldy
>
> >
> > Richard.
> >
> >
> >
> >>
> >> Second.  I need extract_range_into_wide_ints to work with anti ranges of
> >> constants.  It seems like only the unary handling of CONVERT_EXPR here
> >> uses it that way, so I believe it should go into one patch.  If you
> >> believe strongly otherwise, I could split out the 4 lines into a
> >> separate patch, but I'd prefer not to.
> >>
> >> Finally, I could use vr0_min.get_precision() instead of inner_precision,
> >> but I think it's more regular and readable the way I have it.
> >>
> >> Tested on all languages on x86-64 Linux.
> >>
> >> OK for trunk?

  reply	other threads:[~2018-09-04 12:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-27 12:24 Aldy Hernandez
2018-08-28  9:27 ` Richard Biener
2018-08-28  9:31   ` Aldy Hernandez
2018-09-03 11:32   ` Aldy Hernandez
2018-09-04 11:58     ` Richard Biener
2018-09-04 12:41       ` Aldy Hernandez
2018-09-04 12:50         ` Richard Biener [this message]
2018-09-04 14:12           ` Aldy Hernandez
2018-09-04 14:21             ` Richard Biener
2018-09-04 14:25               ` Aldy Hernandez
2018-09-04 14:35               ` Aldy Hernandez
2018-09-05 12:58             ` Michael Matz
2018-09-05 14:01               ` Aldy Hernandez
2018-09-05 14:57                 ` Michael Matz
2018-09-05 18:00                   ` Aldy Hernandez
2018-08-29 14:13 ` Bernhard Reutner-Fischer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFiYyc0vVy_qqZxO8gXp-k4NK=0w=chi4NpyiWv9C-VT4C4aeQ@mail.gmail.com' \
    --to=richard.guenther@gmail.com \
    --cc=aldyh@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).