Optimize away immediately-called delegate literals?

Peter Alexander peter.alexander.au at gmail.com
Mon Mar 12 16:15:02 PDT 2012


On Sunday, 11 March 2012 at 06:49:27 UTC, H. S. Teoh wrote:
> On Sun, Mar 11, 2012 at 01:29:01AM -0500, Nick Sabalausky wrote:
>> Suppose you have a delegate literal and immediately call it:
>> 
>> auto a = x + (){ doStuff(); return y; }() + z;
>> 
>> Does DMD ever (or always?) optimize away a delegate if it's 
>> executed
>> immediately and never stored into a variable? If not, can it, 
>> and
>> would it be a simple change? Is something like this already on 
>> the
>> table?
> [...]
>
> I've always wondered about whether delegates passed to opApply 
> ever get
> inlined.

Don't wonder. Find out!

import std.stdio;
void doStuff() { writeln("Howdy!"); }
void main() {
     int x = 1, y = 2, z = 3;
     auto a = x + (){ doStuff(); return y; }() + z;
     writeln(a);
}

$ dmd test.d -O -release -inline

__Dmain:
000000010000106c	pushq	%rbp
000000010000106d	movq	%rsp,%rbp
0000000100001070	pushq	%rax
0000000100001071	pushq	%rbx
0000000100001072	movq	$0x000000000000000c,%rdi
000000010000107c	callq	0x1000237f0	; symbol stub for: 
__d_allocmemory
0000000100001081	movq	%rax,%rbx
0000000100001084	movq	$0x00000000,(%rbx)
000000010000108b	movl	$0x00000002,0x08(%rbx)
0000000100001092	movq	%rbx,%rdi
0000000100001095	call	*0x0002318c(%rip)
000000010000109c	leal	0x04(%rax),%edx
000000010000109f	movl	$0x0000000a,%esi
00000001000010a4	leaq	0x00033eed(%rip),%rdi
00000001000010ab	callq	0x10002319c	; symbol stub for: 
_D3std5stdio4File14__T5writeTiTaZ5writeMFiaZv
00000001000010b0	xorl	%eax,%eax
00000001000010b2	popq	%rbx
00000001000010b3	movq	%rbp,%rsp
00000001000010b6	popq	%rbp
00000001000010b7	ret

In short. No! It doesn't currently inline in this case.

Even if the lambda just returns a constant, it doesn't get 
inlined.


More information about the Digitalmars-d mailing list