https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119428
--- Comment #2 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- Self-contained reproducer: // $ cat bug.c __attribute__((noipa, optimize(1))) void bug_o1(unsigned int nr, void * addr) { unsigned char *ADDR = (unsigned char *) addr; ADDR += nr >> 3; *ADDR &= (unsigned char) ~(1 << (nr & 0x07)); } __attribute__((noipa, optimize(2))) void bug_o2(unsigned int nr, void * addr) { unsigned char *ADDR = (unsigned char *) addr; ADDR += nr >> 3; *ADDR &= (unsigned char) ~(1 << (nr & 0x07)); } int main() { void * bmo1 = __builtin_malloc(1024); void * bmo2 = __builtin_malloc(1024); for (unsigned bno = 0; bno < 1024 * 8; ++bno) { __builtin_memset(bmo1, 0xff, 1024); __builtin_memset(bmo2, 0xff, 1024); bug_o1(bno, bmo1); bug_o2(bno, bmo2); if (__builtin_memcmp(bmo1, bmo2, 1024) != 0) __builtin_trap(); } } $ gcc bug.c -o bug -O0 && ./bug Illegal instruction (core dumped)