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 ! )