Kenneth Zadeck <zad...@naturalbridge.com> writes: > fixed fits_uhwi_p. > > tested on x86-64. > > kenny > > Index: gcc/wide-int.h > =================================================================== > --- gcc/wide-int.h (revision 201985) > +++ gcc/wide-int.h (working copy) > @@ -1650,7 +1650,7 @@ wide_int_ro::fits_shwi_p () const > inline bool > wide_int_ro::fits_uhwi_p () const > { > - return len == 1 || (len == 2 && val[1] == 0); > + return (len == 1 && val[0] >= 0) || (len == 2 && val[1] == 0); > }
With upper bits being undefined, it doesn't seem safe to check val[0] or val[1] like this. I was thinking along the lines of: inline bool wide_int_ro::fits_uhwi_p () const { if (precision <= HOST_BITS_PER_WIDE_INT) return true; if (len == 1) return val[0] >= 0; if (precision < HOST_BITS_PER_WIDE_INT * 2) return ((unsigned HOST_WIDE_INT) val[1] << (HOST_BITS_PER_WIDE_INT * 2 - precision)) == 0; return val[1] == 0; } Since we don't have a sign, everything HWI-sized or smaller fits in a uhwi without loss of precision. I've tested the above on x86_64-linux-gnu FWIW, in case it looks OK. Thanks, Richard