On Fri, Jan 20, 2023 at 07:00:18PM +0100, Jakub Jelinek via Gcc-patches wrote: > Though, I wonder if we shouldn't for GCC 13 just sorry_at about > steps other than constant 1/-1 (in both outer loop with var-outer referenced > in inner loop and on inner loop that references it) and for the !VAR_P case > actually handle it if step 1/-1 by using simple like translation just with > an artificial iterator.
As for the steps other than constant 1/-1, we have 5 cases: do i = x, y, 25 or do i = 12, 72, z or do i = x, y, -42 or do i = 42, -10, z or do i = x, y, z The 1st and 3rd are with constant step, 2nd and 4th with constant lower and upper bounds and the last one has step and at least one of the bounds non-constant. I wonder if in the light of e.g. PR108431 which says that do i = -huge(i), huge(i) is invalid (well, that one would be very wrong even from OpenMP POV because computing number of iterations definitely overflows) and the fact that we handle step 1 and -1 the simple way do do i = huge(i) - 10, huge(i) will not work either, I wonder if even do i = huge(i) - 5, huge(i) - 1, 2 is undefined (similar reasoning, if i after loop needs to be set to the huge(i) + 1 it is signed integer overflow). If yes, then perhaps at least the first 4 cases could be easily handled (perhaps for GCC 13 just if clauses->non_rectangular only) as for (i = x; i <= y; i += 25) or for (i = 12; i <= 72; i += z) or for (i = x; i >= y; i -= 42) or for (i = 42; i >= -10; i += z) If those give equivalent behavior, then that would mean a sorry only for the last case - the problem is that we then don't know at compile time the direction. Though perhaps even for that case we could play tricks, handle do i = x, y, z as if (z > 0) a = x, b = y, c = z; else a = INT_MIN, b = too_lazy_to_compute_that_now, c = -z; for (counter = a; counter <= b; counter += c) { if (z > 0) i = counter; else i = counter - (unsigned) INT_MAX; } If that works, we'd need to figure also out how to handle that in the non-rect cases. But the m1 * var-outer + a1 and m2 * var-outer + a2 factors can be non-constant invariants, so again we could compute something for them depending on if the outer or inner step was positive or negative. Jakub