On Wed, 28 Aug 2013, Kenneth Zadeck wrote:

> On 08/28/2013 03:45 AM, Richard Biener wrote:
> > 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?
> no, because anything that comes in at precision 0 is a canonized sign extended
> number already.   the precision 0 just means that it is safe to be any
> precision.

Hmm, how can "any" precision be valid?  Only any precision that can
represent the value.  fits_uhwi_p asks whether truncation to
hwi precision is value-preserving.

> > ;)
> > 
> > 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)
> it is signed so i am matching this part.
> > || (len == 2 && val[1] == 0)
> so this does not work.   say i had a precision 70 bit wide-int. The bits above
> the precision are undefined, so i have to clear it out.   This is what the two
> lines at len 2 are for.   However if the precision is greater than 2 hwi's
> then we can do something this simple.

?  The bits in the encoding should not be undefined.  And why should
they be magically defined when the precision is greater than 2 hwi's then?

Richard.

Reply via email to