https://gcc.gnu.org/bugzilla/show_bug.cgi?id=76957
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amker at gcc dot gnu.org --- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Testcase for the niter analysis issue: #define NMAX 3000 static double a[NMAX][NMAX], b[NMAX][NMAX], c[NMAX][NMAX]; void dsyr2k(int N) { int i,j,k; if (N > 0) { i = 0; do { j = 0; do { k = j; do { c[j][k] += a[i][j] * b[i][k] + b[i][j] * a[i][k]; k++; } while (k < N); j++; } while (j<N); i++; } while (i < N); } } for the innermost (k) loop we get Analyzing # of iterations of loop 3 exit condition [j_11 + 1, + , 1](no_overflow) < N_17(D) bounds on difference of bases: -2999 ... 2147483646 result: zero if j_11 >= N_17(D) # of iterations ((unsigned int) N_17(D) - (unsigned int) j_11) - 1, bounded by 2147483646 as it fails to simplify this zero-if condition. If it would look at the evolution of j_11 (the IV PHI of the j loop) which is {0, +, 1}_2 it would see together with Analyzing # of iterations of loop 2 exit condition [1, + , 1](no_overflow) < N_17(D) bounds on difference of bases: 0 ... 2147483646 result: # of iterations (unsigned int) N_17(D) + 4294967295, bounded by 2147483646 and thus 1 * (N_17 - 1) >= N_17 is always false. From the gcc.dg/graphite/scop-dsyr2k.c we now arrive at the above IL via improved jump threading, optimizing out redundant loop header checks (but as shown above IVO cannot recover).