https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117875
--- Comment #9 from Jan Hubicka <hubicka at ucw dot cz> --- > > But maybe I'm missing something? > > I guess the issue is that with > > # k_24 = PHI <1(13), k_29(16)> > > to easily see this we'd have to compute the range of > (unsigned int) M_9(D) - 1 and the range of (unsigned int) M_9(D) - (unsigned) > k_29 and then see those are the same singleton. I don't think we can > arrive here when using the range of k_24 itself, so maybe I'm asking too > much of VRP here. Yes, I don't see how ranger can figure out easily the singleton range, since final value of the iteration is variable. Last year I looked into it and I kind of remember implementing special matching code, but can not find the patch anymore. The code checking loop1->any_estimate can be generalized to check for estimate of one of the loop and adjust the other accordingly. It is scev_cprop pass that does replace the use of IV value use out of loops by its bound. As in: #include <stdio.h> int test(int n) { int i; if (n < 0) return -1; for (i = 0; i < n; i++) printf ("%i\n",i); return i; } Maybe we want to be able to run it on a specific loop and run it on loop1 between split finishes updating IL and before profile update?