Lack of optimisation with returning address of inner functions
Cecil Ward
cecil at cecilward.com
Fri Sep 4 01:10:48 UTC 2020
This question is about a peculiar lack of optimisation in a
certain weird case only.
Example, see https://d.godbolt.org/z/54eaGd ; either LDC or GDC
may be used, results are the same here :
auto test2() {
int a = 20;
int foo() { return a + 5; } // inner function
return &foo; // other way to construct delegate
}
auto bar()
{
return foo();
}
Now with LDC or GDC, inspecting the code generated, the code for
foo is simply literally { return 25; }, yet if test2 is called,
the code generated for the foo2 routine is not used; rather the
generated code is :
call _d_allocmemory
mov dword ptr [rax], 20
mov rdx, foo
ret
1. So why the lack of optimisation? - could simply have got rid
of the delegate generation in test2a as implementations when it
is inlined in bar (and which is done sanely [!] in the generated
code for test2a).
2. Even weirder, if you delete the & from &foo leaving simply
"return foo;" then this fixes the non-optimisation bug. Why?
3. What’s the difference between foo and &foo ?
4. Leaving aside the special case above where the inner
function’s address is returned, surely in many cases an inner
function can be converted into an ordinary function, or simply
_inlined_ so there is no function at all, no? As is seen in the
standalone code generated for foo.
More information about the Digitalmars-d
mailing list