The attached patch fixes the problem by sign extending before
constructing the wide int.  It does so while constructing the
hwi_with_prec object, since the  int_traits <wi::hwi_with_prec>
container has is_sign_extended=true, so I assume the underlying
hwi_with_prec must be stored with sign extension.

Is this what you had in mind, or would you prefer the sign extension
in the wi::int_traits <wi::hwi_with_prec> decompose routine?

Or somewhere else entirely ;-).

Thanks.
Aldy

On Sun, Aug 20, 2017 at 6:40 AM, Richard Biener
<richard.guent...@gmail.com> wrote:
> On August 20, 2017 10:46:54 AM GMT+02:00, Aldy Hernandez <al...@redhat.com> 
> wrote:
>>Hi folks.
>>
>>Calling wi::max_value() of a boolean_type creates a wide_int with all
>>bits set, not just the least significant bit.
>>
>>tree type = boolean_type_node;
>>wide_int x = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
>>(gdb) print x.dump()
>>[0xffffffffffffffff], precision = 1
>>
>>However, one can also create a boolean of true with:
>>
>>wide_int one = wi::uhwi (1, TYPE_PRECISION (boolean_type_node));
>>(gdb) print one.dump()
>>[0x1], precision = 1
>
> Looks like this one fails to be sign extended.
> Richard.
>
>>These will not be equal to each other because wi::eq_p() will only
>>strip
>>off excess bits when <is_sign_extended=false>.  However,
>>is_sign_extended=true for all wide_int's.
>>
>>Am I doing something wrong?
>>
>>Could I change wi::max_value() to strip off excess bits, instead of
>>setting all bits like it's currently doing:
>>
>>wide_int
>>wi::max_value (unsigned int precision, signop sgn)
>>{
>>   gcc_checking_assert (precision != 0);
>>   if (sgn == UNSIGNED)
>>     /* The unsigned max is just all ones.  */
>>     return shwi (-1, precision);
>>...
>>...
>>
>>Or perhaps change wi::eq_p() to strip off excess bits?
>>
>>Or am I missing something else entirely?
>>Aldy
>

Attachment: curr
Description: Binary data

Reply via email to