Go to file
Richard Sandiford d3da63e543 Avoid excessively-big hash tables in empty-add cycles
A big source of cache misses when compiling a recent version of
gimple-match.ii was the call to cv_cache.empty () in clear_cv_cache.
The problem was that at one early point the hash table had grown
to 8191 entries (128k on LP64 hosts).  It then stayed at that size
for the rest of the compilation, even though subsequent uses needed
only a small number of entries (usually fewer than ten).  We would
still clear the whole 128k each time clear_cv_cache was called.

empty() already looks for cases where the hash table is very big
and cuts it down.  At the moment it fires when the table is 1M
in size and reduces it to the next selected prime above 1K (so
almost 2K in practice).  One fix would have been to lower the
threshold, but that didn't feel like the right approach.  Reducing
the current limit of 1M by a factor of 8 would be pretty significant
on its own, but I think this cv_cache behaviour would have been a
problem even with 64k or 32k tables.

I think the existing check is really for cases in which even a
well-populated table would need to be shrunk rather than cleared.
Here the problem isn't that the table is excessively big in
absolute terms, more that one outlier has made the table much
too big for the general case.

traverse() already shrinks the table if it's "too empty",
which is taken to be if:

      no. elements * 8 < capacity && capacity > 32

So an alternative would be to apply the same test (and the same choice
of shrunken size) to empty_slow too.  The patch below does this.
It gives a 2.5% improvement in gimple-match.ii compile time at -O0 -g
and doesn't seem to adversely affect any other tests I've tried.

Of course, there's a theoretical risk of a table alternating between
one large element count and one small element count.  If there was a
factor of eight difference between the two, we could shrink the table
on seeing each small element count, then grow it again when adding the
large number of elements.  That seems pretty unlikely in practice
though.

Also, empty_slow() does involve a traversal if some form of manual
gc is needed on active elements, so trying to recover from an outlier
should have even more benefit there.  (cv_cache uses automatic gc and so
the traversal gets optimised away.)

The calculation of the existing 1M threshold was assuming that each
entry was pointer-sized.  This patch makes it use the actual size of the
entry instead.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.

gcc/
	* hash-table.h (hash_table::too_empty_p): New function.
	(hash_table::expand): Use it.
	(hash_table::traverse): Likewise.
	(hash_table::empty_slot): Use sizeof (value_type) instead of
	sizeof (PTR) to convert bytes to elements.  Shrink the table
	if the current size is excessive for the current number of
	elements.

From-SVN: r244447
2017-01-13 16:00:26 +00:00
config Build libgo with -Wa,-nH if possible (PR go/78978) [non-libgo parts] 2017-01-06 14:33:47 +00:00
contrib [arm] Replace command-line option .def files with single definition file 2017-01-11 14:39:00 +00:00
fixincludes Only declare gets for C++ < 2014 on Solaris (PR libstdc++/78979) 2017-01-13 12:09:13 +00:00
gcc Avoid excessively-big hash tables in empty-add cycles 2017-01-13 16:00:26 +00:00
gnattools configure.ac: Add ACX_NONCANONICAL_HOST. 2016-05-16 08:55:12 +00:00
gotools Update copyright dates 2016-06-07 08:54:22 +00:00
include [DWARF] New DWARF operation "DW_OP_AARCH64_operation" for AArch64 2017-01-04 14:25:04 +00:00
INSTALL README: Do not mention CVS. 2014-10-12 15:05:28 +00:00
intl config-ml.in: Remove references to GCJ. 2016-11-15 16:34:02 +00:00
libada Update configure deps, remove stray \xA0 in picflag.m4, regenerate 2017-01-04 18:59:34 +10:30
libatomic Update copyright years. 2017-01-01 13:07:43 +01:00
libbacktrace Update copyright years. 2017-01-01 13:07:43 +01:00
libcc1 Update copyright years. 2017-01-04 12:30:51 +01:00
libcilkrts Import libcilkrts Build 4467 (PR target/68945) 2016-12-01 14:48:49 +00:00
libcpp Fix issues with unrepresentable column numbers (PR c++/77949) 2017-01-10 21:54:09 +00:00
libdecnumber re PR rtl-optimization/79003 (r238991 breaks ODR) 2017-01-08 17:43:30 +01:00
libffi config-ml.in: Remove references to GCJ. 2016-11-15 16:34:02 +00:00
libgcc builtin_target.c (check_features): Check all supported __builtin_cpu_supports options. 2017-01-12 18:30:03 +01:00
libgfortran re PR fortran/70696 ([Coarray] ICE on EVENT POST of host-associated EVENT_TYPE coarray) 2017-01-13 11:22:21 +01:00
libgo runtime: copy more scheduler code from Go 1.7 runtime 2017-01-10 21:09:00 +00:00
libgomp re PR libgomp/60670 (omp.h may differ between multilibs) 2017-01-09 20:29:06 +00:00
libiberty Update copyright years. 2017-01-04 12:30:51 +01:00
libitm Update configure deps, remove stray \xA0 in picflag.m4, regenerate 2017-01-04 18:59:34 +10:30
libmpx libtool-version: New version. 2016-12-27 15:35:19 +00:00
libobjc Update copyright years. 2017-01-01 13:07:43 +01:00
liboffloadmic config-ml.in: Remove references to GCJ. 2016-11-15 16:34:02 +00:00
libquadmath gcc.c (process_command): Update copyright notice dates. 2017-01-01 12:31:28 +01:00
libsanitizer re PR sanitizer/78992 (Incorrect sigaction definition on 32-bit sparc) 2017-01-10 16:22:56 +01:00
libssp Update copyright years. 2017-01-04 12:30:51 +01:00
libstdc++-v3 Add string_view support to COW std::string 2017-01-13 15:53:07 +00:00
libvtv Update copyright years. 2017-01-04 12:30:51 +01:00
lto-plugin Update copyright years. 2017-01-04 12:30:51 +01:00
maintainer-scripts re PR web/50642 (onlinedocs formated text too small to read) 2016-09-04 19:38:05 +00:00
zlib 2017-01-13 Matthias Klose <doko@ubuntu.com> 2017-01-13 12:10:39 +00:00
.dir-locals.el
.gitattributes add basic .gitattributes files to notice whitespace issues 2016-04-23 02:37:43 +00:00
.gitignore .gitignore: Ignore in-tree prerequisites. 2016-09-09 17:20:55 -04:00
ABOUT-NLS
ChangeLog Update configure deps, remove stray \xA0 in picflag.m4, regenerate 2017-01-04 18:59:34 +10:30
ChangeLog.jit Merger of dmalcolm/jit branch from git 2014-11-11 21:55:52 +00:00
ChangeLog.tree-ssa
compile Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
config-ml.in config-ml.in: Remove references to GCJ. 2016-11-15 16:34:02 +00:00
config.guess config.guess: Import latest version. 2016-11-25 08:38:27 +11:00
config.rpath
config.sub * config.sub: Import latest version. 2016-12-29 22:04:53 +11:00
configure Update configure deps, remove stray \xA0 in picflag.m4, regenerate 2017-01-04 18:59:34 +10:30
configure.ac configure.ac: Don't bootstrap libmpx unless --with-build-config includes bootstrap-mpx. 2016-12-21 12:28:40 +01:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.RUNTIME
depcomp Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
install-sh Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
libtool-ldflags
libtool.m4 * libtool.m4 (export_symbols_cmds) [AIX]: Add global TLS "L" symbols. 2015-11-26 08:20:59 -05:00
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS MAINTAINERS (Write After Approval): Add myself. 2016-12-26 10:28:02 +00:00
Makefile.def Makefile.def: Remove reference to boehm-gc target module. 2016-11-30 00:12:45 +00:00
Makefile.in Makefile.def: Remove reference to boehm-gc target module. 2016-11-30 00:12:45 +00:00
Makefile.tpl Makefile.def: Remove references to GCJ. 2016-11-15 17:29:12 +00:00
missing Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
mkdep
mkinstalldirs Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
move-if-change Update move-if-change from gnulib 2014-11-16 16:12:44 +00:00
README
symlink-tree
ylwrap Update from upstream Automake files. 2014-11-16 14:07:13 +00:00

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.