This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][C++] Save memory/time when folding CONSTRUCTORs


On Wed, 1 Feb 2017, Jakub Jelinek wrote:

> On Wed, Feb 01, 2017 at 03:35:49PM +0100, Richard Biener wrote:
> > > >  		    changed = false;
> > > >  		    break;
> > > >  		  }
> > > > -		changed = true;
> > > > +		if (! changed)
> > > > +		  {
> > > > +		    nelts = elts->copy ();
> > > 
> > > Isn't the above part unnecessarily expensive, e.g. for the case
> > > where you have huge CONSTRUCTOR and recursive cp_fold changes already
> > > the very first value?  Wouldn't it be better to just do:
> > > 		    vec_safe_reserve (nelts, vec_safe_length (elts));
> > > 		    vec_quick_grow (nelts, i);
> > > 		    memcpy (nelts->address (), elts->address (),
> > > 			    i * sizeof (constructor_elt));
> > > and then:
> > 
> > It really depends on how many constructor elements usually fold.
> > If every next element will fold then yes, otherwise a memcpy
> > is going to be faster than individual vec_quick_push ()s with
> > cache-trashing cp_fold calls inbetween.
> > 
> > But I didn't benchmark anything, I just looked at memory use
> > (for the case where nothing folds).  And elts->copy () looks
> > much "cleaner" than this reserve/grow/memcpy ;)
> 
> Maybe.  But then it would be better not to do:
> +               constructor_elt e = { p->index, op };                                                                                              
> +               (*nelts)[i] = e;                                                                                                                   
> but just
> 		(*nelts)[i].value = op;
> because (*nelts)[i].index has been already copied and is the same,
> so no need to override it again.

Heh, yes - good catch.  Consider the patch changed that way.

Richard.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]