c++: Don't purge the satisfaction caches
authorPatrick Palka <ppalka@redhat.com>
Mon, 2 Nov 2020 18:19:29 +0000 (13:19 -0500)
committerPatrick Palka <ppalka@redhat.com>
Mon, 2 Nov 2020 18:19:29 +0000 (13:19 -0500)
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
gcc/cp/constexpr.c
gcc/cp/constraint.cc
gcc/cp/cp-tree.h
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C [deleted file]

index 26f996b7f4bff5f02639646e58a562911ca29a24..6c21682a3e50d39b72405af81efce8ba3412d525 100644 (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);
index b46824f128dbee7834d13715b5292afa5d939133..83c3bb49499230a40ca7112aafb0f287487e9c68 100644 (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
index d6354edbe6f04404925becce15a78d23796301aa..b6f6f0d02a5e8c4edab52ccc03c3026ae88e1c0f 100644 (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.  */
 
index fdb8ee57f0bc89d53a45fe94edbb30095f215936..3b4f772cc70cb468f5206402baf625924008038c 100644 (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
index e259a4201bee20ecf61fe0f3902f86f697e7a40a..445e2a211c860d011750181a8fb2e3b92af12ea2 100644 (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
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-complete1.C
deleted file mode 100644 (file)
index 63f3696..0000000
+++ /dev/null
@@ -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);