public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Whole program optimization and functions-only-called-once.
@ 2009-11-04 19:19 Toon Moene
  2009-11-04 19:26 ` Richard Guenther
  0 siblings, 1 reply; 18+ messages in thread
From: Toon Moene @ 2009-11-04 19:19 UTC (permalink / raw)
  To: Jan Hubicka; +Cc: gcc mailing list

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,

-- 
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

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2009-11-15 20:01 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-04 19:19 Whole program optimization and functions-only-called-once Toon Moene
2009-11-04 19:26 ` Richard Guenther
2009-11-04 21:20   ` Toon Moene
2009-11-04 21:30     ` Andrew Pinski
2009-11-04 21:50       ` Richard Guenther
2009-11-12 16:46       ` Jan Hubicka
2009-11-12 21:41         ` Jan Hubicka
2009-11-12 16:16   ` Jan Hubicka
2009-11-14 12:55     ` Toon Moene
2009-11-14 19:52       ` Richard Guenther
2009-11-14 20:14         ` Steven Bosscher
2009-11-14 22:13           ` Richard Guenther
2009-11-15 10:31             ` Steven Bosscher
2009-11-15 14:07               ` Toon Moene
2009-11-15 14:44                 ` Richard Guenther
2009-11-15 14:58                   ` Toon Moene
2009-11-15 20:01                     ` Tim Prince
2009-11-14 22:05         ` Toon Moene

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).