diff options
author | Jason Merrill <jason@redhat.com> | 2017-02-03 14:44:27 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-02-03 14:44:27 -0500 |
commit | 8a87daca9cc5e0156477d6ad39ca1fd8b8687730 (patch) | |
tree | 89916b185c7ce9e6cdac80634876abedd8b5f330 /gcc | |
parent | 99be38ec6a484b92940c2d415e14db33ebfb19bc (diff) | |
download | gcc-8a87daca9cc5e0156477d6ad39ca1fd8b8687730.zip gcc-8a87daca9cc5e0156477d6ad39ca1fd8b8687730.tar.gz gcc-8a87daca9cc5e0156477d6ad39ca1fd8b8687730.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 37 |
2 files changed, 20 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8f65db5..f77e6cb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2017-02-03 Jason Merrill <jason@redhat.com> + 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 67d2428..f9bc5186 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<tree, tree> *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<tree, tree>::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<tree, tree> *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<tree, tree>::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) |