gcc/libstdc++-v3
Jonathan Wakely cfb582f627 libstdc++: Optimize std::visit for the common case [PR 78113]
GCC does not do a good job of optimizing the table of function pointers
used for variant visitation. This avoids using the table for the common
case of visiting a single variant with a small number of alternative
types. Instead we use:

  switch(v.index())
  {
  case 0: return visitor(get<0>(v));
  case 1: return visitor(get<1>(v));
  ...
  }

It's not quite that simple, because get<1>(v) is ill-formed if the
variant only has one alternative, and similarly for each get<N>.  We
need to ensure each case only applies the visitor if the index is in
range for the actual type we're dealing with, and tell the compiler that
the case is unreachable otherwise. We also need to invoke the visitor
via the __gen_vtable_impl::__visit_invoke function, to handle the raw
visitation cases used to implement std::variant assignments and
comparisons.

Because that gets quite verbose and repetitive, a macro is used to stamp
out the cases.

We also need to handle the valueless_by_exception case, but only for raw
visitation, because std::visit already checks for it before calling
__do_visit.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/78113
	* include/std/variant (__do_visit): Use a switch when we have a
	single variant with a small number of alternatives.
2021-10-01 20:34:48 +01:00
..
config aix: Protect AIX math.h overloads with new macro. 2021-07-22 11:30:34 -04:00
doc libstdc++: Update documentation that only refers to c++98 and c++11 2021-09-16 23:06:38 +01:00
include libstdc++: Optimize std::visit for the common case [PR 78113] 2021-10-01 20:34:48 +01:00
libsupc++ c++: implement C++17 hardware interference size 2021-09-13 12:28:06 -04:00
po Update copyright years. 2021-01-04 10:26:59 +01:00
python libstdc++: Fix vector<bool> printer tests to work in debug mode 2021-08-18 14:26:38 +01:00
scripts libstdc++: Allow lualatex to be used for Doxygen PDF 2021-05-17 12:13:41 +01:00
src libstdc++: Make std::system_category() recognize Windows error codes 2021-09-23 16:07:39 +01:00
testsuite libstdc++: Allow visiting inherited variants [PR 90943] 2021-10-01 20:34:48 +01:00
acinclude.m4 ctype support for libstdc++ on VxWorks 2021-05-04 21:49:43 -03:00
aclocal.m4
ChangeLog Daily bump. 2021-10-01 00:16:27 +00:00
ChangeLog-1998
ChangeLog-1999
ChangeLog-2000
ChangeLog-2001
ChangeLog-2002
ChangeLog-2003
ChangeLog-2004
ChangeLog-2005
ChangeLog-2006
ChangeLog-2007
ChangeLog-2008
ChangeLog-2009
ChangeLog-2010
ChangeLog-2011
ChangeLog-2012
ChangeLog-2013
ChangeLog-2014
ChangeLog-2015
ChangeLog-2016
ChangeLog-2017
ChangeLog-2018
ChangeLog-2019
ChangeLog-2020 libstdc++: Fix typo in ChangeLog-2020 2021-01-13 11:02:13 +00:00
config.h.in libstdc++: Use secure_getenv for filesystem::temp_directory_path() [PR65018] 2021-07-30 18:12:39 +01:00
configure libstdc++: Check for TLS support on mingw cross-compilers 2021-09-15 09:49:33 +01:00
configure.ac libstdc++: Fix broken autoconf check for O_NONBLOCK 2021-08-31 17:38:27 +01:00
configure.host Scope libstdc++ configuration for vxworks to all versions 2020-10-22 16:40:57 +00:00
crossconfig.m4 libstdc++: Check for TLS support on mingw cross-compilers 2021-09-15 09:49:33 +01:00
fragment.am libstdc++: Add C++ runtime support for new 128-bit long double format 2020-12-16 23:25:01 +00:00
linkage.m4
Makefile.am Update copyright years. 2021-01-04 10:26:59 +01:00
Makefile.in libstdc++: Add C++ runtime support for new 128-bit long double format 2020-12-16 23:25:01 +00:00
README

file: libstdc++-v3/README

New users may wish to point their web browsers to the file
index.html in the 'doc/html' subdirectory.  It contains brief
building instructions and notes on how to configure the library in
interesting ways.