================ @@ -5442,6 +5442,155 @@ third argument, can only occur at file scope. a = b[i] * c[i] + e; } +Extensions for controlling atomic code generation +================================================= + +The ``[[clang::atomic]]`` statement attribute enables users to control how +atomic operations are lowered in LLVM IR by conveying additional metadata to +the backend. The primary goal is to allow users to specify certain options, +like whether atomic operations may be performed on specific types of memory or +whether to ignore denormal mode correctness in floating-point operations, +without affecting the correctness of code that does not rely on these behaviors. + +In LLVM, lowering of atomic operations (e.g., ``atomicrmw``) can differ based +on the target's capabilities. Some backends support native atomic instructions +only for certain operation types or alignments, or only in specific memory +regions. Likewise, floating-point atomic instructions may or may not respect +IEEE denormal requirements. When the user is unconcerned about denormal-mode +compliance (for performance reasons) or knows that certain atomic operations +will not be performed on a particular type of memory, extra hints are needed to +tell the backend how to proceed. + +A classic example is an architecture where floating-point atomic add does not +fully conform to IEEE denormal-mode handling. If the user does not mind ignoring +that aspect, they would prefer to still emit a faster hardware atomic instruction, +rather than a fallback or CAS loop. Conversely, on certain GPUs (e.g., AMDGPU), +memory accessed via PCIe may only support a subset of atomic operations. To ensure +correct and efficient lowering, the compiler must know whether the user wants to +allow atomic operations on that type of memory. + +The allowed atomic attribute values are now ``remote_memory``, ``fine_grained_memory``, +and ``ignore_denormal_mode``, each optionally prefixed with ``no_``. The meanings +are as follows: + +- ``remote_memory`` means atomic operations may be performed on remote memory. + Prefixing with ``no_`` (i.e. ``no_remote_memory``) indicates that atomic + operations should not be performed on remote memory. +- ``fine_grained_memory`` means atomic operations may be performed on fine-grained ---------------- yxsamliu wrote:
will do https://github.com/llvm/llvm-project/pull/114841 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits