[clang] Add clang atomic control options and attribute (PR #114841)
Hubert Tong via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 24 09:50:53 PST 2025
================
@@ -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
+ memory. Prefixing with ``no_`` (i.e. ``no_fine_grained_memory``) indicates that
+ atomic operations should not be performed on fine-grained memory.
----------------
hubert-reinterpretcast wrote:
```suggestion
- ``fine_grained_memory`` means that fine-grained memory might be used with the
atomic operations in this statement. Prefixing with ``no_`` (i.e.,
``no_fine_grained_memory``) indicates that the atomic operations in
the statement may be assumed to not be performed on fine-grained memory.
```
https://github.com/llvm/llvm-project/pull/114841
More information about the cfe-commits
mailing list