PR c++/12245 - excessive memory use
authorJason Merrill <jason@redhat.com>
Fri, 3 Feb 2017 19:44:27 +0000 (14:44 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 3 Feb 2017 19:44:27 +0000 (14:44 -0500)
* 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
gcc/cp/constexpr.c

index 8f65db5b357637634fa136423d3afd3ffd4e2412..f77e6cb985f32369dc9e3a260be7a6c19ad7cc2e 100644 (file)
@@ -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.
index 67d2428e9b6eead09cffaaae7007763a4dacab1d..f9bc518641b5908f4fccef41bfeb2d8760bbb805 100644 (file)
@@ -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)