diff mbox

Make cp_fold more consistent in its output caching

Message ID 20160531190022.17352-1-patrick@parcs.ath.cx
State New
Headers show

Commit Message

Patrick Palka May 31, 2016, 7 p.m. UTC
Some code paths of cp_fold return early instead of falling through to
the end of the function and so in these cases we fail to cache the
return value of the function into the fold_cache.

This patch splits cp_fold into two functions, with the wrapper function
being responsible for caching the output of the worker function.  Does
this look OK to commit after bootstrap and regtest?

gcc/cp/ChangeLog:

	* cp-gimplify.c (cp_fold_1): Split out from ...
	(cp_fold): ... here.  Cache the output of cp_fold_1 into the
	fold_cache.
---
 gcc/cp/cp-gimplify.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

Comments

Patrick Palka June 1, 2016, 2:15 a.m. UTC | #1
On Tue, May 31, 2016 at 3:00 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
> Some code paths of cp_fold return early instead of falling through to
> the end of the function and so in these cases we fail to cache the
> return value of the function into the fold_cache.
>
> This patch splits cp_fold into two functions, with the wrapper function
> being responsible for caching the output of the worker function.  Does
> this look OK to commit after bootstrap and regtest?

On second thought this change is not really beneficial since all the
cases where we return early from cp_fold are very cheap to re-compute
so it would be pointless to cache them.

>
> gcc/cp/ChangeLog:
>
>         * cp-gimplify.c (cp_fold_1): Split out from ...
>         (cp_fold): ... here.  Cache the output of cp_fold_1 into the
>         fold_cache.
> ---
>  gcc/cp/cp-gimplify.c | 33 +++++++++++++++++++++++----------
>  1 file changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
> index 7b63db4..aaf5f48 100644
> --- a/gcc/cp/cp-gimplify.c
> +++ b/gcc/cp/cp-gimplify.c
> @@ -39,6 +39,7 @@ along with GCC; see the file COPYING3.  If not see
>  static tree cp_genericize_r (tree *, int *, void *);
>  static tree cp_fold_r (tree *, int *, void *);
>  static void cp_genericize_tree (tree*);
> +static tree cp_fold_1 (tree);
>  static tree cp_fold (tree);
>
>  /* Local declarations.  */
> @@ -1934,11 +1935,7 @@ clear_fold_cache (void)
>  static tree
>  cp_fold (tree x)
>  {
> -  tree op0, op1, op2, op3;
> -  tree org_x = x, r = NULL_TREE;
> -  enum tree_code code;
> -  location_t loc;
> -  bool rval_ops = true;
> +  tree org_x = x;
>
>    if (!x || x == error_mark_node)
>      return x;
> @@ -1957,6 +1954,27 @@ cp_fold (tree x)
>    if (tree *cached = fold_cache->get (x))
>      return *cached;
>
> +  x = cp_fold_1 (x);
> +
> +  fold_cache->put (org_x, x);
> +  /* Prevent that we try to fold an already folded result again.  */
> +  if (x != org_x)
> +    fold_cache->put (x, x);
> +
> +  return x;
> +}
> +
> +/* Worker function for cp_fold.  */
> +
> +static tree
> +cp_fold_1 (tree x)
> +{
> +  tree op0, op1, op2, op3;
> +  tree org_x = x, r = NULL_TREE;
> +  enum tree_code code;
> +  location_t loc;
> +  bool rval_ops = true;
> +
>    code = TREE_CODE (x);
>    switch (code)
>      {
> @@ -2319,11 +2337,6 @@ cp_fold (tree x)
>        return org_x;
>      }
>
> -  fold_cache->put (org_x, x);
> -  /* Prevent that we try to fold an already folded result again.  */
> -  if (x != org_x)
> -    fold_cache->put (x, x);
> -
>    return x;
>  }
>
> --
> 2.9.0.rc0.29.gabd6606
>
diff mbox

Patch

diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 7b63db4..aaf5f48 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -39,6 +39,7 @@  along with GCC; see the file COPYING3.  If not see
 static tree cp_genericize_r (tree *, int *, void *);
 static tree cp_fold_r (tree *, int *, void *);
 static void cp_genericize_tree (tree*);
+static tree cp_fold_1 (tree);
 static tree cp_fold (tree);
 
 /* Local declarations.  */
@@ -1934,11 +1935,7 @@  clear_fold_cache (void)
 static tree
 cp_fold (tree x)
 {
-  tree op0, op1, op2, op3;
-  tree org_x = x, r = NULL_TREE;
-  enum tree_code code;
-  location_t loc;
-  bool rval_ops = true;
+  tree org_x = x;
 
   if (!x || x == error_mark_node)
     return x;
@@ -1957,6 +1954,27 @@  cp_fold (tree x)
   if (tree *cached = fold_cache->get (x))
     return *cached;
 
+  x = cp_fold_1 (x);
+
+  fold_cache->put (org_x, x);
+  /* Prevent that we try to fold an already folded result again.  */
+  if (x != org_x)
+    fold_cache->put (x, x);
+
+  return x;
+}
+
+/* Worker function for cp_fold.  */
+
+static tree
+cp_fold_1 (tree x)
+{
+  tree op0, op1, op2, op3;
+  tree org_x = x, r = NULL_TREE;
+  enum tree_code code;
+  location_t loc;
+  bool rval_ops = true;
+
   code = TREE_CODE (x);
   switch (code)
     {
@@ -2319,11 +2337,6 @@  cp_fold (tree x)
       return org_x;
     }
 
-  fold_cache->put (org_x, x);
-  /* Prevent that we try to fold an already folded result again.  */
-  if (x != org_x)
-    fold_cache->put (x, x);
-
   return x;
 }