On Mon, Sep 5, 2022 at 1:45 PM Aldy Hernandez <[email protected]> wrote:
>
> On Mon, Sep 5, 2022 at 12:38 PM Richard Biener
> <[email protected]> wrote:
> >
> > On Mon, Sep 5, 2022 at 12:24 PM Aldy Hernandez <[email protected]> wrote:
> > >
> > > On Mon, Sep 5, 2022 at 11:53 AM Richard Biener
> > > <[email protected]> wrote:
> > > >
> > > > On Mon, Sep 5, 2022 at 11:41 AM Aldy Hernandez <[email protected]> wrote:
> > > > >
> > > > > On Mon, Sep 5, 2022 at 11:18 AM Richard Biener
> > > > > <[email protected]> wrote:
> > > > > >
> > > > > > On Mon, Sep 5, 2022 at 11:12 AM Aldy Hernandez <[email protected]>
> > > > > > wrote:
> > > > > > >
> > > > > > > On Mon, Sep 5, 2022 at 11:06 AM Jakub Jelinek <[email protected]>
> > > > > > > wrote:
> > > > > > > >
> > > > > > > > On Mon, Sep 05, 2022 at 11:00:54AM +0200, Richard Biener wrote:
> > > > > > > > > On Mon, Sep 5, 2022 at 8:24 AM Aldy Hernandez via Gcc-patches
> > > > > > > > > <[email protected]> wrote:
> > > > > > > > > >
> > > > > > > > > > Intersecting two ranges where one is a NAN is keeping the
> > > > > > > > > > sign bit of
> > > > > > > > > > the NAN range. This is not correct as the sign bits may
> > > > > > > > > > not match.
> > > > > > > > > >
> > > > > > > > > > I think the only time we're absolutely sure about the
> > > > > > > > > > intersection of
> > > > > > > > > > a NAN and something else, is when both are a NAN with
> > > > > > > > > > exactly the same
> > > > > > > > > > properties (sign bit). If we're intersecting two NANs of
> > > > > > > > > > differing
> > > > > > > > > > sign, we can decide later whether that's undefined or just
> > > > > > > > > > a NAN with
> > > > > > > > > > no known sign. For now I've done the latter.
> > > > > > > > > >
> > > > > > > > > > I'm still mentally working on intersections involving NANs,
> > > > > > > > > > especially
> > > > > > > > > > if we want to keep track of signbits. For now, let's be
> > > > > > > > > > extra careful
> > > > > > > > > > and only do things we're absolutely sure about.
> > > > > > > > > >
> > > > > > > > > > Later we may want to fold the intersect of [NAN,NAN] and
> > > > > > > > > > say [3,5]
> > > > > > > > > > with the posibility of NAN, to a NAN, but I'm not 100% sure.
> > > > > > > > >
> > > > > > > > > The intersection of [NAN, NAN] and [3, 5] is empty. The
> > > > > > > > > intersection
> > > > > > > > > of [NAN, NAN] and VARYING is [NAN, NAN].
> > > > > > > >
> > > > > > > > I think [3.0, 5.0] printed that way currently means U maybe NAN,
> > > > > > > > it would be [3.0, 5.0] !NAN if it was known not to be NAN.
> > > > > > >
> > > > > > > Right. I don't print any of the "maybe" properties, just if
> > > > > > > they're
> > > > > > > definitely set or definitely clear. I'm open to suggestions as
> > > > > > > to how
> > > > > > > to display them. Perhaps NAN, !NAN, ?NAN.
> > > > > >
> > > > > > There's no NAN tristate. Your "definitely NAN" would be simply
> > > > > > ][ NAN, that is, the value range only contains NAN. Your !NAN
> > > > > > is <whatever range> and non NAN. Likewise for the sign, the
> > > > > > range either includes -NAN and NAN or one or none of those.
> > > > > > For signed zeros you either have [-0, upper-bound] or [0,
> > > > > > upper-bound]
> > > > > > where it either includes both -0 and 0 or just one of them
> > > > >
> > > > > But there is a tristate. We may definitely have a NAN, definitely not
> > > > > have a NAN, or the state of the NAN is unknown.
> > > >
> > > > Sure. But we are talking about sets of values a variable can have
> > > > (a value "range" where "range" is a bit misleading for something
> > > > like a NAN). The set of possible values either includes
> > > > NAN (or -NAN and +NAN) or it doesn't include NAN (or -NAN and +NAN).
> > > > A set cannot include or not include a "maybe NAN".
> > > >
> > > > > Say [3,5] ?NAN.
> > > > > That's [3,5] with the possibility of a NAN. On the true side of x >=
> > > > > 5.0, we'd have [5.0, INF] !NAN. On the false side we'd have [-INF,
> > > > > 5.0] ?NAN.
> > > >
> > > > On the true side of x >= 5.0 the set of values is described by
> > > > the [5., +INF] range. On the false side the set is described
> > > > by the union of the range [-INF, 5.0] and the { -NAN, +NAN }
> > > > set.
> > > >
> > > > There's no may-NAN. There's also no ?4.0, the range either
> > > > includes 4.0 or it doesn't.
> > >
> > > Ah, ok. I see where the confusion lies. You're missing that we don't
> > > have sub-ranges like we do for irange. We only have two endpoints and
> > > a set of flags. So we can't represent [3,4] U NAN "elegantly".
> > > However, we can do it with [3,4] ?NAN. This is by design, but not
> > > permanent. I don't have infinite time to work on frange on this cycle
> > > (I have other things like wide-ints conversion, prange, removal of
> > > legacy, etc etc), so I wanted something that worked with endpoints,
> > > signs, and NANs, that's about it. If at a later time we decide to go
> > > full throttle with the ability to represent sub-ranges, we can do so.
> > > Heck, you're welcome to try-- just let me finish the initial
> > > implementation and get it working correctly first.
> > >
> > > It is more important right now to get the usage than the
> > > representation right. We could always add sub-ranges, or change the
> > > representation altogether. What is very important we agree on is the
> > > usage, so your suggestions about the FP classification functions below
> > > are golden. I'll look into that.
> > >
> > > Does that make sense?
> >
> > Not really. I didn't ask for sub-ranges for NAN, but even with a "flag"
> > it should still semantically be [3, 4] U NAN or [3, 4]. It's not necessary
> > but confusing to leave the notion of a SET here.
> >
> > > BTW, [NAN, NAN] is a special case. It doesn't behave like a
> > > singleton. Both endpoints must match. We assert this much. We don't
> > > propagate it. We can't do equality to it. The fact that it lives in
> > > the endpoints is just an implementation detail.
> >
> > And even here, having [NAN, NAN] but [3, 4] with maybe-NAN flag
> > is just inconsistent. Why's that necessary? Is there no "empty range"
> > (aka UNDEFINED) for frange?
>
> So what you're suggesting is replacing the tri-state NAN and SIGN bits
> with two separate NAN flags (+NAN and -NAN) and representing actual
> NANs in the undefined range?
Yeah. Note if you keep the SIGN bits the two-bit NAN state would still
drop to just one bit - NAN or not NAN. I'm mostly opposed to the idea
that we need a "maybe" in addition to NAN and not NAN.
> This is just a representation detail,
> and I have no problem with it, except that it'll take time to
> implement. Patches welcome though ;-).
It's also an API and debug (dumping) detail if that implementation detail
is exposed. I'm mostly concerned about that and what documentation
suggests.
> May I suggest we agree on how to access this information (API), and
> then we can change the implementation details later?
>
> For instance, what you suggest for isfinite, isinf, isnan, etc. What
> does isfinite return for [0,INF]? Will isfinite return whether the
isfinite does (see manual page):
isfinite(x) returns a nonzero value if
(fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)
so it returns false. (it's not isinfinite). isinf returns false as well here.
There's a reason I didn't suggest to implement fpclassify because
there's no "I don't know" result.
> range *includes* INF? So true? Similarly for [3,4] NAN (in your
> preference). Shall we return true of isnan?, or only for an actual
> NAN?
Only for an actual NAN. But yes, implementing these may result
in confusing if people use !isnan() because that wouldn't mean the
number is never a NAN.
So maybe instead have, similar to the poly-int stuff,
maybe_inf ();
known_inf ();
maybe_nan ();
known_nan ();
known_finite (); // maybe_finite () doesn't make much sense to me
> And yes, we do have an UNDEFINED, but we take UNDEFINED to mean the
> empty set across the board. We like checks for undefined to be
> fast...i.e. just checking the m_kind field, not having to worry about
> checking if some other flag is set. Also, there are still some silly
> passes making use of vrange::kind() which is deprecated, and if NAN
> was represented with the VR_UNDEFINED enum set to m_kind, it'll cause
> problems. But I'm sure you can come up with another way of
> representing NAN. I really don't have strong opinions about
> representation details.
Hmm, we have undefined_p () which frange could overload.
Btw, if you don't have subranges then how would you represent
{-Inf, +Inf}? Not that this is likely to occur in practice.
>
> Aldy
>
> Aldy
>