https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65765
--- Comment #3 from Markus Trippelsdorf <trippels at gcc dot gnu.org> --- markus@x4 tc % cat main.ii int a, b, c, d, e; unsigned char h[] = { 1, 1 }; __attribute__ ((cold)) int ModRM_Mode () { return a; } int ModRM_RM (int p1) { return p1; } __attribute__ ((cold)) static bool ModRM_hasSIB (unsigned char p1) { return ModRM_Mode () != 1 && ModRM_RM (p1); } __attribute__ ((cold)) static bool ModRM_hasRIP (unsigned char p1) { return ModRM_Mode () && ModRM_RM (p1); } unsigned char * DisassembleHeapAccess (unsigned char *p1) { b = *p1++; if (ModRM_hasSIB (b)) c = *p1++; int f = c, g = 0; d = ModRM_hasRIP (g); e = f == 0; if (e) p1 += sizeof 0; return p1; } int main () { DisassembleHeapAccess (h) == h + 2 ? static_cast<void> (0) : __builtin_abort (); } markus@x4 tc % g++ -O2 main.ii && ./a.out [1] 19854 abort ./a.out markus@x4 tc % g++ -O2 -fno-ipa-icf main.ii && ./a.out markus@x4 tc %