From b830c28b56fdc3f4b4555200278218b4b49022d2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 2 Oct 2019 16:01:42 -0400 Subject: [PATCH] Improve C++ fold caching efficiency. 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 | 5 +++++ gcc/cp/typeck2.c | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index baf01e69ebd..275fc9fa0f3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-10-02 Jason Merrill + + * typeck2.c (store_init_value): Only clear_cv_and_fold_caches if the + value is constant. + 2019-09-30 Jason Merrill Use hash_map_safe_* functions. diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 58fa54f40af..ec0e6a7e33d 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -907,9 +907,6 @@ store_init_value (tree decl, tree init, vec** 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** 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. */ -- 2.30.2