[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:
Juneyoung Lee 2020-07-17 11:53:26 +09:00
parent 3a18665748
commit fd1f8072a8
1 changed files with 6 additions and 0 deletions

View File

@ -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: