On Tue, 27 Aug 2013, Kenneth Zadeck wrote:

> removed all knowledge of SHIFT_COUNT_TRUNCATED from wide-int
> 
> both Richard Biener and Richard Sandiford had commented negatively about 
> this.
>
> fixed bug with wide-int::fits_uhwi_p.

 inline bool
 wide_int_ro::fits_uhwi_p () const
 {
-  return (len == 1 && val[0] >= 0) || (len == 2 && val[1] == 0);
+  return (precision <= HOST_BITS_PER_WIDE_INT)
+    || (len == 1 && val[0] >= 0) 
+    || (len == 2 && (precision >= 2 * HOST_BITS_PER_WIDE_INT) && (val[1] 
==
0))
+    || (len == 2 && (sext_hwi (val[1], precision & 
(HOST_BITS_PER_WIDE_INT
- 1)) == 0));
 }

it now get's scary ;)  Still wrong for precision == 0?

;)

I wonder what it's semantic is ... in double_int we simply require
high == 0 (thus, negative numbers are not allowed).  with
precision <= HOST_BITS_PER_WIDE_INT you allow negative numbers.

Matching what double-int fits_uhwi does would be

(len == 1 && ((signed HOST_WIDE_INT)val[0]) >= 0)
|| (len == 2 && val[1] == 0)

(I don't remember off-hand the signedness of val[], but eventually
you missed the conversion to signed)

Now, what double-int does is supposed to match
host_integerp (..., 1) which I think it does.

Richard.

Reply via email to