aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-11-09 18:16:48 -0500
committerPatrick Palka <ppalka@redhat.com>2020-11-09 18:16:48 -0500
commitd3fd75d869480044213553000d2c9dc236a4f7af (patch)
tree56ab62a333c47f69db56afc1585f64224e17da92 /gcc/tree-vect-loop.c
parent3d56e969cb1cf44a9e3ffaef891f22ae516fdc85 (diff)
downloadgcc-d3fd75d869480044213553000d2c9dc236a4f7af.zip
gcc-d3fd75d869480044213553000d2c9dc236a4f7af.tar.gz
gcc-d3fd75d869480044213553000d2c9dc236a4f7af.tar.bz2
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.
Diffstat (limited to 'gcc/tree-vect-loop.c')
0 files changed, 0 insertions, 0 deletions