summaryrefslogtreecommitdiff
path: root/gcc/cp/constexpr.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-03 19:44:27 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-03 19:44:27 +0000
commitb601ad30923258481b5c04d48c109efb89e8e303 (patch)
tree89916b185c7ce9e6cdac80634876abedd8b5f330 /gcc/cp/constexpr.c
parent41ac8cbf4e888a2d80aec9254ea56ea9823169fa (diff)
downloadgcc-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
Diffstat (limited to 'gcc/cp/constexpr.c')
-rw-r--r--gcc/cp/constexpr.c37
1 files changed, 15 insertions, 22 deletions
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)