On Tue, May 31, 2016 at 3:00 PM, Patrick Palka <patr...@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 >