  Crary and Sullivan's Relaxed Memory Calculus (RMC) proposed a new declarative
approach for writing low-level shared memory concurrent programs in the
presence of modern relaxed-memory multi-processor architectures and optimizing
compilers. In RMC, the programmer explicitly specifies constraints on the order
of execution of operations and on the visibility of memory writes. These
constraints are then enforced by the compiler, which has a wide degree of
latitude in how to accomplish its goals.
  We present rmc-compiler, a Clang and LLVM-based compiler for RMC-extended C
and C++. In addition to using barriers to enforce ordering, rmc-compiler can
take advantage of control and data dependencies, something that is beyond the
abilities of current C/C++ compilers. In rmc-compiler, RMC compilation is
modeled as an SMT problem with a cost term; the solution with the minimum cost
determines the compilation strategy. In testing on ARM and POWER devices, RMC
performs quite well, with modest performance improvements relative to C++11 on
most of our data structure benchmarks and (on some architectures) dramatic
improvements on a read-mostly list test that heavily benefits from use of data
dependencies for ordering.
