Program logics and semantics tell a pleasant story about sequential composition: when executing (S1;S2), we first execute S1 then S2. To improve performance, however, processors instructions out of order, compilers reorder programs even more dramatically. By design, single-threaded systems cannot observe these reorderings; multiple-threaded can, making the considerably less pleasant. A formal a...