Improve C++ fold caching efficiency.
authorJason Merrill <jason@redhat.com>
Wed, 2 Oct 2019 20:01:42 +0000 (16:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 2 Oct 2019 20:01:42 +0000 (16:01 -0400)
While looking at concepts caching I noticed that we were clearing the caches
unnecessarily for non-constant initialization, which shouldn't affect
folding.

* typeck2.c (store_init_value): Only clear_cv_and_fold_caches if the
value is constant.

From-SVN: r276487

gcc/cp/ChangeLog
gcc/cp/typeck2.c

index baf01e69ebd3c266a5dabe37696b7fc05a1efabd..275fc9fa0f379e41b9aeed572e2d785c48276851 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-02  Jason Merrill  <jason@redhat.com>
+
+       * typeck2.c (store_init_value): Only clear_cv_and_fold_caches if the
+       value is constant.
+
 2019-09-30  Jason Merrill  <jason@redhat.com>
 
        Use hash_map_safe_* functions.
index 58fa54f40af5b8a065f36fe27fc759ee33133393..ec0e6a7e33d30491dd31f6897b510dbef19a5d1b 100644 (file)
@@ -907,9 +907,6 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
   /* Handle aggregate NSDMI in non-constant initializers, too.  */
   value = replace_placeholders (value, decl);
 
-  /* DECL may change value; purge caches.  */
-  clear_cv_and_fold_caches ();
-
   /* If the initializer is not a constant, fill in DECL_INITIAL with
      the bits that are constant, and then return an expression that
      will perform the dynamic initialization.  */
@@ -918,6 +915,10 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
          || vla_type_p (type)
          || ! reduced_constant_expression_p (value)))
     return split_nonconstant_init (decl, value);
+
+  /* DECL may change value; purge caches.  */
+  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
      dynamic initialization later.  */