[PATCH] D141187: [SystemZ] Set setMaxAtomicSizeInBitsSupported

Ulrich Weigand via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 15 08:43:35 PST 2023


uweigand added a comment.

In D141187#4054105 <https://reviews.llvm.org/D141187#4054105>, @jonpa wrote:

> LegalizeTypes expands the i128 result of e.g. an AtomicLoadAdd node, which is done by DAGTypeLegalizer::ExpandAtomic(), which results in a library call. There are no tests for the atomic operations with i128, but it should work due to the TypeLegalizer. i128 is not a legal type so I guess therefore they are all expanded this way.
>
> I could imagine that it might be beneficial to use the AtomicExpandPass to use the target instructions whenever possible, and libcalls otherwise. However, I am unsure about this: The AtomicExpandPass seems to do this (emit the libcalls only if needed, after checking alignment as well), but I see this in the Atomics document:
>
> //"One very important property of the atomic operations is that if your backend supports any inline lock-free atomic operations of a given size, you should support ALL operations of that size in a lock-free manner...it is invalid to implement atomic load using the native instruction, but cmpxchg using a library call to a function that uses a mutex, atomic load must also expand to a library call on such architectures, so that it can remain atomic with regards to a simultaneous cmpxchg, by using the same mutex."//
>
> I guess I must be missing something somehow...

Note that this is handled by the particular implementation of the 16-byte atomic library routines on s390x:  they all perform a *runtime* check for proper alignment, and if the address actually *is* 16-byte aligned, the library routine will in fact use the appropriate 16-byte atomic instructions to implement the operation (instead of a separate mutex).  That is why it *is* safe for the compiler to emit those instructions itself *if* it can prove at compile-time that the address will in fact be properly aligned at run-time.  (That's also done by GCC, for example.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141187/new/

https://reviews.llvm.org/D141187



More information about the llvm-commits mailing list