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