https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83541
--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> --- Yes, it is a known issue, (E)VRP is too conservative. pushing new range for x_2(D): [2147483647, +INF] EQUIVALENCES: { x_2(D) } (1 elements) Visiting stmt _4 = x_2(D) + 1; Visiting statement: _4 = x_2(D) + 1; Match-and-simplified x_2(D) + 1 to -2147483648 Nope, there is an overflow, it should give __builtin_unreachable() instead of a constant value, or to be more conservative produce an empty range whose meet with [42, 42] would be just [42, 42].