https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106892
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I would clean it even more: int a, b, c, d, e; int f[8]; int g() { while (a) a >>= 4; return 0; } int h(int i) { if (i >= '0') return i - '0'; //__builtin_unreachable (); } void j(int i) { for (b = 2; g() <= 7; b++) if (i) { for (; e <= 7; e++) for (c = 1; c <= 7; c++) { d = h(b + '0'); f[-d + 4] ^= 3; } return; } } int main() { j(1); if (f[2] != 0) __builtin_abort (); } so that a) it isn't ASCII specific and misbehaves for EBCDIC etc., and b) undoes what creduce/cvise likes to do, moving expressions from for init expression before the loop