Some nice new DMD slicing optimizations

rikki cattermole via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 6 23:30:32 PDT 2016


On 07/10/2016 7:07 PM, Walter Bright wrote:
> 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.

If there is bound checking shouldn't there be a check to guarantee b and 
c and >= a.length?

Otherwise, awesome!


More information about the Digitalmars-d mailing list