http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54767
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-01-15 10:47:36 UTC --- Yeah, indeed. The bug seems to be in the second vrp pass on xxx function. iaii_23: [_79, _79] EQUIVALENCES: { } (0 elements) looks wrong (iaii_23 is only conditionally equal to _79 (in the first iteration that sets iaii, i.e. ia = 2, second iteration), it can be the value from previous cycle too (in the ia = 3, third iteration). This then leads to _35 = prephitmp_50 - iaii_23; being _35: [0, 0] (again, wrong) and that is why we end up with 1 instead of 2 in the second row. There is: Visiting PHI node: iaii_23 = PHI <iaii_1(11), prephitmp_50(10)> Argument #0 (11 -> 12 not executable) Argument #1 (10 -> 12 executable) prephitmp_50 Value: [_79, _79] EQUIVALENCES: { _79 } (1 elements) Found new range for iaii_23: [_79, _79] which is wrong, but not sure if this is the first spot in the dump. iaii_1 here is only conditionally UNDEFINED, it might be iaii value from previous iteration too.