https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108984
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Isn't what happens in i386.cc more like: void foo (long); int data[128]; static int bar (int i, long j) { if (j >= -64 && j <= 64) return data[j+64]; foo (j); } int baz (unsigned int j) { int k = j / 8; return bar (0, -k); } ? Because we know in the caller it is [-0x1fffffff, 0] ...