https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114923
--- Comment #3 from nfxjfg at googlemail dot com --- I'm expecting gcc to realize that the pointer escaped into the unknown, and that it can't assume that the memory won't change. This is just causality, not any vague made up viralyness. Anyway, a 'asm volatile("":::"memory")' is too radical and increased code size too much in my case (but it's a good suggestion). Making the buffer volatile will inhibit optimizations before or after the DMA.