From 24dd04116db34e97271a520b6ab2397c67c627cb Mon Sep 17 00:00:00 2001 From: Juneyoung Lee Date: Wed, 26 Aug 2020 22:06:36 +0900 Subject: [PATCH] [LangRef] Memset/memcpy/memmove can take undef/poison pointer if the size is 0 According to the current LangRef, Memset/memcpy/memmove can take a null/dangling pointer if the size is zero. (Relevant thread: http://lists.llvm.org/pipermail/llvm-dev/2017-July/115665.html ) This patch expands it and allows the functions to take undef/poison pointers too. This required the updates in the align attribute since it isn't specified what is the alignment of undef/poison pointers. This patch states that their alignment is 1. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D86643 --- llvm/docs/LangRef.rst | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 8e3befad3d5a..1dfb19555380 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -1157,10 +1157,11 @@ Currently, only the following parameter attributes are defined: ``align `` or ``align()`` This indicates that the pointer value may be assumed by the optimizer to have the specified alignment. If the pointer value does not have the - specified alignment, behavior is undefined. + specified alignment, behavior is undefined. ``align 1`` has no effect on + non-byval, non-preallocated arguments. Note that this attribute has additional semantics when combined with the - ``byval`` attribute, which are documented there. + ``byval`` or ``preallocated`` attribute, which are documented there. .. _noalias: @@ -12478,8 +12479,8 @@ overlap. It copies "len" bytes of memory over. If the argument is known to be aligned to some boundary, this can be specified as an attribute on the argument. -If "len" is 0, the pointers may be NULL or dangling. However, they must still -be appropriately aligned. +If "len" is 0, the pointers may be NULL, dangling, ``undef``, or ``poison`` +pointers. However, they must still be appropriately aligned. .. _int_memcpy_inline: @@ -12535,8 +12536,8 @@ overlap. It copies "len" bytes of memory over. If the argument is known to be aligned to some boundary, this can be specified as an attribute on the argument. -If "len" is 0, the pointers may be NULL or dangling. However, they must still -be appropriately aligned. +If "len" is 0, the pointers may be NULL, dangling, ``undef``, or ``poison`` +pointers. However, they must still be appropriately aligned. The generated code is guaranteed not to call any external functions. @@ -12595,8 +12596,8 @@ copies "len" bytes of memory over. If the argument is known to be aligned to some boundary, this can be specified as an attribute on the argument. -If "len" is 0, the pointers may be NULL or dangling. However, they must still -be appropriately aligned. +If "len" is 0, the pointers may be NULL, dangling, ``undef``, or ``poison`` +pointers. However, they must still be appropriately aligned. .. _int_memset: @@ -12650,8 +12651,8 @@ at the destination location. If the argument is known to be aligned to some boundary, this can be specified as an attribute on the argument. -If "len" is 0, the pointers may be NULL or dangling. However, they must still -be appropriately aligned. +If "len" is 0, the pointer may be NULL, dangling, ``undef``, or ``poison`` +pointer. However, it must still be appropriately aligned. '``llvm.sqrt.*``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^