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