On Aug 27, 2013, at 3:23 AM, Richard Biener <richard.guent...@gmail.com> wrote:
>> +++ b/gcc/fold-const.c
>> @@ -3702,12 +3702,23 @@ all_ones_mask_p (const_tree mask, int size)

> This should instead use
> 
>   return tree_to_double_int (mask) == double_int::mask (size)
>     || (TYPE_PRECISION (mask) == size && tree_to_double_int
> (mask).all_onesp ())
> 
> and avoid all the tree building.

Yeah, we tried that, but it didn't work out (regressions in the test suite).  
We did this instead:

  /* If this function returns true when the type of the mask is                 
                   
     UNSIGNED, then there will be errors.  In particular see                    
                   
     gcc.c-torture/execute/990326-1.c.  There does not appear to be             
                   
     any documentation paper trail as to why this is so.  But the pre           
                   
     wide-int worked with that restriction and it has been preserved            
                   
     here.  */
  if (size > precision || TYPE_SIGN (type) == UNSIGNED)
    return false;

in our code.  We don't want to introduce bugs into the compiler in the wide-int 
branch, so we opted to implement the original semantics and merely note the 
oddity.

The good news is our implementation is nice, short and sweet:

  return wide_int::mask (size, false, precision) == mask;

once one gets past this special case.

We'd love it if someone in the know can elaborate why unsigned needs to be 
false, or alternatively, fix the compiler on trunk so that we can return true 
with unsigned types.  We didn't spot the reason.

Reply via email to