I believe this is to pair with `__SHARED_READ_FENCE` and `__SHARED_READ_SEQ` respectively. I don't know how valid it is to merge both.
From [LLVM Atomic Instructions and Concurrency Guide][llvm-atomics]:
A `fence` provides Acquire and/or Release ordering which is not part of another operation; it is normally used along with Monotonic memory operations. A Monotonic load followed by an Acquire fence is roughly equivalent to an Acquire load, and a Monotonic store following a Release fence is roughly equivalent to a Release store. SequentiallyConsistent fences behave as both an Acquire and a Release fence, and offer some additional complicated guarantees, see the C++11 standard for details.
Since we intend the fence to impose ordering constraints only between the shared read/write section and the atomic operation on the sequence variable, it is safe to coalesce the atomic operation and the fence.
[llvm-atomics]: https://www.llvm.org/docs/Atomics.html