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 >
curr
Description: Binary data