https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67644
--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> --- It somehow makes sense ... x->ICR0.BIT.BIT5 |= 1; or maybe better x->ICR0.BIT.BIT5 ^= 1; is a bitfield read and a bitfield write. A bitfield write implies a bitfield read-modify-write, and thus we get two reads. It is sort of documented (at least the docs advice not to use volatile bitfields for hardware access etc). But it's still counter intuitive and a silly trap, because it looks very similar to normal volatile variables. Anyway, I guess this is an invalid PR...