diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2011-08-12 03:38:32 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2011-08-12 03:38:32 +0000 |
commit | 79d7de7650f20bb95aa5a4799e89e06fde57f005 (patch) | |
tree | 2c9767e57218f9a6a20df8e3fff9d94f24455f34 /docs | |
parent | 1221139f1089c7f7afaf0aff1049625a8d31be9d (diff) | |
download | llvm-79d7de7650f20bb95aa5a4799e89e06fde57f005.tar.gz llvm-79d7de7650f20bb95aa5a4799e89e06fde57f005.tar.bz2 llvm-79d7de7650f20bb95aa5a4799e89e06fde57f005.tar.xz |
Misc atomic doc tweaks; reordering operations across Acquire/Release can be beneficial.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137425 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs')
-rw-r--r-- | docs/Atomics.html | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/docs/Atomics.html b/docs/Atomics.html index 95040fb4c3..e2effc6a6c 100644 --- a/docs/Atomics.html +++ b/docs/Atomics.html @@ -251,8 +251,10 @@ instructions has been clarified in the IR.</p> Acquire only provides a semantic guarantee when paired with a Release operation.</dd> <dt>Notes for optimizers</dt> - <dd>In general, optimizers should treat this like a nothrow call; the - the possible optimizations are usually not interesting.</dd> + <dd>Optimizers not aware of atomics can treat this like a nothrow call. + Tt is also possible to move stores from before an Acquire load + or read-modify-write operation to after it, and move non-Acquire + loads from before an Acquire operation to after it.</dd> <dt>Notes for code generation</dt> <dd>Architectures with weak memory ordering (essentially everything relevant today except x86 and SPARC) require some sort of fence to maintain @@ -284,11 +286,13 @@ instructions has been clarified in the IR.</p> Release only provides a semantic guarantee when paired with a Acquire operation.</dd> <dt>Notes for optimizers</dt> - <dd>In general, optimizers should treat this like a nothrow call; the - the possible optimizations are usually not interesting.</dd> + <dd>Optimizers not aware of atomics can treat this like a nothrow call. + It is also possible to move loads from after a Release store + or read-modify-write operation to before it, and move non-Release + stores from after an Release operation to before it.</dd> <dt>Notes for code generation</dt> <dd>See the section on Acquire; a fence before the relevant operation is - usually sufficient for Release. Note that a store-store fence is not + usually sufficient for Release. Note that a store-store fence is not sufficient to implement Release semantics; store-store fences are generally not exposed to IR because they are extremely difficult to use correctly.</dd> @@ -345,17 +349,18 @@ instructions has been clarified in the IR.</p> reason about for the programmer than other kinds of operations, and using them is generally a practical performance tradeoff.</dd> <dt>Notes for optimizers</dt> - <dd>In general, optimizers should treat this like a nothrow call. - However, optimizers may improve performance by reordering a - store followed by a load unless both operations are sequentially - consistent.</dd> + <dd>Optimizers not aware of atomics can treat this like a nothrow call. + For SequentiallyConsistent loads and stores, the same reorderings are + allowed as for Acquire loads and Release stores, except that + SequentiallyConsistent operations may not be reordered.</dd> <dt>Notes for code generation</dt> <dd>SequentiallyConsistent loads minimally require the same barriers - as Acquire operations and SequeuentiallyConsistent stores require - Release barriers. Additionally, the code generator must enforce - ordering between SequeuentiallyConsistent stores followed by - SequeuentiallyConsistent loads. On common architectures, this - requires emitting a full fence after SequeuentiallyConsistent stores.</dd> + as Acquire operations and SequeuentiallyConsistent stores require + Release barriers. Additionally, the code generator must enforce + ordering between SequeuentiallyConsistent stores followed by + SequeuentiallyConsistent loads. This is usually done by emitting + either a full fence before the loads or a full fence after the + stores; which is preferred varies by architecture.</dd> </dl> </div> |