DIP60: @nogc attribute

bearophile via Digitalmars-d digitalmars-d at puremagic.com
Thu Apr 17 02:46:22 PDT 2014


Walter Bright:

> http://wiki.dlang.org/DIP60
>
> Start on implementation:
>
> https://github.com/D-Programming-Language/dmd/pull/3455

If I have this program:

__gshared int x = 5;
int main() {
     int[] a = [x, x + 10, x * x];
     return a[0] + a[1] + a[2];
}


If I compile with all optimizations DMD produces this X86 asm, 
that contains the call to __d_arrayliteralTX, so that main can't 
be @nogc:

__Dmain:
L0:     push    EAX
         push    EAX
         mov EAX,offset FLAT:_D11TypeInfo_Ai6__initZ
         push    EBX
         push    ESI
         push    EDI
         push    3
         push    EAX
         call    near ptr __d_arrayliteralTX
         mov EBX,EAX
         mov ECX,_D4test1xi
         mov [EBX],ECX
         mov EDX,_D4test1xi
         add EDX,0Ah
         mov 4[EBX],EDX
         mov ESI,_D4test1xi
         imul    ESI,ESI
         mov 8[EBX],ESI
         mov EAX,3
         mov ECX,EBX
         mov 014h[ESP],EAX
         mov 018h[ESP],ECX
         add ESP,8
         mov EDI,010h[ESP]
         mov EAX,[EDI]
         add EAX,4[EDI]
         add EAX,8[EDI]
         pop EDI
         pop ESI
         pop EBX
         add ESP,8
         ret


If I compile that code with ldc2 without optimizations the result 
is similar, there is a call to __d_newarrayvT:

__Dmain:
     pushl   %ebp
     movl    %esp, %ebp
     pushl   %esi
     andl    $-8, %esp
     subl    $32, %esp
     leal    __D11TypeInfo_Ai6__initZ, %eax
     movl    $3, %ecx
     movl    %eax, (%esp)
     movl    $3, 4(%esp)
     movl    %ecx, 12(%esp)
     calll   __d_newarrayvT
     movl    %edx, %ecx
     movl    __D4test1xi, %esi
     movl    %esi, (%edx)
     movl    __D4test1xi, %esi
     addl    $10, %esi
     movl    %esi, 4(%edx)
     movl    __D4test1xi, %esi
     imull   __D4test1xi, %esi
     movl    %esi, 8(%edx)
     movl    %eax, 16(%esp)
     movl    %ecx, 20(%esp)
     movl    20(%esp), %eax
     movl    20(%esp), %ecx
     movl    (%eax), %eax
     addl    4(%ecx), %eax
     movl    20(%esp), %ecx
     addl    8(%ecx), %eax
     leal    -4(%ebp), %esp
     popl    %esi
     popl    %ebp
     ret



But if I compile the code with ldc2 with full optimizations the 
compiler is able to perform a bit of escape analysis, and to see 
the array doesn't need to be allocated, and produces the asm:

__Dmain:
     movl    __D4test1xi, %eax
     movl    %eax, %ecx
     imull   %ecx, %ecx
     addl    %eax, %ecx
     leal    10(%eax,%ecx), %eax
     ret

Now there are no memory allocations.

So what's the right behavour of @nogc? Is it possible to compile 
this main with a future version of ldc2 if I compile the code 
with full optimizations?

Bye,
bearophile


More information about the Digitalmars-d mailing list