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