================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits