https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101031
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Simpler IL: int a; char b, e; static char *c = &b; static long d; void f(void); void __attribute__((noipa)) h() { int g = 0; for (; g < 2; ++g) { d = *c; *c = 1; b = 0; } f(); } void __attribute__((noipa)) f() { if (d++) c = &e; for (; a;) ; } int main() { h(); if (b != 0) __builtin_abort (); return 0; } we end up with void h () { char * c.0_14; char _24; long int _25; <bb 2> [local count: 357878152]: c.0_14 = c; *c.0_14 = 1; b = 0; _24 = *c.0_14; _25 = (long int) _24; d = _25; *c.0_14 = 1; f (); [tail call] return;