digitalmars.D - Inner functions vs inlining
Let's take following code
===== cut here =====
int baz2(int a) { return a + 1; }
int bar2(int a) { return baz2(a) + 2; }
int foo2(int a) { return bar2(a) + 4; }
int foo(int a) {
int bar(int a) {
int baz(int a) { return a + 1; }
return baz(a) + 2;
}
return bar(a) + 4;
}
int main()
{
return foo(5) + foo2(5);
}
===== cut here =====
and compile with flags -O -inline (dmd 0.95 windows version)
what we see in assembly listing?
_TEXT:00402044 push eax
_TEXT:00402045 mov eax, 5
_TEXT:0040204A call 402034
_TEXT:0040204F add eax, 0Ch
_TEXT:00402052 pop ecx
_TEXT:00402053 retn
as we can clearly see, foo() call was not properly inlined, while
foo2() along with calls to bar2() and baz2() was inlined perfectly.
if we take a look at foo() assembly listing..
_TEXT:00402034 push eax
_TEXT:00402035 push eax
_TEXT:00402036 lea eax, [esp+8+var_4]
_TEXT:0040203A call 402010 ; bar()
_TEXT:0040203F add eax, 4
_TEXT:00402042 pop ecx
_TEXT:00402043 retn
. we can see that bar() call was not inlined also.
and bar() is..
_TEXT:00402010 mov eax, [esp+arg_0]
_TEXT:00402014 add eax, 3
_TEXT:00402017 retn 4
finally we got some inlining happened here, baz() was properly inlined after
all.
somehow inlining for inner functions is not working properly, or maybe i'm
missing something?
also there's issue with calling convention.. there's no fastcall (or similar) in
D? value is being passed via stack all the time, even for such trivial functions
(which is no good)
also i'd like to ask Walter once again to think about adding assembly listing
generation to D compiler. its so damn convenient in msvc/icc to have mixed
source/assembly listing generated by compiler where each source is followed by
assembly code produced.
i was told that compiler generates instructions directly, skipping assembly
phase, but i dont find it to be a real problem.
p.s. if there's no convenient disassembly library i could even code one <g>
Jul 09 2004
"quetzal" <quetzal_member pathlink.com> wrote in message news:ccnian$1dg1$1 digitaldaemon.com...somehow inlining for inner functions is not working properly, or maybe i'm missing something?I'll look at it.also there's issue with calling convention.. there's no fastcall (orsimilar) inD? value is being passed via stack all the time, even for such trivialfunctions(which is no good)It's not really needed. And for functions with one argument, the argument is passed in EAX.also i'd like to ask Walter once again to think about adding assemblylistinggeneration to D compiler. its so damn convenient in msvc/icc to have mixed source/assembly listing generated by compiler where each source isfollowed byassembly code produced. i was told that compiler generates instructions directly, skippingassemblyphase, but i dont find it to be a real problem. p.s. if there's no convenient disassembly library i could even code one<g> All you need to do for mixed assembly/source is to compile with -g and run obj2asm over the output.
Jul 10 2004








"Walter" <newshound digitalmars.com>