Find a file
Patrick Palka d3fd75d869 c++: Consider only relevant template arguments in sat_hasher
A large source of cache misses in satisfy_atom is caused by the identity
of an (atom,args) pair within the satisfaction cache being determined by
the entire set of supplied template arguments rather than by the subset
of template arguments that the atom actually depends on.  For instance,
consider

  template <class T> concept range = range_v<T>;
  template <class U> void foo () requires range<U>;
  template <class U, class V> void bar () requires range<U>;

The associated constraints of foo and bar are equivalent: they both
consist of the atom range_v<T> (with mapping T -> U).  But the sat_cache
currently will never reuse a satisfaction value between the two atoms
because foo has one template parameter and bar has two, and the
satisfaction cache conservatively assumes that all template parameters
of the constrained decl are relevant to a satisfaction value of one of
its atoms.

This patch eliminates this assumption and makes the sat_cache instead
care about just the subset of args of an (atom,args) pair that is
relevant to satisfaction.

This patch additionally fixes a seemingly latent bug that was found when
testing against range-v3.  In the testcase concepts-decltype2.C below,
during normalization of f's constraints we end up forming a TARGET_EXPR
whose _SLOT has a DECL_CONTEXT that points to g instead of f because
current_function_decl is not updated before we start normalizing.
This patch fixes this accordingly, and also adds a sanity check to
keep_template_parm to verify each found parameter has a valid index.

With this patch, compile time and memory usage for the cmcstl2 test
test/algorithm/set_symmetric_difference4.cpp drops from 8.5s/1.2GB to
3.5s/0.4GB.

gcc/cp/ChangeLog:

	* constraint.cc (norm_info::norm_info): Initialize orig_decl.
	(norm_info::orig_decl): New data member.
	(normalize_atom): When caching an atom for the first time,
	compute a list of template parameters used in the targets of the
	parameter mapping and store it in the TREE_TYPE of the mapping.
	(get_normalized_constraints_from_decl): Set current_function_decl
	appropriately when normalizing.  As an optimization, don't
	set up a push_nested_class_guard when decl has no constraints.
	(sat_hasher::hash): Use this list to hash only the template
	arguments that are relevant to the atom.
	(satisfy_atom): Use this list to compare only the template
	arguments that are relevant to the atom.
	* pt.c (keep_template_parm): Do a sanity check on the parameter's
	index when flag_checking.
2020-11-09 18:16:48 -05:00
config Fixup config/ChangeLog. 2020-09-10 10:17:51 +02:00
contrib Daily bump. 2020-11-08 00:16:31 +00:00
fixincludes Daily bump. 2020-10-04 00:16:21 +00:00
gcc c++: Consider only relevant template arguments in sat_hasher 2020-11-09 18:16:48 -05:00
gnattools
gotools Daily bump. 2020-10-30 00:16:29 +00:00
include Daily bump. 2020-09-25 00:16:27 +00:00
INSTALL
intl intl: Unbreak intl build with bison 3 when no regeneration is needed [PR92008] 2020-04-16 11:55:00 +02:00
libada Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
libatomic Daily bump. 2020-10-12 00:16:25 +00:00
libbacktrace Daily bump. 2020-10-21 00:16:36 +00:00
libcc1 Daily bump. 2020-11-07 00:16:39 +00:00
libcpp Daily bump. 2020-11-08 00:16:31 +00:00
libdecnumber Daily bump. 2020-07-31 00:16:26 +00:00
libffi Daily bump. 2020-09-25 00:16:27 +00:00
libgcc Daily bump. 2020-11-04 00:16:41 +00:00
libgfortran Daily bump. 2020-11-02 20:53:00 +00:00
libgo libgo: handle linking to NetBSD's versioned symbols 2020-10-28 18:20:50 -07:00
libgomp Daily bump. 2020-11-06 00:16:34 +00:00
libhsail-rt Add `--with-toolexeclibdir=' configuration option 2020-01-24 11:24:25 +00:00
libiberty libiberty/pex-win32.c: Initialize orig_err 2020-11-09 07:15:15 +00:00
libitm Daily bump. 2020-10-02 00:16:27 +00:00
libobjc Daily bump. 2020-10-12 00:16:25 +00:00
liboffloadmic Add missing ChangeLog entries. 2020-05-05 16:10:13 +02:00
libphobos Daily bump. 2020-10-28 00:16:38 +00:00
libquadmath Daily bump. 2020-05-30 00:16:27 +00:00
libsanitizer ASAN: Support detect_invalid_pointer_pairs=1 with detect_stack_use_after_return=1 2020-10-21 09:27:08 +02:00
libssp Daily bump. 2020-05-30 00:16:27 +00:00
libstdc++-v3 libstdc++: Remove <debug/array> 2020-11-09 21:20:01 +01:00
libvtv Daily bump. 2020-05-30 00:16:27 +00:00
lto-plugin Daily bump. 2020-09-11 00:16:28 +00:00
maintainer-scripts Daily bump. 2020-05-30 00:16:27 +00:00
zlib Daily bump. 2020-05-30 00:16:27 +00:00
.dir-locals.el
.gitattributes Add *.md diff=md. 2020-01-15 14:29:53 +01:00
.gitignore Add .clang-tidy to git ignored. 2020-06-12 16:03:02 +02:00
ABOUT-NLS
ar-lib
ChangeLog Daily bump. 2020-11-07 00:16:39 +00:00
ChangeLog.jit
ChangeLog.tree-ssa
compile
config-ml.in config-ml.in: Suppress output from multi-do recipes 2020-11-09 14:28:37 +00:00
config.guess
config.rpath
config.sub
configure configure: Fix in-tree building of GMP on BSD [PR97302] 2020-10-06 11:49:34 +02:00
configure.ac configure: Fix in-tree building of GMP on BSD [PR97302] 2020-10-06 11:49:34 +02:00
COPYING
COPYING.LIB
COPYING.RUNTIME
COPYING3
COPYING3.LIB
depcomp
install-sh
libtool-ldflags
libtool.m4 [ARM/FDPIC v6 02/24] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts 2019-09-10 09:37:00 +02:00
ltgcc.m4
ltmain.sh Do not use HAVE_DOS_BASED_FILE_SYSTEM for Cygwin. 2020-04-17 09:22:51 +02:00
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
MAINTAINERS MAINTAINERS: Add myself for write after approval 2020-11-09 16:03:16 -05:00
Makefile.def Merge top-level configury changes from gdb 2020-04-09 06:52:55 -06:00
Makefile.in Merge top-level configury changes from gdb 2020-04-09 06:52:55 -06:00
Makefile.tpl
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
symlink-tree
test-driver
ylwrap

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.