Optimisation possibilities: current, future and enhancements

Cecil Ward via Digitalmars-d digitalmars-d at puremagic.com
Thu Aug 25 11:03:12 PDT 2016


On Thursday, 25 August 2016 at 14:42:28 UTC, Basile B. wrote:
> On Thursday, 25 August 2016 at 11:16:52 UTC, Cecil Ward wrote:
>> [...]
>
> I'll add
>
> * create temporaries based on the const function attribute.
>
> I don't know why but I believed that it was already the case. 
> After disassembling a short test with DMD and LDMD2 it appears 
> clearly that this is not true:
>
> °°°°°°°°°°°°°°°°°°°°°°°°°°
> struct Foo
> {
>     immutable _u = 8;
>     int foo() const
>     {
>         return 8 * _u;
>     }
> }
> int use(ref const(Foo) foo)
> {
>     return foo.foo() + foo.foo();
> }
> °°°°°°°°°°°°°°°°°°°°°°°°°°
>
> disasm of use (LDC2 via LDMD2, -O -release)
>
> 0000000000402930h  sub rsp, 18h
> 0000000000402934h  mov qword ptr [rsp+10h], rdi
> 0000000000402939h  call 00000000004028F0h ; (Foo.foo)
> 000000000040293Eh  mov rdi, qword ptr [rsp+10h]
> 0000000000402943h  mov dword ptr [rsp+0Ch], eax
> 0000000000402947h  call 00000000004028F0h ; (Foo.foo)
> 000000000040294Ch  mov ecx, dword ptr [rsp+0Ch]
> 0000000000402950h  add ecx, eax
> 0000000000402952h  mov eax, ecx
> 0000000000402954h  add rsp, 18h
> 0000000000402958h  ret
>
> But Foo.foo constness guarantees that Foo state is not 
> modified. So the result of the first CALL could be cached in a 
> temporary and reused instead of the second CALL. This would 
> help for example in loops when a getter function is called to 
> know the iteration count.

The problem of the non-caching of appropriate function calls is 
not confined to methods. It also is observable when calling 
explicitly pure-marked external functions, eg. my_pure() + 
my_pure() makes two calls. (Checked in GCC -O3, with an extern 
pure-marked function.)

This is often covered up by inlining with full expansion, as 
non-extern functions don't show this.


More information about the Digitalmars-d mailing list