[clang] [llvm] [Clang] Add __builtin_assume_dereferenceable to encode deref assumption. (PR #121789)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 9 14:20:52 PST 2025
================
@@ -2761,6 +2761,41 @@ etc.).
Query for this feature with ``__has_builtin(__builtin_assume_separate_storage)``.
+``__builtin_assume_dereferenceable``
+-------------------------------------
+
+``__builtin_assume_derefernceable`` is used to provide the optimizer with the
+knowledge that the pointer argument P is dereferenceable up to the specified
+number of bytes.
+
+**Syntax**:
+
+.. code-block:: c++
+
+ __builtin_assume_dereferenceable(const void *, size_t)
+
+**Example of Use**:
+
+.. code-block:: c++
+
+ int foo(int *x, int y) {
+ __builtin_assume_dereferenceable(x, 4);
+ int z = 0;
+ if (y == 1) {
+ // The optimizer may execute the load of x unconditionally.
----------------
fhahn wrote:
> A better description as to WHY it can do so unconditionally would be nice. I originally assumed it was making some sort of assumption about the value of 'y' and was unclear why that would be the case.
Added, hope it makes things clearer.
> x[3] is UB? I should hope not...
The attribute doesn't imply that anything beyond the specified size is not dereferenceable, I updated the docs to hopefully make this clearer, thanks
https://github.com/llvm/llvm-project/pull/121789
More information about the llvm-commits
mailing list