[libcxx-commits] [libcxx] 6be9888 - Speed up std::visit() compile times by another 42% (#213203)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Aug 2 10:09:24 PDT 2026


Author: higher-performance
Date: 2026-08-02T13:09:19-04:00
New Revision: 6be9888a7bb5995169e31ab03939f1ac03059b7a

URL: https://github.com/llvm/llvm-project/commit/6be9888a7bb5995169e31ab03939f1ac03059b7a
DIFF: https://github.com/llvm/llvm-project/commit/6be9888a7bb5995169e31ab03939f1ac03059b7a.diff

LOG: Speed up std::visit() compile times by another 42% (#213203)

This avoids defining an `enum`, which appears to be expensive for Clang.

Added: 
    

Modified: 
    libcxx/include/variant

Removed: 
    


################################################################################
diff  --git a/libcxx/include/variant b/libcxx/include/variant
index 93fd43b6ae808..2fc67420ff6fa 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -1613,21 +1613,21 @@ _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&
             std::forward<_Visitor>(__visitor), __variant::__get_alt<_I>(std::forward<_Vs>(__vs)...).__value);          \
       }                                                                                                                \
       [[__fallthrough__]]
-    switch ((..., __vs.__variant_type::index())) {
-      // Use __LINE__ to avoid hardcoding numbers that might become stale
-      enum : size_t { _I0 = __LINE__ + 1 };           // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      static_assert(__LINE__ - _I0 == _LIBCPP_VARIANT_DISPATCH_COUNT, "index count mismatch");
+    // Use __LINE__ to avoid hardcoding numbers that might become stale
+    constexpr size_t __i0 = __LINE__ + 2;              // New line required
+    switch ((..., __vs.__variant_type::index())) {     // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      static_assert(__LINE__ - __i0 == _LIBCPP_VARIANT_DISPATCH_COUNT, "index count mismatch");
     default:
       std::__throw_bad_variant_access("std::visit: variant is valueless");
     }
@@ -1664,21 +1664,21 @@ _LIBCPP_HIDE_FROM_ABI constexpr _Rp visit(_Visitor&& __visitor, _Vs&&... __vs) {
           }                                                                                                            \
         }                                                                                                              \
         [[__fallthrough__]]
-    switch ((..., __vs.__variant_type::index())) {
-      // Use __LINE__ to avoid hardcoding numbers that might become stale
-      enum : size_t { _I0 = __LINE__ + 1 };           // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - _I0); // New line required
-      static_assert(__LINE__ - _I0 == _LIBCPP_VARIANT_DISPATCH_COUNT, "index count mismatch");
+    // Use __LINE__ to avoid hardcoding numbers that might become stale
+    constexpr size_t __i0 = __LINE__ + 2;              // New line required
+    switch ((..., __vs.__variant_type::index())) {     // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      _LIBCPP_VARIANT_DISPATCH_INDEX(__LINE__ - __i0); // New line required
+      static_assert(__LINE__ - __i0 == _LIBCPP_VARIANT_DISPATCH_COUNT, "index count mismatch");
     default:
       std::__throw_bad_variant_access("std::visit: variant is valueless");
     }


        


More information about the libcxx-commits mailing list