This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Avoid some unnecessary set_cfun calls
- From: Richard Biener <rguenther at suse dot de>
- To: David Malcolm <dmalcolm at redhat dot com>
- Cc: Martin Jambor <mjambor at suse dot cz>, Jakub Jelinek <jakub at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Wed, 13 Nov 2013 14:44:26 +0100 (CET)
- Subject: Re: [PATCH] Avoid some unnecessary set_cfun calls
- Authentication-results: sourceware.org; auth=none
- References: <20131113094909 dot GI27813 at tucnak dot zalov dot cz> <20131113123330 dot GD10643 at virgil dot suse> <alpine dot LNX dot 2 dot 00 dot 1311131351080 dot 4261 at zhemvz dot fhfr dot qr> <1384348939 dot 15325 dot 25 dot camel at surprise>
On Wed, 13 Nov 2013, David Malcolm wrote:
> On Wed, 2013-11-13 at 13:53 +0100, Richard Biener wrote:
> > On Wed, 13 Nov 2013, Martin Jambor wrote:
> >
> > > Hi,
> > >
> > > On Wed, Nov 13, 2013 at 10:49:09AM +0100, Jakub Jelinek wrote:
> > > > Hi!
> > > >
> > > > void f1 (void) {}
> > > > __attribute__((target ("avx"))) void f2 (void) {}
> > > > __attribute__((target ("avx2"))) void f3 (void) {}
> > > > __attribute__((target ("sse3"))) void f4 (void) {}
> > > > __attribute__((target ("ssse3"))) void f5 (void) {}
> > > > __attribute__((target ("sse4"))) void f6 (void) {}
> > > > takes about 3 seconds to compile at -O2, because set_cfun is terribly
> > > > expensive and there are hundreds of such calls.
> > > > The following patch is just a quick change to avoid some of them:
> > > > execute_function_todo starts with:
> > > > unsigned int flags = (size_t)data;
> > > > flags &= ~cfun->last_verified;
> > > > if (!flags)
> > > > return;
> > > > and if flags is initially zero, it does nothing.
> > > > Similarly, execute_function_dump has the whole body surrounded by
> > > > if (dump_file && current_function_decl)
> > > > and thus if dump_file is NULL, there is nothing to do.
> > > > So IMHO in neither case (which happens pretty frequently) we need to
> > > > set_cfun to every function during IPA.
> > > >
> > > > Also, I wonder if we couldn't defer the expensive ira_init, if the info
> > > > computed by it is used only during RTL optimization passes (haven't verified
> > > > it yet), then supposedly we could just remember using some target hook
> > > > what the last state was when we did ira_init last time, and call ira_init
> > > > again at the start of expansion or so if it is different from the
> > > > last time.
> > >
> > > I was wondering whether the expensive parts of set_cfun could only be
> > > run in pass_all_optimizations (and the -Og equivalent) but not when
> > > changing functions in early and IPA passes.
> >
> > Sounds like a hack ;)
> >
> > Better get things working without the cfun/current_function_decl globals.
> > Wasn't there someone replacing all implicit uses with explicit ones
> > for stuff like n_basic_blocks?
>
> I was working on this:
> http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00780.html
> though I switched to other tasks I felt were higher priority; sorry.
>
> Do you still want me to go ahead and commit the series of changes you
> pre-approved there?
>
> i.e. the "n_basic_blocks" macro goes away in favor of:
> n_basic_blocks_for_fn (cfun)
> as a renaming of the existing n_basic_blocks_for_function macro,
> followed up by analogous changes to the other macros.
>
> Or should I repost before committing?
I'd say create the n_basic_blocks patch and post it, that gives
people a chance to object. If nobody chimes in I approve it
and pre-approve the rest ;)
Using n_basic_blocks_for_fn (cfun) might feel backwards if
eventually we'd want to C++-ify struct function and make
n_basic_blocks a member function which would make it
cfun->n_basic_blocks () instead. Ok, I think that will get
us into C++ bikeshedding again ;)
Thanks,
Richard.