This is the mail archive of the gcc@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: Whole program optimization and functions-only-called-once.


> On Wed, Nov 4, 2009 at 8:19 PM, Toon Moene <toon@moene.org> wrote:
> > Jan,
> >
> > I had some time to study the example I sent you a couple of weeks ago.
> >
> > According to visible inspection of the source code, there are 5 functions
> > (subroutines in Fortran parlance) that are called once:
> >
> > MAIN ? calls
> > HLPROG calls
> > GEMINI calls
> > SL2TIM calls
> > PHCALL calls
> > PHTASK
> >
> > I.e., the last five should be candidates for inlining of "functions only
> > called once".
> >
> > However, ccrPOljB.o.047i.inline says:
> >
> > Deciding on functions called once:
> >
> > Considering gemini_.clone.1 size 11443.
> > ?Called once from hlprog 462 insns.
> > ?Inlined into hlprog which now has 10728 size for a net change of -12620
> > size.
> >
> > Considering hlprog size 10728.
> > ?Called once from main 7 insns.
> > ?Not inlined because --param large-function-growth limit reached.
> >
> > Inlined 1 calls, eliminated 1 functions, size 45477 turned to 32857 size.
> >
> > The dump option -fdump-ipa-all also gives me the call graph, of which I copy
> > here the relevant part:
> >
> > phcall_.clone.3/11(-1) @0x7fd198c16400 (clone of phcall/33)
> > availability:local 8281 time, 972 benefit 1351 size, 291 benefit 984 bytes
> > stack usage reachable local finalized inlinable
> > ?called by: sl2tim/49 (0.44 per call) sl2tim_.clone.0/16 (0.44 per call)
> > phtask_.clone.2/12(-1) @0x7fd198c16500 (clone of phtask/41)
> > availability:local 26416 time, 4268 benefit 4541 size, 880 benefit 480 bytes
> > stack usage reachable local finalized inlinable
> > ?called by: phcall_.clone.3/11 (3.52 per call) phcall/33 (3.52 per call)
> > sl2tim_.clone.0/16(-1) @0x7fd198c16900 (clone of sl2tim/49)
> > availability:local 207312 time, 26617 benefit 5169 size, 941 benefit 3856
> > bytes stack usage reachable local finalized inlinable
> > ?called by: gemini_.clone.1/40 (1.00 per call) gemini/0 (1.00 per call)
> > gemini_.clone.1phtask/40(-1) @0x7fd198c35000 (inline copy in hlprog/17)
> > (clone of gemini/0) availability:local 147324 time, 2770 benefit 11443 size,
> > 1177 benefit 11635 bytes stack usage reachable local finalized inlinable
> > ?called by: hlprog/17 (3.57 per call) (inlined)
> > phtask/41(-1) @0x7fd198c35100 availability:local 26416 time, 4268 benefit
> > 4541 size, 880 benefit 480 bytes stack usage reachable body local finalized
> > inlinable
> > ?called by:
> > phcall/33(-1) @0x7fd198c33a00 availability:local 8281 time, 972 benefit 1351
> > size, 291 benefit 984 bytes stack usage reachable body local finalized
> > inlinable
> > ?called by:
> > hlprog/17(-1) @0x7fd198c16a00 availability:local 560 time, 10 benefit
> > (516762 after inlining) 462 size, 1 benefit (10728 after inlining) 4216
> > bytes stack usage 15851 bytes after inlining reachable body local finalized
> > inlinable
> > ?called by: main/29 (1.00 per call)
> > sl2tim/49(-1) @0x7fd198c35900 availability:local 207312 time, 26617 benefit
> > 5169 size, 941 benefit 3856 bytes stack usage reachable body local finalized
> > inlinable
> > ?called by:
> > gemini/0(-1) @0x7fd198bef800 availability:local 147324 time, 2770 benefit
> > 11443 size, 1177 benefit 11635 bytes stack usage reachable body local
> > finalized inlinable
> > ?called by:
> >
> > So if we have to believe this summary,
> >
> > HLPROG is called by MAIN, but is not suitable for inlining (I can live with
> > that).
> > GEMINI is not called, but GEMINI.clone is (by HLPROG) and is inlined.
> > SL2TIM is not called, but SL2TIM.clone is called by GEMINI and GEMINI.clone;
> > because it is called twice, it is not considered a
> > function-only-called-once.
> > PHCALL is not called, but PHCALL.clone is called by SL2TIM and SL2TIM.clone;
> > because it is called twice, it is not considered a
> > function-only-called-once.
> > PHTASK is not called, but PHTASK.clone is called by PHCALL and PHCALL.clone;
> > because it is called twice, it is not considered a
> > function-only-called-once.
> >
> > I don't think this is really what we want with functions-only-called-once:
> > If only the .clone version of a function is used, than a function that's
> > only called once *inside this clone* is a function-only-called-once.
> >
> > I hope this analysis helps,
> 
> I think the underlying issue is
> 
> phtask/41(-1) @0x7fd198c35100 availability:local 26416 time, 4268
> benefit 4541 size, 880 benefit 480 bytes stack usage reachable body
> local finalized inlinable
>  called by:
> phcall/33(-1) @0x7fd198c33a00 availability:local 8281 time, 972
> benefit 1351 size, 291 benefit 984 bytes stack usage reachable body
> local finalized inlinable
>  called by:
> 
> that these are not called but still reachable (they should not be reachable
> anymore, instead the clones are now reachable).  I think there already is
> a bug about cloning not updating cgraph reachability and not reclaiming
> nodes after IPA transform application.

reachable flag is not kept up to date after initial cgraph build, only
code removing unreachable functions compute it. 

The actual problem here is uglier - the reachability pass can not really
remove the original functions, since their clones needs to be
constructed, so the function stay in the cgraph until this happens.
This confuse called once logic.

Hmm, I guess we need function called once to be able to figure out those
functions staying in callgraph only because they are masters for clones
to be materialized.  I guess we can make reachability pass ignoring this
issue (so really get reachability up to date) and make inliner (and
other propagation passes) to ignore those unreachable nodes.  Ugly, but
at the moment I don't see better way around :(

-fno-ipa-cp should work around your problem for time being.

Honza
> 
> Richard.
> 
> > --
> > Toon Moene - e-mail: toon@moene.org - phone: +31 346 214290
> > Saturnushof 14, 3738 XG ?Maartensdijk, The Netherlands
> > At home: http://moene.org/~toon/
> > Progress of GNU Fortran: http://gcc.gnu.org/gcc-4.5/changes.html
> >


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