From b601ad30923258481b5c04d48c109efb89e8e303 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 3 Feb 2017 19:44:27 +0000 Subject: PR c++/12245 - excessive memory use * constexpr.c (maybe_constant_value): Fold maybe_constant_value_1 back in. Don't cache constants. (maybe_constant_init): Don't cache constants. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@245169 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/constexpr.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) (limited to 'gcc/cp/constexpr.c') diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 67d2428e9b6..f9bc518641b 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4777,8 +4777,10 @@ fold_simple (tree t) Otherwise, if T does not have TREE_CONSTANT set, returns T. Otherwise, returns a version of T without TREE_CONSTANT. */ -static tree -maybe_constant_value_1 (tree t, tree decl) +static GTY((deletable)) hash_map *cv_cache; + +tree +maybe_constant_value (tree t, tree decl) { tree r; @@ -4791,6 +4793,14 @@ maybe_constant_value_1 (tree t, tree decl) } return t; } + else if (CONSTANT_CLASS_P (t)) + /* No caching or evaluation needed. */ + return t; + + if (cv_cache == NULL) + cv_cache = hash_map::create_ggc (101); + if (tree *cached = cv_cache->get (t)) + return *cached; r = cxx_eval_outermost_constant_expr (t, true, true, decl); gcc_checking_assert (r == t @@ -4798,29 +4808,10 @@ maybe_constant_value_1 (tree t, tree decl) || TREE_CODE (t) == VIEW_CONVERT_EXPR || (TREE_CONSTANT (t) && !TREE_CONSTANT (r)) || !cp_tree_equal (r, t)); + cv_cache->put (t, r); return r; } -static GTY((deletable)) hash_map *cv_cache; - -/* If T is a constant expression, returns its reduced value. - Otherwise, if T does not have TREE_CONSTANT set, returns T. - Otherwise, returns a version of T without TREE_CONSTANT. */ - -tree -maybe_constant_value (tree t, tree decl) -{ - if (cv_cache == NULL) - cv_cache = hash_map::create_ggc (101); - - if (tree *cached = cv_cache->get (t)) - return *cached; - - tree ret = maybe_constant_value_1 (t, decl); - cv_cache->put (t, ret); - return ret; -} - /* Dispose of the whole CV_CACHE. */ static void @@ -4916,6 +4907,8 @@ maybe_constant_init (tree t, tree decl) t = TARGET_EXPR_INITIAL (t); if (!potential_nondependent_static_init_expression (t)) /* Don't try to evaluate it. */; + else if (CONSTANT_CLASS_P (t)) + /* No evaluation needed. */; else t = cxx_eval_outermost_constant_expr (t, true, false, decl); if (TREE_CODE (t) == TARGET_EXPR) -- cgit v1.2.1