c++: Reuse identical ATOMIC_CONSTRs during normalization
authorPatrick Palka <ppalka@redhat.com>
Mon, 9 Nov 2020 23:12:47 +0000 (18:12 -0500)
committerPatrick Palka <ppalka@redhat.com>
Mon, 9 Nov 2020 23:12:47 +0000 (18:12 -0500)
commit2096ebd393a5a25921c85de1209b38c715924e22
tree3e41d28c28f581e254a7d0065e729c452b282039
parent71a8040716c1342547a19c25bd0203ac29258ef3
c++: Reuse identical ATOMIC_CONSTRs during normalization

Profiling revealed that sat_hasher::equal accounts for nearly 40% of
compile time in some cmcstl2 tests.

This patch eliminates this bottleneck by caching the ATOMIC_CONSTRs
returned by normalize_atom.  This in turn allows us to replace the
expensive atomic_constraints_identical_p check in sat_hasher::equal
with cheap pointer equality, with no loss in cache hit rate.

With this patch, compile time for the cmcstl2 test
test/algorithm/set_symmetric_difference4.cpp drops from 19s to 11s with
an --enable-checking=release compiler.

gcc/cp/ChangeLog:

* constraint.cc (atom_cache): Define this deletable hash_table.
(normalize_atom): Use it to cache ATOMIC_CONSTRs when not
generating diagnostics.
(sat_hasher::hash): Use htab_hash_pointer instead of
hash_atomic_constraint.
(sat_hasher::equal): Test for pointer equality instead of
atomic_constraints_identical_p.
* cp-tree.h (struct atom_hasher): Moved and renamed from ...
* logic.cc (struct constraint_hash): ... here.
(clause::m_set): Adjust accordingly.
gcc/cp/constraint.cc
gcc/cp/cp-tree.h
gcc/cp/logic.cc