https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88427
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- We have: (gdb) p debug (lhs_vr) int [s4_11(D), s4_11(D) + 2]$3 = void (gdb) p debug (vr_result) int [s4_11(D), s4_11(D) + 32767]$4 = void (gdb) p cmp_min $5 = 0 (gdb) p cmp_max $6 = -1 and the /* If the new minimum is larger than the previous one retain the old value. If the new minimum value is smaller than the previous one and not -INF go all the way to -INF + 1. In the first case, to avoid infinite bouncing between different minimums, and in the other case to avoid iterating millions of times to reach -INF. Going to -INF + 1 also lets the following iteration compute whether there will be any overflow, at the expense of one additional iteration. */ code isn't prepared for cmp_min > 0 or cmp_max < 0 to have vr_result->min () or vr_result->max () of the form [-]sym + cst.