[backport gcc-4.8/trunk r193591, also fixes PR55883 ] gcc/ 2012-11-17 Jakub Jelinek PR tree-optimization/55236 * fold-const.c (make_range_step) : For -fwrapv and signed ARG0_TYPE, force low and high to be non-NULL. gcc/testsuite/ 2012-11-17 Jakub Jelinek PR tree-optimization/55236 * gcc.dg/pr55236.c: New test. --- gcc-4.7.2/gcc/fold-const.c.~1~ 2012-06-01 19:03:19.000000000 +0200 +++ gcc-4.7.2/gcc/fold-const.c 2013-01-05 20:43:46.000000000 +0100 @@ -3904,6 +3904,17 @@ make_range_step (location_t loc, enum tr return arg0; case NEGATE_EXPR: + /* If flag_wrapv and ARG0_TYPE is signed, make sure + low and high are non-NULL, then normalize will DTRT. */ + if (!TYPE_UNSIGNED (arg0_type) + && !TYPE_OVERFLOW_UNDEFINED (arg0_type)) + { + if (low == NULL_TREE) + low = TYPE_MIN_VALUE (arg0_type); + if (high == NULL_TREE) + high = TYPE_MAX_VALUE (arg0_type); + } + /* (-x) IN [a,b] -> x in [-b, -a] */ n_low = range_binop (MINUS_EXPR, exp_type, build_int_cst (exp_type, 0), --- gcc-4.7.2/gcc/testsuite/gcc.dg/pr55236.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.7.2/gcc/testsuite/gcc.dg/pr55236.c 2013-01-05 20:43:46.000000000 +0100 @@ -0,0 +1,31 @@ +/* PR tree-optimization/55236 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fwrapv" } */ + +extern void abort (); + +__attribute__((noinline, noclone)) void +foo (int i) +{ + if (i > 0) + abort (); + i = -i; + if (i < 0) + return; + abort (); +} + +__attribute__((noinline, noclone)) void +bar (int i) +{ + if (i > 0 || (-i) >= 0) + abort (); +} + +int +main () +{ + foo (-__INT_MAX__ - 1); + bar (-__INT_MAX__ - 1); + return 0; +}