diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -2428,9 +2428,6 @@ If there are no arguments the attribute is a property of the call location. -If the represented attribute expects a constant argument, the argument provided -to the operand bundle should be a constant as well. - For example: .. code-block:: llvm @@ -2450,6 +2447,20 @@ Just like for the argument of :ref:`llvm.assume `, if any of the provided guarantees are violated at runtime the behavior is undefined. +While attributes expect constant arguments, assume operand bundles may be +provided a dynamic value, for example: + +.. code-block:: llvm + + call void @llvm.assume(i1 true) ["align"(i32* %val, i32 %align)] + +If the operand bundle value violates any requirements on the attribute value, +the behavior is undefined, unless one of the following exceptions applies: + +* ``"assume"`` operand bundles may specify a non-power-of-two alignment + (including a zero alignment). If this is the case, then the pointer value + must be a null pointer, otherwise the behavior is undefined. + Even if the assumed property can be encoded as a boolean value, like ``nonnull``, using operand bundles to express the property can still have benefits: