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.
This commit is contained in:
Patrick Palka 2020-11-02 13:19:29 -05:00
parent 05161256d3
commit bebabf70a0
6 changed files with 4 additions and 30 deletions

View file

@ -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);

View file

@ -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

View file

@ -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. */

View file

@ -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<tree> 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

View file

@ -954,7 +954,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** 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

View file

@ -1,11 +0,0 @@
// { dg-do compile { target c++20 } }
template <class T> concept has_mem_type = requires { typename T::type; };
template <has_mem_type T> int f () { return 0; }
template <class T> char f() { return 0; }
struct A;
static_assert (sizeof (f<A>()) == 1);
struct A { typedef int type; };
static_assert (sizeof (f<A>()) > 1);