I think volatile variables are a good example of how we really don't want to rely on platform semantics most the time. We use volatile variables to tell the compiler "hey, the platform actually cares about these writes, so do them the way I wrote them."* But this is relatively rare! The vast majority of the time, we want the compiler to go nuts with constant propagation and reordering and all the other good stuff. A language where volatile was the default and "go nuts" was an explicit keyword would be really annoying to use.
* There are more things in heaven and earth (MMIO!) than are dreamt of in your memory model.
* There are more things in heaven and earth (MMIO!) than are dreamt of in your memory model.