https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108199
--- Comment #3 from Andreas Krebbel <krebbel at gcc dot gnu.org> --- Moving the local definition of dst out of the function to global scope prevents the store from getting eliminated. union DST dst; As expected the store is still in the FRE dump: _1 = src_6(D)->a; dst.val = _1; <--- _2 = BIT_FIELD_REF <dst, 8, 0>; _3 = _2 & 64; if (_3 != 0) ... and the first by is accessed: bar: movq (%rdi), %rax movq %rax, dst(%rip) testb $64, %al jne .L11