I am testing the following. Bootstrap / regtest running on x86_64-unknown-linux-gnu.
Richard. 2017-04-10 Richard Biener <rguent...@suse.de> PR middle-end/80362 * fold-const.c (fold_binary_loc): Look at unstripped ops when looking for NEGATE_EXPR in -A / -B to A / B folding. * gcc.dg/torture/pr80362.c: New testcase. Index: gcc/fold-const.c =================================================================== *** gcc/fold-const.c (revision 246797) --- gcc/fold-const.c (working copy) *************** fold_binary_loc (location_t loc, *** 10205,10211 **** /* Convert -A / -B to A / B when the type is signed and overflow is undefined. */ if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) ! && TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (op1)) { if (INTEGRAL_TYPE_P (type)) --- 10205,10211 ---- /* Convert -A / -B to A / B when the type is signed and overflow is undefined. */ if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type)) ! && TREE_CODE (op0) == NEGATE_EXPR && negate_expr_p (op1)) { if (INTEGRAL_TYPE_P (type)) Index: gcc/testsuite/gcc.dg/torture/pr80362.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr80362.c (nonexistent) --- gcc/testsuite/gcc.dg/torture/pr80362.c (working copy) *************** *** 0 **** --- 1,10 ---- + /* { dg-do run } */ + /* { dg-additional-options "-fstrict-overflow" } */ + + int main() + { + signed char var_0, var_1 = -128; + var_0 = (signed char)(-var_1) / 3; + if (var_0 > 0) + __builtin_abort(); + }