wi::max_value() of a boolean is not 1

Richard Sandiford richard.sandiford@linaro.org
Tue Aug 22 04:37:00 GMT 2017

Richard Biener <richard.guenther@gmail.com> writes:
> On August 21, 2017 5:43:08 PM GMT+02:00, Aldy Hernandez
> <aldyh@redhat.com> 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 ;-).
> Richard?

Think it should be "<" rather than "<=".  LGTM with that change, thanks.


>>On Sun, Aug 20, 2017 at 6:40 AM, Richard Biener
>><richard.guenther@gmail.com> wrote:
>>> On August 20, 2017 10:46:54 AM GMT+02:00, Aldy Hernandez
>><aldyh@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
>>>>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?

More information about the Gcc mailing list