On Sat, 2 Nov 2013, Richard Sandiford wrote:

> Jakub Jelinek <ja...@redhat.com> writes:
> > On Sat, Nov 02, 2013 at 03:15:44PM +0000, Richard Sandiford wrote:
> >> What should integer_onep mean if we have a signed 1-bit bitfield in
> >> which the bit is set?  Seen as a 1-bit value it's "obviously" 1,
> >> but seen as a value extended to infinite precision it's -1.
> >> 
> >> Current mainline returns false while wide-int returns true.
> >
> > Then current mainline is correct.  signed 1-bit bitfield has values
> > 0 and -1, not 0 and 1.  And, signed 1-bit -1 should be just
> > integer_minus_onep and integer_all_onesp.
> 
> OK, thanks.  I should have realised this earlier, but we have:
> 
> /* Return 1 if EXPR is the integer constant one or the corresponding
>    complex constant.  */
> 
> int
> integer_onep (const_tree expr)
> ...
> /* Return 1 if EXPR is the integer constant minus one.  */
> 
> int
> integer_minus_onep (const_tree expr)
> 
> which makes them sound like a pair.  But integer_minus_onep returns
> true for any all-ones INTEGER_CST (regardless of sign):
> 
>   if (TREE_CODE (expr) == COMPLEX_CST)
>     return (integer_all_onesp (TREE_REALPART (expr))
>           && integer_zerop (TREE_IMAGPART (expr)));
>   else
>     return integer_all_onesp (expr);
> 
> So a nonzero 1-bit unsigned bitfield is both integer_onep and
> integer_minus_onep, but a 1-bit signed bitfield is only
> integer_minus_onep.  Should integer_minus_onep be changed so
> that it always returns false for unsigned types?

I think so (but it was only introduced very recently, exactly
because integer_minus_onep is not equal to integer_all_onesp
in all cases).

Richard.

Reply via email to