[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