On Wed, Feb 01, 2017 at 04:18:49PM +0100, Richard Biener wrote:
> 2017-02-01  Richard Biener  <rguent...@suse.de>
> 
>       PR cp/14179
>       cp/
>       * cp-gimplify.c (cp_fold): When folding a CONSTRUCTOR copy
>       it lazily on the first changed element only and copy it
>       fully upfront, only storing changed elements.
> 
> Index: gcc/cp/cp-gimplify.c
> ===================================================================
> --- gcc/cp/cp-gimplify.c      (revision 245096)
> +++ gcc/cp/cp-gimplify.c      (working copy)
> @@ -2358,15 +2358,11 @@ cp_fold (tree x)
>        {
>       unsigned i;
>       constructor_elt *p;
> -     bool changed = false;
>       vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (x);
>       vec<constructor_elt, va_gc> *nelts = NULL;
> -     vec_safe_reserve (nelts, vec_safe_length (elts));
>       FOR_EACH_VEC_SAFE_ELT (elts, i, p)
>         {
>           tree op = cp_fold (p->value);
> -         constructor_elt e = { p->index, op };
> -         nelts->quick_push (e);
>           if (op != p->value)
>             {
>               if (op == error_mark_node)
> @@ -2375,10 +2371,12 @@ cp_fold (tree x)
>                   changed = false;
>                   break;
>                 }
> -             changed = true;
> +             if (nelts == NULL)
> +               nelts = elts->copy ();
> +             (*nelts)[i].value = op;
>             }
>         }
> -     if (changed)
> +     if (nelts)
>         x = build_constructor (TREE_TYPE (x), nelts);
>       else
>         vec_free (nelts);

vec_free (nelts); doesn't make sense in this case though,
so I'd also remove the last 2 lines.

        Jakub

Reply via email to