https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90231
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Actually (int) ((ivtmp.11 - (unsigned long) dst_10) / 4), sorry. On 64-bit targets this will never be a problem, are you worried about 32-bit targets where int and pointers are the same width and for a loop with say up to INT_MAX iterations ivtmp.11 would wrap around? Then dst[i] would be invalid too. So as long as the IVs aren't added there out of the blue sky, with larger steps than what is really used, it shouldn't be an issue. Or can say a loop that does: unsigned int j = x; for (int i = 0; i < n; i++) { j += 32; use (i, j); } use j as unsigned int IV with step 32 replace the i int IV with step 1? If yes, then I'd understand that (int) ((j - x) / 32) might not be correct expression all the time, e.g. if j == x, then i might be 0, or 0x8000000 etc., but (int) ((j - x) / 32) will be 0.