From 8a87daca9cc5e0156477d6ad39ca1fd8b8687730 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 3 Feb 2017 14:44:27 -0500 Subject: [PATCH] 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. From-SVN: r245169 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/constexpr.c | 37 +++++++++++++++---------------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8f65db5b357..f77e6cb985f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2017-02-03 Jason Merrill + 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. + PR c++/79294 - ICE with invalid template argument * pt.c (convert_nontype_argument_function): Check value-dependence. (convert_nontype_argument): Don't check it here for function ptrs. 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) -- 2.30.2