[libcxx-commits] [libcxx] [libc++] Add assumption for align of begin and end pointers of vector. (PR #108961)

via libcxx-commits libcxx-commits at lists.llvm.org
Tue Sep 17 04:14:44 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Florian Hahn (fhahn)

<details>
<summary>Changes</summary>

Missing information about begin and end pointers of std::vector can lead to missed optimizations in LLVM.

See https://github.com/llvm/llvm-project/issues/101372 for a discussion of missed range check optimizations in hardened mode.

Once https://github.com/llvm/llvm-project/pull/108958 lands, the created `llvm.assume` calls for the alignment should be folded into the `load` instructions, resulting in no extra instructions after InstCombine.

---
Full diff: https://github.com/llvm/llvm-project/pull/108961.diff


1 Files Affected:

- (modified) libcxx/include/vector (+8-4) 


``````````diff
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 7d3aac5989a48c..720b46d573c954 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -1027,6 +1027,10 @@ private:
   }
 
   _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector&, false_type) _NOEXCEPT {}
+
+  _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer __add_alignment_assumption(pointer __p) _NOEXCEPT {
+    return static_cast<pointer>(__builtin_assume_aligned(__p, alignof(decltype(*__p))));
+  }
 };
 
 #if _LIBCPP_STD_VER >= 17
@@ -1418,25 +1422,25 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::assign(size_type __n
 template <class _Tp, class _Allocator>
 _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator
 vector<_Tp, _Allocator>::begin() _NOEXCEPT {
-  return __make_iter(this->__begin_);
+  return __make_iter(__add_alignment_assumption(this->__begin_));
 }
 
 template <class _Tp, class _Allocator>
 _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::const_iterator
 vector<_Tp, _Allocator>::begin() const _NOEXCEPT {
-  return __make_iter(this->__begin_);
+  return __make_iter(__add_alignment_assumption(this->__begin_));
 }
 
 template <class _Tp, class _Allocator>
 _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator
 vector<_Tp, _Allocator>::end() _NOEXCEPT {
-  return __make_iter(this->__end_);
+  return __make_iter(__add_alignment_assumption(this->__end_));
 }
 
 template <class _Tp, class _Allocator>
 _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::const_iterator
 vector<_Tp, _Allocator>::end() const _NOEXCEPT {
-  return __make_iter(this->__end_);
+  return __make_iter(__add_alignment_assumption(this->__end_));
 }
 
 template <class _Tp, class _Allocator>

``````````

</details>


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


More information about the libcxx-commits mailing list