From bebabf70a01b78d9bea65a0bbe8744a2adb6b373 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 2 Nov 2020 13:19:29 -0500 Subject: [PATCH] c++: Don't purge the satisfaction caches The adoption of P2104 ("Disallow changing concept values") means we can memoize the result of satisfaction indefinitely and no longer have to clear the satisfaction caches on various events that would affect satisfaction. To that end, this patch removes the invalidation routine clear_satisfaction_cache and adjusts its callers appropriately. This provides a large reduction in compile time and memory use in some cases. For example, on the libstdc++ test std/ranges/adaptor/join.cc, compile time and memory usage drops nearly 75%, from 7.5s/770MB to 2s/230MB, with a --enable-checking=release compiler. gcc/cp/ChangeLog: * class.c (finish_struct_1): Don't call clear_satisfaction_cache. * constexpr.c (clear_cv_and_fold_caches): Likewise. Remove bool parameter. * constraint.cc (clear_satisfaction_cache): Remove definition. * cp-tree.h (clear_satisfaction_cache): Remove declaration. (clear_cv_and_fold_caches): Remove bool parameter. * typeck2.c (store_init_value): Remove argument to clear_cv_and_fold_caches. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-complete1.C: Delete test that became ill-formed after P2104. --- gcc/cp/class.c | 3 --- gcc/cp/constexpr.c | 6 ++---- gcc/cp/constraint.cc | 9 --------- gcc/cp/cp-tree.h | 3 +-- gcc/cp/typeck2.c | 2 +- gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C | 11 ----------- 6 files changed, 4 insertions(+), 30 deletions(-) delete mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 26f996b7f4b..6c21682a3e5 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -7472,9 +7472,6 @@ finish_struct_1 (tree t) /* Finish debugging output for this type. */ rest_of_type_compilation (t, ! LOCAL_CLASS_P (t)); - /* Recalculate satisfaction that might depend on completeness. */ - clear_satisfaction_cache (); - if (TYPE_TRANSPARENT_AGGR (t)) { tree field = first_field (t); diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index b46824f128d..83c3bb49499 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -7136,15 +7136,13 @@ clear_cv_cache (void) cv_cache->empty (); } -/* Dispose of the whole CV_CACHE, FOLD_CACHE, and satisfaction caches. */ +/* Dispose of the whole CV_CACHE and FOLD_CACHE. */ void -clear_cv_and_fold_caches (bool sat /*= true*/) +clear_cv_and_fold_caches () { clear_cv_cache (); clear_fold_cache (); - if (sat) - clear_satisfaction_cache (); } /* Internal function handling expressions in templates for diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index d6354edbe6f..b6f6f0d02a5 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -2327,15 +2327,6 @@ save_satisfaction (tree constr, tree args, tree result) *slot = entry; } -void -clear_satisfaction_cache () -{ - if (sat_cache) - sat_cache->empty (); - if (decl_satisfied_cache) - decl_satisfied_cache->empty (); -} - /* A tool to help manage satisfaction caching in satisfy_constraint_r. Note the cache is only used when not diagnosing errors. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index fdb8ee57f0b..3b4f772cc70 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7831,7 +7831,6 @@ extern tree evaluate_concept_check (tree, tsubst_flags_t); extern tree satisfy_constraint_expression (tree); extern bool constraints_satisfied_p (tree); extern bool constraints_satisfied_p (tree, tree); -extern void clear_satisfaction_cache (); extern bool* lookup_subsumption_result (tree, tree); extern bool save_subsumption_result (tree, tree, bool); extern tree find_template_parameters (tree, tree); @@ -7901,7 +7900,7 @@ extern bool var_in_maybe_constexpr_fn (tree); extern void explain_invalid_constexpr_fn (tree); extern vec cx_error_context (void); extern tree fold_sizeof_expr (tree); -extern void clear_cv_and_fold_caches (bool = true); +extern void clear_cv_and_fold_caches (void); extern tree unshare_constructor (tree CXX_MEM_STAT_INFO); /* An RAII sentinel used to restrict constexpr evaluation so that it diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index e259a4201be..445e2a211c8 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -954,7 +954,7 @@ store_init_value (tree decl, tree init, vec** cleanups, int flags) return split_nonconstant_init (decl, value); /* DECL may change value; purge caches. */ - clear_cv_and_fold_caches (TREE_STATIC (decl)); + clear_cv_and_fold_caches (); /* If the value is a constant, just put it in DECL_INITIAL. If DECL is an automatic variable, the middle end will turn this into a diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C deleted file mode 100644 index 63f36965f00..00000000000 --- a/gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C +++ /dev/null @@ -1,11 +0,0 @@ -// { dg-do compile { target c++20 } } - -template concept has_mem_type = requires { typename T::type; }; - -template int f () { return 0; } -template char f() { return 0; } - -struct A; -static_assert (sizeof (f()) == 1); -struct A { typedef int type; }; -static_assert (sizeof (f()) > 1); -- 2.30.2