diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2017-06-06 08:28:17 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2017-06-06 08:28:17 +0000 |
commit | bac91bf18cabe70b62f098e7bee0bac0701eb0df (patch) | |
tree | a8adfc7de80f008d4583a0ff5654a45b44d53488 /docs | |
parent | de22782d75fa3536bda6962766e668c9a758cfe3 (diff) |
[docs] Make it clear shifts yield poison when shift amount >= bitwidth
Some InstCombine optimizations already rely on the result being poison
rather than undef.
For example, the following rewrite is wrong if undef is used:
; (1 << Y) * X -> X << Y
%Op0 = shl 1, %Y
%r = mul %Op0, %Op1
=>
%r = shl %Op1, %Y
ERROR: Mismatch in values for i4 %r
Example:
i4 %Y = 0x8 (8, -8)
i4 %Op0 = 0x0 (0)
i4 %Op1 = 0x0 (0)
source: 0x0 (0)
target: 0x1 (1)
The optimization is correct if poison is returned instead:
http://rise4fun.com/Alive/ygX
Differential Revision: https://reviews.llvm.org/D33654
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304780 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs')
-rw-r--r-- | docs/LangRef.rst | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/docs/LangRef.rst b/docs/LangRef.rst index 2e339183ef11..e063f6bd35fe 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -6691,15 +6691,14 @@ Semantics: The value produced is ``op1`` \* 2\ :sup:`op2` mod 2\ :sup:`n`, where ``n`` is the width of the result. If ``op2`` is (statically or dynamically) equal to or larger than the number of bits in -``op1``, the result is undefined. If the arguments are vectors, each -vector element of ``op1`` is shifted by the corresponding shift amount -in ``op2``. +``op1``, this instruction returns a :ref:`poison value <poisonvalues>`. +If the arguments are vectors, each vector element of ``op1`` is shifted +by the corresponding shift amount in ``op2``. -If the ``nuw`` keyword is present, then the shift produces a :ref:`poison -value <poisonvalues>` if it shifts out any non-zero bits. If the -``nsw`` keyword is present, then the shift produces a :ref:`poison -value <poisonvalues>` if it shifts out any bits that disagree with the -resultant sign bit. +If the ``nuw`` keyword is present, then the shift produces a poison +value if it shifts out any non-zero bits. +If the ``nsw`` keyword is present, then the shift produces a poison +value it shifts out any bits that disagree with the resultant sign bit. Example: """""""" @@ -6742,13 +6741,12 @@ Semantics: This instruction always performs a logical shift right operation. The most significant bits of the result will be filled with zero bits after the shift. If ``op2`` is (statically or dynamically) equal to or larger -than the number of bits in ``op1``, the result is undefined. If the -arguments are vectors, each vector element of ``op1`` is shifted by the -corresponding shift amount in ``op2``. +than the number of bits in ``op1``, this instruction returns a :ref:`poison +value <poisonvalues>`. If the arguments are vectors, each vector element +of ``op1`` is shifted by the corresponding shift amount in ``op2``. If the ``exact`` keyword is present, the result value of the ``lshr`` is -a :ref:`poison value <poisonvalues>` if any of the bits shifted out are -non-zero. +a poison value if any of the bits shifted out are non-zero. Example: """""""" @@ -6793,13 +6791,12 @@ Semantics: This instruction always performs an arithmetic shift right operation, The most significant bits of the result will be filled with the sign bit of ``op1``. If ``op2`` is (statically or dynamically) equal to or larger -than the number of bits in ``op1``, the result is undefined. If the -arguments are vectors, each vector element of ``op1`` is shifted by the -corresponding shift amount in ``op2``. +than the number of bits in ``op1``, this instruction returns a :ref:`poison +value <poisonvalues>`. If the arguments are vectors, each vector element +of ``op1`` is shifted by the corresponding shift amount in ``op2``. If the ``exact`` keyword is present, the result value of the ``ashr`` is -a :ref:`poison value <poisonvalues>` if any of the bits shifted out are -non-zero. +a poison value if any of the bits shifted out are non-zero. Example: """""""" |