http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55555
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-12-07 09:44:40 UTC --- I've tried to rewrite this as C, but managed to turn it into something that is miscompiled at a different spot. The fortran testcase starts having __builtin_unreachable () in it in the *.cunroll pass, this one already in *.cunrolli pass. Still, I believe it doesn't do any out of bounds access anywhere. -O2 on x86_64-linux. double s[4] = { 1.0, 2.0, 3.0, 4.0 }, pol_x[2] = { 5.0, 6.0 }; __attribute__((noinline)) int foo (void) { double coef_x[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int lxp = 0; if (lxp <= 1) do { double t = pol_x[lxp]; long S; long l = lxp * 4L - 1; for (S = 1; S <= 4; S++) coef_x[S + l] = coef_x[S + l] + s[S - 1] * t; } while (lxp++ != 1); asm volatile ("" : : "r" (coef_x) : "memory"); for (lxp = 0; lxp < 8; lxp++) if (coef_x[lxp] != ((lxp & 3) + 1) * (5.0 + (lxp >= 4))) __builtin_abort (); return 1; } int main () { asm volatile ("" : : : "memory"); if (!foo ()) __builtin_abort (); return 0; } Works with r193067, fails with r193100, haven't tried to bisect exactly, but would guess this is r193098 again. For the outer loop it prints: Analyzing # of iterations of loop 1 exit condition [0, + , 1](no_overflow) != 1 bounds on difference of bases: 1 ... 1 result: # of iterations 1, bounded by 1 Loop 1 iterates 1 times. Loop 1 iterates at most 1 times. but that is wrong, the outer loop iterates exactly 2 times. <bb 3>: # lxp_1 = PHI <0(2), lxp_21(15)> ... <bb 6>: lxp_21 = lxp_1 + 1; if (lxp_1 != 1) goto <bb 15>; else goto <bb 7>; <bb 15>: goto <bb 3>; If it used lxp_21 in the condition, that would be correct, but it uses the previous value of the IV.