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();
<built-in>: 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?

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?

Johann

Reply via email to