<div dir="ltr">The <a href="https://llvm.org/docs/LangRef.html#volatile-memory-accesses" target="_blank">language reference</a> says that <span class="gmail-il">LLVM</span> optimizers must not change the number of volatile operations or change their order of execution relative to other volatile operations. However, it doesn't say that optimizers can't introduce non-volatile operations. Is there any way to write IR that would ensure the generated loads and stores exactly match the number and ordering of the loads and stores in the source IR? I've heard conflicting reports about this. I'm specifically interested in manipulating MMIO, where loads and stores may have side effects.<div><div><br></div><div>If it is in fact possible to prevent the insertion of loads/stores, does the presence of the "dereferenceable" attribute on pointers have any affect here? Will marking a pointer "dereferenceable" allow loads/stores to a volatile-only-accessed memory location that wouldn't be allowed otherwise?</div></div><div><br></div><div>Context: this discussion originated in <a href="https://github.com/rust-rfcs/unsafe-code-guidelines/issues/33" target="_blank">an issue on the Rust unsafe code guidelines issue tracker</a>.</div></div>