[libcxx-commits] [libcxx] Speed up compilation of common uses of std::visit() (PR #164196)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Jul 29 16:54:52 PDT 2026


================
@@ -1589,23 +1593,100 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __throw_if_valueless(_Vs&&... __vs) {
   }
 }
 
+#    define _LIBCPP_VARIANT_DISPATCH_COUNT 11 // Speed up compilation for the common cases
+
 template < class _Visitor, class... _Vs, typename>
 _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) {
-  using __variant_detail::__visitation::__variant;
-  std::__throw_if_valueless(std::forward<_Vs>(__vs)...);
-  // NOLINTNEXTLINE(bugprone-use-after-move) __throw_if_valueless doesn't actually forward the variants
-  return __variant::__visit_value(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs)...);
+  using __variant_type = decltype(std::__upcast_to_variant(std::declval<remove_reference_t<_Vs>*>()...));
+  constexpr size_t __variant_size =
+      conditional_t<is_void_v<__variant_type>,
+                    std::integral_constant<size_t, variant_npos>,
+                    variant_size<__variant_type>>::value;
+  if constexpr (__variant_size <= _LIBCPP_VARIANT_DISPATCH_COUNT) {
+    using __variant_detail::__access::__variant;
+#    define _LIBCPP_VARIANT_DISPATCH_INDEX(_I)                                                                         \
+    case _I:                                                                                                           \
+      if constexpr (_I < __variant_size) {                                                                             \
+        return std::__invoke(                                                                                          \
+            std::forward<_Visitor>(__visitor), __variant::__get_alt<_I>(std::forward<_Vs>(__vs)...).__value);          \
+      }                                                                                                                \
+      [[__fallthrough__]]
+    switch ((..., __vs.__variant_type::index())) {
+      enum : size_t { _I0 = __LINE__ + 1 };           // New line required
----------------
higher-performance wrote:

Done.

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


More information about the libcxx-commits mailing list