Message ID | 20160531190022.17352-1-patrick@parcs.ath.cx |
---|---|
State | New |
Headers | show |
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 --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; }