[clang] [llvm] [Clang] Add __builtin_assume_dereferenceable to encode deref assumption. (PR #121789)

Erich Keane via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 6 08:18:39 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.
+        z = *x;
+        }
+      return z;
+  }
+
+**Description**:
+
+The arguments to this function provide a start pointer ``P`` and a size ``S``.
+``P`` must be non-null and ``S`` at least 1. The optimizer may assume that
----------------
erichkeane wrote:

Does the 'must be non-null' create an optimization opportunity here too?  I guess that is kind of what 'dereferenceable' means, but should we better point out that:
```
int foo(int * x) {
  __builtin_assume_dereferenceable(x, 1);

  if (x) {
     return 1;
  }
  return 0;
}
```

Can be optimized to just: `return 1`?

https://github.com/llvm/llvm-project/pull/121789


More information about the llvm-commits mailing list