On Wed, Nov 4, 2009 at 8:19 PM, Toon Moene <t...@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. Richard. > -- > Toon Moene - e-mail: t...@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 >