Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? This cache apparently has a 98% hit rate for TYPE_HAS_CONVERSION types on some test files.
-- >8 -- gcc/cp/ChangeLog: * config-lang.in (gtfiles): Add search.cc. * search.cc (lookup_conversions_cache): Define. (lookup_conversions): Use it to cache he lookup. Improve cache rate by considering TYPE_MAIN_VARIANT of the type. --- gcc/cp/config-lang.in | 1 + gcc/cp/search.cc | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in index a6c7883cc24..e34c392d208 100644 --- a/gcc/cp/config-lang.in +++ b/gcc/cp/config-lang.in @@ -52,6 +52,7 @@ gtfiles="\ \$(srcdir)/cp/name-lookup.cc \ \$(srcdir)/cp/parser.cc \$(srcdir)/cp/pt.cc \ \$(srcdir)/cp/rtti.cc \ +\$(srcdir)/cp/search.cc \ \$(srcdir)/cp/semantics.cc \ \$(srcdir)/cp/tree.cc \$(srcdir)/cp/typeck2.cc \ \$(srcdir)/cp/vtable-class-hierarchy.cc \ diff --git a/gcc/cp/search.cc b/gcc/cp/search.cc index cd80f285ac9..d5a2c57f59c 100644 --- a/gcc/cp/search.cc +++ b/gcc/cp/search.cc @@ -2582,6 +2582,10 @@ lookup_conversions_r (tree binfo, int virtual_depth, int virtualness, return my_virtualness; } +/* A cache of the result of lookup_conversions. */ + +static GTY((cache)) type_tree_cache_map *lookup_conversions_cache; + /* Return a TREE_LIST containing all the non-hidden user-defined conversion functions for TYPE (and its base-classes). The TREE_VALUE of each node is the FUNCTION_DECL of the conversion @@ -2596,10 +2600,14 @@ lookup_conversions (tree type) { tree convs; + type = TYPE_MAIN_VARIANT (type); complete_type (type); if (!CLASS_TYPE_P (type) || !TYPE_BINFO (type)) return NULL_TREE; + if (tree *c = hash_map_safe_get (lookup_conversions_cache, type)) + return *c; + lookup_conversions_r (TYPE_BINFO (type), 0, 0, NULL_TREE, NULL_TREE, &convs); tree list = NULL_TREE; @@ -2618,6 +2626,7 @@ lookup_conversions (tree type) } } + hash_map_safe_put<hm_ggc> (lookup_conversions_cache, type, list); return list; } @@ -2798,3 +2807,5 @@ any_dependent_bases_p (tree type) return false; } + +#include "gt-cp-search.h" -- 2.42.0.122.g1fc548b2d6