On Sat, Aug 24, 2024 at 6:19 PM Georg-Johann Lay wrote:
>
> Trying to use the value-range interface and functions I am running
> into that ICE when using invert().
>
> From what the sources suggest, invert() computes the complement of
> the current set (the union of finitely many intervals).
>
> For example, when I have a range of [-128, -1] for int8_t, invert()
> runs into that ICE because that interval is undefined or varying.
>
> Take for example, this code that wants to take the complement of
> the complete interval (with respect to the complete interval given
> by uint8_t):
>
>tree t = unsigned_intQI_type_node;
>int n_bits = TYPE_PRECISION (t);
>
>int_range<2, false /*resizable*/ > j(t);
>
>// j is undefined(?), thus set its bounds to the entire range.
>j.set (t, wi::to_wide (j.lbound()), wi::to_wide (j.ubound()));
>j.invert();
> : internal compiler error: in invert, at value-range.cc:2165
> 0
>
> This should just return the empty set; no? And vice versa, the
> complement of the empty set (with respect to the whole interval)
> should be the whole interval provided by t, no?
>
> If I understand correctly, the int_range<> implementation does not
> implement a semi-group, and there are sets / intervals that are not
> allowed, like the empty set or intervals that touch a boundary.
>
> Does this mean that I have to test and special-case all these cases
> and do them by hand? Are there more invalid / disallowed intervals?
A lot of functions do not allow undefined_p () ranges, but it's odd
that invert doesn't handle varying_p (). But yes, the range API
(unfortunately) requires you to check for certain exceptional cases
beforehand even though they are not really exceptional for
range arithmetic in general.
> So I guess it is simpler when I write my own interval arithmetic
> that handles these cases and behaves like a semi group. As there
> will be at most 3 sub-intervals, that's the way to go...?
>
> Isn't there a knob to tell that complement is with respect to the
> range as provided by type(), and not w.r.t. the integers?
Andrew would have to answer that but I think that's how ranges
behave. They just have those API requirements that are
sometimes annoying.
Richard.
>
> Johann