This is the mail archive of the
mailing list for the GCC project.
Re: wi::max_value() of a boolean is not 1
On August 21, 2017 5:43:08 PM GMT+02:00, Aldy Hernandez <firstname.lastname@example.org> wrote:
>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 ;-).
>On Sun, Aug 20, 2017 at 6:40 AM, Richard Biener
>> On August 20, 2017 10:46:54 AM GMT+02:00, Aldy Hernandez
>>>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.
>>>These will not be equal to each other because wi::eq_p() will only
>>>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:
>>>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?