diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-02-03 19:44:27 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-02-03 19:44:27 +0000 |
commit | b601ad30923258481b5c04d48c109efb89e8e303 (patch) | |
tree | 89916b185c7ce9e6cdac80634876abedd8b5f330 | |
parent | 41ac8cbf4e888a2d80aec9254ea56ea9823169fa (diff) | |
download | gcc-b601ad30923258481b5c04d48c109efb89e8e303.tar.gz |
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
-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 8f65db5b357..f77e6cb985f 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 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<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) |