Some nice new DMD slicing optimizations

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 6 23:07:47 PDT 2016


https://github.com/dlang/dmd/pull/6176

I'm happy to report that DMD has (finally!) gotten some significant new 
optimizations! Specifically, 'slicing' a two register wide aggregate into two 
register-sized variables, enabling much better enregistering.

Given the code:

void foo(int[] a, int[] b, int[] c) {
     foreach (i; 0 .. a.length)
         a[i] = b[i] + c[i];
}

the inner loop formerly compiled to:

LA:             mov     EAX,018h[ESP]
                 mov     EDX,010h[ESP]
                 mov     ECX,[EBX*4][EAX]
                 add     ECX,[EBX*4][EDX]
                 mov     ESI,020h[ESP]
                 mov     [EBX*4][ESI],ECX
                 inc     EBX
                 cmp     EBX,01Ch[ESP]
                 jb      LA
and now:

L1A:            mov     ECX,[EBX*4][EDI]
                 add     ECX,[EBX*4][ESI]
                 mov     0[EBX*4][EBP],ECX
                 inc     EBX
                 cmp     EBX,EDX
                 jb      L1A

I've been wanting to do this for years, and finally got around to it. (I also 
thought of a simpler way to implement it, which helped a lot.)

Further work will be in widening what this applies to.


More information about the Digitalmars-d mailing list