diff options
author | Florian Hahn <flo@fhahn.com> | 2019-08-15 10:12:26 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2019-08-15 10:12:26 +0000 |
commit | de1d6c822079b3e7565bb3e48865318bee51761c (patch) | |
tree | 4f5ce2245bd1a4d0b2f0d29a3eafbf250168377f /llvm/docs/LangRef.rst | |
parent | 2601cdd3aed5d90b574e4a681462667b25577bcd (diff) | |
download | bcm5719-llvm-de1d6c822079b3e7565bb3e48865318bee51761c.tar.gz bcm5719-llvm-de1d6c822079b3e7565bb3e48865318bee51761c.zip |
Add ptrmask intrinsic
This patch adds a ptrmask intrinsic which allows masking out bits of a
pointer that must be zero when accessing it, because of ABI alignment
requirements or a restriction of the meaningful bits of a pointer
through the data layout.
This avoids doing a ptrtoint/inttoptr round trip in some cases (e.g. tagged
pointers) and allows us to not lose information about the underlying
object.
Reviewers: nlopes, efriedma, hfinkel, sanjoy, jdoerfert, aqjune
Reviewed by: sanjoy, jdoerfert
Differential Revision: https://reviews.llvm.org/D59065
llvm-svn: 368986
Diffstat (limited to 'llvm/docs/LangRef.rst')
-rw-r--r-- | llvm/docs/LangRef.rst | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 27df10c8b44..880259572aa 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -16895,6 +16895,42 @@ a constant. On the other hand, if constant folding is not run, it will never evaluate to true, even in simple cases. +.. _int_ptrmask: + +'``llvm.ptrmask``' Intrinsic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Syntax: +""""""" + +:: + + declare ptrty llvm.ptrmask(ptrty %ptr, intty %mask) readnone speculatable + +Arguments: +"""""""""" + +The first argument is a pointer. The second argument is an integer. + +Overview: +"""""""""" + +The ``llvm.ptrmask`` intrinsic masks out bits of the pointer according to a mask. +This allows stripping data from tagged pointers without converting them to an +integer (ptrtoint/inttoptr). As a consequence, we can preserve more information +to facilitate alias analysis and underlying-object detection. + +Semantics: +"""""""""" + +The result of ``ptrmask(ptr, mask)`` is equivalent to +``getelementptr ptr, (ptrtoint(ptr) & mask) - ptrtoint(ptr)``. Both the returned +pointer and the first argument are based on the same underlying object (for more +information on the *based on* terminology see +:ref:`the pointer aliasing rules <pointeraliasing>`). If the bitwidth of the +mask argument does not match the pointer size of the target, the mask is +zero-extended or truncated accordingly. + Stack Map Intrinsics -------------------- |