https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119351
--- Comment #9 from Tamar Christina <tnfchris at gcc dot gnu.org> --- --- static bool next_ci(int dimYY, int numCells, int nth, int ci_block, int* ci_x, int* ci_y, int* ci_b, int* ci) { while (*ci >= *ci_x * dimYY + *ci_y + 1) { *ci_y += 1; if (*ci_y == dimYY) { *ci_x += 1; *ci_y = 0; } } return 1; } void foo (int th, int ci_block, int dimYY, int numCells, int nth) { int ci_b = -1; int ci = th * ci_block - 1; int ci_x = 0; int ci_y = 0; while (next_ci(dimYY, numCells, nth, ci_block, &ci_x, &ci_y, &ci_b, &ci)) { asm volatile (""); } } --- This reproduces the loop, but I don't see anything wrong here... https://godbolt.org/z/x9aqn4Y1W I'll next try to see if I can make it fail with a runtime test. But the codegen looks fine.. the missing LCSSI is fine as it's an induction that needs to be recomputed anyway.. For a marked target, reaching the end of the main loop means: # _73 = PHI <_9(5)> _52 = niters.4_38; _54 = (int) _52; tmp.5_53 = ci_y_16 + _54; if (niters.4_38 == _52) goto <bb 6>; [25.00%] else goto <bb 16>; [75.00%] seems correct..