On Mon, Sep 5, 2022 at 1:45 PM Aldy Hernandez <al...@redhat.com> wrote: > > On Mon, Sep 5, 2022 at 12:38 PM Richard Biener > <richard.guent...@gmail.com> wrote: > > > > On Mon, Sep 5, 2022 at 12:24 PM Aldy Hernandez <al...@redhat.com> wrote: > > > > > > On Mon, Sep 5, 2022 at 11:53 AM Richard Biener > > > <richard.guent...@gmail.com> wrote: > > > > > > > > On Mon, Sep 5, 2022 at 11:41 AM Aldy Hernandez <al...@redhat.com> wrote: > > > > > > > > > > On Mon, Sep 5, 2022 at 11:18 AM Richard Biener > > > > > <richard.guent...@gmail.com> wrote: > > > > > > > > > > > > On Mon, Sep 5, 2022 at 11:12 AM Aldy Hernandez <al...@redhat.com> > > > > > > wrote: > > > > > > > > > > > > > > On Mon, Sep 5, 2022 at 11:06 AM Jakub Jelinek <ja...@redhat.com> > > > > > > > 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 > > > > > > > > > <gcc-patches@gcc.gnu.org> 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 >