[llvm-dev] Permitted success/failure orderings for atomic compare_exchange

Oliver Giersch via llvm-dev llvm-dev at lists.llvm.org
Sat Apr 4 03:59:24 PDT 2020

A question has come up on how to interpret the wording of LLVM's
documentation regarding the possible memory ordering for success and
failure of atomic compare_exchange operations.

>From the LLVM reference:

"The success and failure ordering
<https://llvm.org/docs/LangRef.html#ordering> arguments specify how this
cmpxchg synchronizes with other atomic operations. Both ordering parameters
must be at least monotonic , the ordering constraint on failure must be no
stronger than that on success, and the failure ordering cannot be either
release or acq_rel ."

The way this operation is implemented in  the standard library of the Rust
programming language, the combination of release (success) and acquire
(failure) is not permitted and will fail at runtime, the prevailing opinion
being, that a failing CAS with release/acquire ordering is actually relaxed
on the store part and hence acquire ordering for the failure case would be

However, I don't believe that this a correct reading of the specification
and that neither acquire nor release should be considered stronger or
weaker than the other and that hence that combination should be permitted.

I had hoped to get get some clarification on this issue here.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200404/ea502b00/attachment.html>

More information about the llvm-dev mailing list