On November 11, 2014 6:49:34 PM CET, Jakub Jelinek <ja...@redhat.com> wrote:
>On Tue, Nov 11, 2014 at 06:40:25PM +0100, Marek Polacek wrote:
>> --- gcc/fold-const.c
>> +++ gcc/fold-const.c
>> @@ -7862,9 +7862,15 @@ fold_unary_loc (location_t loc, enum tree_code
>code, tree type, tree op0)
>>        return fold_view_convert_expr (type, op0);
>>  
>>      case NEGATE_EXPR:
>> -      tem = fold_negate_expr (loc, arg0);
>> -      if (tem)
>> -    return fold_convert_loc (loc, type, tem);
>> +      if (TREE_CODE (arg0) == INTEGER_CST
>> +      || TREE_CODE (arg0) == REAL_CST
>> +      || TYPE_OVERFLOW_WRAPS (type)
>> +      || (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0)
>> +    {
>> +      tem = fold_negate_expr (loc, arg0);
>> +      if (tem)
>> +        return fold_convert_loc (loc, type, tem);
>> +    }
>
>a) if arg0 is INTEGER_CST, but e.g. INT_MIN, should we
>   really fold it for -fsanitize=signed-integer-overflow
>   (I'd say in that case we should fold only if it is not
>   the minimum value)

Right. I think you should fix VRP instead.

>b) if the argument is not INTEGRAL_TYPE_P (type), shouldn't
>   we fold no matter what flag_sanitize says?  Is the REAL_CST
>   case needed in that case?

Yes and no I guess.

Richard.

>       Jakub


Reply via email to