Index: docs/LangRef.rst =================================================================== --- docs/LangRef.rst +++ docs/LangRef.rst @@ -2225,6 +2225,10 @@ may not modify any other memory accessible by the module being compiled. A volatile operation may not call any code in the current module. +In general, the address space of a volatile operation may not be +changed. Different address spaces may have different trapping behavior +when dereferencing an invalid pointer. + The compiler may assume execution will continue after a volatile operation, so operations which modify memory or may have undefined behavior can be hoisted past a volatile operation. @@ -2708,10 +2712,18 @@ The pointer type is used to specify memory locations. Pointers are commonly used to reference objects in memory. -Pointer types may have an optional address space attribute defining the -numbered address space where the pointed-to object resides. The default -address space is number zero. The semantics of non-zero address spaces -are target-specific. +Pointer types may have an optional address space attribute defining +the numbered address space where the pointed-to object resides. The +default address space is number zero. The semantics of non-zero +address spaces are target-specific. Memory access through an invalid, +non-dereferenceable "null" pointer is undefined behavior in any address +space. Pointers with the bit-value 0 are only assumed to be +non-dereferenceable in address space 0. + +If an object can be proven accessible through a pointer with a +different address space, the access may be modified to use that +address space. Possible exceptions may apply if the operation is +``volatile``. Note that LLVM does not permit pointers to void (``void*``) nor does it permit pointers to labels (``label*``). Use ``i8*`` instead. @@ -9699,9 +9711,19 @@ ``ptrval`` to type ``pty2``. It can be a *no-op cast* or a complex value modification, depending on the target and the address space pair. Pointer conversions within the same address space must be -performed with the ``bitcast`` instruction. Note that if the address space -conversion is legal then both result and operand refer to the same memory -location. +performed with the ``bitcast`` instruction. Note that if the address +space conversion produces a dereferenceable result then both result and +operand refer to the same memory location. The conversion must have no +side effects, or capture the value of the pointer. + +If the source is :ref:`poison `, the result is +:ref:`poison `. + +If the source is not :ref:`poison `, and both source and +destination address spaces are :ref:`integral pointers +`, and the result pointer is dereferenceable, the cast is +assumed to be reversible (i.e. casting the result back to the original +address space should yield the original bit pattern). Example: """"""""