forked from OSchip/llvm-project
[LangRef] Mention that freeze does not consider aggregate's paddings
Make explicit that freeze does not touch paddings of an aggregate. (Relevant comment: https://reviews.llvm.org/D83752#2152550) This implies that `v = freeze(load p); store v, q` may still leave undef bits or poison in memory if `v` is an aggregate, but it still happens for non-byte integers such as i1. Differential Revision: https://reviews.llvm.org/D83927
This commit is contained in:
parent
3a18665748
commit
fd1f8072a8
|
@ -3523,6 +3523,9 @@ uses with" concept would not hold.
|
|||
To ensure all uses of a given register observe the same value (even if
|
||||
'``undef``'), the :ref:`freeze instruction <i_freeze>` can be used.
|
||||
A value is frozen if its uses see the same value.
|
||||
An aggregate value or vector is frozen if its elements are frozen.
|
||||
The padding of an aggregate isn't considered, since it isn't visible
|
||||
without storing it into memory and loading it with a different type.
|
||||
|
||||
.. code-block:: llvm
|
||||
|
||||
|
@ -10682,6 +10685,9 @@ instructions may yield different values.
|
|||
While ``undef`` and ``poison`` pointers can be frozen, the result is a
|
||||
non-dereferenceable pointer. See the
|
||||
:ref:`Pointer Aliasing Rules <pointeraliasing>` section for more information.
|
||||
If an aggregate value or vector is frozen, the operand is frozen element-wise.
|
||||
The padding of an aggregate isn't considered, since it isn't visible
|
||||
without storing it into memory and loading it with a different type.
|
||||
|
||||
|
||||
Example:
|
||||
|
|
Loading…
Reference in New Issue