you are about an hour behind in reading your email. I had just
committed a patch that is very close to this.
On 08/27/2013 02:31 PM, Richard Sandiford wrote:
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