Volatile were buggy in old compiler: https://llvm.org/pubs/2008-10-EMSOFT-Volatiles.html [2008 paper]
Even if compilers are better now, if possible it is better to wrap any IO memory access into ioread/iowrite inline (no cost) functions. This can then be implemented in a way known to be safe for the compiler used. And that can be changed easily in case the architecture or the compiler changes ( yeah abstraction ! )
As linux does for example: https://www.kernel.org/doc/html/v4.15/driver-api/device-io.h...
I have, in various projects over the years, resorted to inline Asm when I couldn't coerce the compiler to do exactly what I wanted; including very rare compiler bugs.
> the compiler vendor took care of it promptly in a paid upgrade to proprietary compiler 5.next
Ouch (assuming that this required them to pay to get the bugfix.)
Searches for "volatile"...ahh, there it is.
Haha! It's ARM compiler 4!