digitalmars.D.bugs - [Issue 9785] New: dmd -inline should inline lambda delegates
- d-bugmail puremagic.com (102/102) Mar 22 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9785
http://d.puremagic.com/issues/show_bug.cgi?id=9785 Summary: dmd -inline should inline lambda delegates Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: hsteoh quickfur.ath.cx Code: ------------------------------------------ import std.stdio; void main() { void loop(void delegate(int x) dg) { foreach (i; 0..10) { dg(i); } } loop((x) { writeln(x); }); } ------------------------------------------ Compile with: dmd -O -inline -release -noboundscheck Here's the disassembly: ------------------------------------------ 0000000000454f80 <_Dmain>: 454f80: 55 push %rbp 454f81: 48 8b ec mov %rsp,%rbp 454f84: 48 83 ec 18 sub $0x18,%rsp 454f88: 53 push %rbx 454f89: 48 b9 e8 4f 45 00 00 movabs $0x454fe8,%rcx 454f90: 00 00 00 454f93: 48 31 c0 xor %rax,%rax 454f96: 48 89 45 f0 mov %rax,-0x10(%rbp) 454f9a: 48 89 4d f8 mov %rcx,-0x8(%rbp) 454f9e: 31 db xor %ebx,%ebx 454fa0: 8b f3 mov %ebx,%esi 454fa2: 48 8b 7d f0 mov -0x10(%rbp),%rdi 454fa6: 48 ff 55 f8 rex.W callq *-0x8(%rbp) 454faa: ff c3 inc %ebx 454fac: 83 fb 0a cmp $0xa,%ebx 454faf: 72 ef jb 454fa0 <_Dmain+0x20> 454fb1: 31 c0 xor %eax,%eax 454fb3: 5b pop %rbx 454fb4: 48 8b e5 mov %rbp,%rsp 454fb7: 5d pop %rbp 454fb8: c3 retq 454fb9: 90 nop 454fba: 90 nop 454fbb: 90 nop 0000000000454fbc <_D4test4mainFZv4loopMFDFiZvZv>: 454fbc: 55 push %rbp 454fbd: 48 8b ec mov %rsp,%rbp 454fc0: 48 83 ec 28 sub $0x28,%rsp 454fc4: 53 push %rbx 454fc5: 48 89 75 f0 mov %rsi,-0x10(%rbp) 454fc9: 48 89 55 f8 mov %rdx,-0x8(%rbp) 454fcd: 31 db xor %ebx,%ebx 454fcf: 8b f3 mov %ebx,%esi 454fd1: 48 8b 7d f0 mov -0x10(%rbp),%rdi 454fd5: 48 ff 55 f8 rex.W callq *-0x8(%rbp) 454fd9: ff c3 inc %ebx 454fdb: 83 fb 0a cmp $0xa,%ebx 454fde: 72 ef jb 454fcf <_D4test4mainFZv4loopMFDFiZvZv+0x13> 454fe0: 5b pop %rbx 454fe1: 48 8b e5 mov %rbp,%rsp 454fe4: 5d pop %rbp 454fe5: c3 retq 454fe6: 90 nop 454fe7: 90 nop 0000000000454fe8 <_D4test4mainFZv16__T9__lambda2TiZ9__lambda2MFiZv>: 454fe8: 55 push %rbp 454fe9: 48 8b ec mov %rsp,%rbp 454fec: 48 83 ec 10 sub $0x10,%rsp 454ff0: 48 89 f2 mov %rsi,%rdx 454ff3: be 0a 00 00 00 mov $0xa,%esi 454ff8: 48 bf 00 af 6c 00 00 movabs $0x6caf00,%rdi 454fff: 00 00 00 455002: e8 59 02 00 00 callq 455260 <_D3std5stdio4File14__T5writeTiTaZ5writeMFiaZv> 455007: 48 8b e5 mov %rbp,%rsp 45500a: 5d pop %rbp 45500b: c3 retq ------------------------------------------ There are two enhancements (optimizations) possible here: 1) Since loop() is inside main(), and there are no escaping references to it, it can't possibly be called from anywhere else. Since it's already inlined in main, there is no point in emitting the function body as a separate function. So the function body should be omitted. 2) Since the lambda delegate body is known at compile-time, and this is the only place it's used, the lambda should be inlined as well. Currently it's not (main still takes the address of the lambda and calls it from the inlined loop). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Mar 22 2013