diff options
| author | Philip Reames <listmail@philipreames.com> | 2016-02-19 00:06:41 +0000 |
|---|---|---|
| committer | Philip Reames <listmail@philipreames.com> | 2016-02-19 00:06:41 +0000 |
| commit | 1960cfd32306d2d36b5a26c737575e11043569bb (patch) | |
| tree | 4f33eb9b089ebed9d49d1f944d5c6c68f6b5317a /llvm/docs/LangRef.rst | |
| parent | 878ae0188919c0499ce2623cf50d8a0edc61d558 (diff) | |
| download | bcm5719-llvm-1960cfd32306d2d36b5a26c737575e11043569bb.tar.gz bcm5719-llvm-1960cfd32306d2d36b5a26c737575e11043569bb.zip | |
[IR] Extend cmpxchg to allow pointer type operands
Today, we do not allow cmpxchg operations with pointer arguments. We require the frontend to insert ptrtoint casts and do the cmpxchg in integers. While correct, this is problematic from a couple of perspectives:
1) It makes the IR harder to analyse (for instance, it make capture tracking overly conservative)
2) It pushes work onto the frontend authors for no real gain
This patch implements the simplest form of IR support. As we did with floating point loads and stores, we teach AtomicExpand to convert back to the old representation. This prevents us needing to change all backends in a single lock step change. Over time, we can migrate each backend to natively selecting the pointer type. In the meantime, we get the advantages of a cleaner IR representation without waiting for the backend changes.
Differential Revision: http://reviews.llvm.org/D17413
llvm-svn: 261281
Diffstat (limited to 'llvm/docs/LangRef.rst')
| -rw-r--r-- | llvm/docs/LangRef.rst | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index d93ae17434a..f86ca405f47 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -7082,13 +7082,13 @@ Arguments: There are three arguments to the '``cmpxchg``' instruction: an address to operate on, a value to compare to the value currently be at that address, and a new value to place at that address if the compared values -are equal. The type of '<cmp>' must be an integer type whose bit width -is a power of two greater than or equal to eight and less than or equal -to a target-specific size limit. '<cmp>' and '<new>' must have the same -type, and the type of '<pointer>' must be a pointer to that type. If the -``cmpxchg`` is marked as ``volatile``, then the optimizer is not allowed -to modify the number or order of execution of this ``cmpxchg`` with -other :ref:`volatile operations <volatile>`. +are equal. The type of '<cmp>' must be an integer or pointer type whose +bit width is a power of two greater than or equal to eight and less +than or equal to a target-specific size limit. '<cmp>' and '<new>' must +have the same type, and the type of '<pointer>' must be a pointer to +that type. If the ``cmpxchg`` is marked as ``volatile``, then the +optimizer is not allowed to modify the number or order of execution of +this ``cmpxchg`` with other :ref:`volatile operations <volatile>`. The success and failure :ref:`ordering <ordering>` arguments specify how this ``cmpxchg`` synchronizes with other atomic operations. Both ordering parameters |

