In the case of Rust, "volatile" means specifically the intrinsics:
https://doc.rust-lang.org/core/ptr/fn.read_volatile.html
https://doc.rust-lang.org/core/ptr/fn.write_volatile.html
They're specifically intended for MMIO. "Volatile operations are intended to act on I/O memory, and are guaranteed to not be elided or reordered by the compiler across other volatile operations."
Under the hood, this is issuing the raw load or store as you'd expect, and it shouldn't get touched by the compiler because the load/ store was literally the whole point of the intrinsic rather than a necessary consequence of some higher level language feature like an assignment operation.