#include /* $ gcc -O0 a.c -o a-O0 && ./a-O0 > o0 $ gcc -O1 a.c -o a-O1 && ./a-O1 > o1 $ diff -U0 o0 o1 -off>>: 7fffffff +off>>: ffffffff */ typedef unsigned int u32; u32 bug (u32 * result) __attribute__((noinline)); u32 bug (u32 * result) { // non-static and non-volatile to inhibit constant propagation volatile u32 ss = 0xFFFFffff; volatile u32 d = 0xEEEEeeee; u32 tt = d & 0x00800000; u32 r = tt << 8; // rotate r = (r >> 31) | (r << 1); u32 u = r^ss; u32 off = u >> 1; // seemingly unrelated but bug-triggering side-effect *result = tt; return off; } int main() { u32 l; u32 off = bug(&l); printf ("off>>: %08x\n", off); return 0; }