www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 10932] New: Useless temporaries and other absurd in inlined code

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10932

           Summary: Useless temporaries and other absurd in inlined code
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: dmitry.olsh gmail.com


--- Comment #0 from Dmitry Olshansky <dmitry.olsh gmail.com> 2013-08-30
13:55:02 PDT ---
This is drilling down on the issue of why multi-stage lookup tables of new
std.uni ahve decent speed in LDC and painstakingly slow in DMD.

Observe that the following snippet (inlined opIndex of a Trie) does 2
remarkably stupid things:
a) See that read/write of arg_0 on stack, instead of direct "mov edx, ebx"
b) 2 push eax at the begining of function ... and "add esp, 8" at end - WAT?
Note that eax is never written to until the very end (there is simply no need
to save it).

public
_D3std3uni146__T4TrieTS3std3uni19__T9BitPackedTbVi1Z9BitPackedTwVk1114112TS3std3uni21__T9sliceBi39F8D5E3EE00191D27B7780CD5A2FFED
_D3std3uni146__T4TrieTS3std3uni19__T9BitPackedTbVi1Z9BitPackedTwVk1114112TS3std3uni21__T9sliceBi39F8D5E3EE00191D27B7780CD5A2FFED
proc near
                                     ; CODE XREF:
_D9trie_test4mainFAAyaZv17__foreachbody6846MFNfKwZi+Ap

var_8           = dword ptr -8
arg_0           = dword ptr  4

             push    eax
             mov     ecx, [esp+4+arg_0]
             shr     ecx, 8
             push    eax
             and     ecx, 1FFFh
             mov     edx, [eax+14h]
             push    ebx
             mov     bx, [edx+ecx*2]
             push    esi
             mov     esi, [esp+10h+arg_0]
             and     esi, 0FFh
             push    edi
             mov     edi, [eax+4]
             lea     ecx, [edx+edi*4]
             and     ebx, 0FFFFh
             shl     ebx, 8
             add     ebx, esi
             mov     [esp+14h+var_8], ebx
             mov     edx, [esp+14h+var_8]
             shr     ebx, 5
             and     edx, 1Fh
             bt      [ecx+ebx*4], edx
             sbb     eax, eax
             neg     eax
             pop     edi
             pop     esi
             pop     ebx
             add     esp, 8
             retn    4
_D3std3uni146__T4TrieTS3std3uni19__T9BitPackedTbVi1Z9BitPackedTwVk1114112TS3std3uni21__T9sliceBi39F8D5E3EE00191D27B7780CD5A2FFED
endp


And the D code where the above object code can be seen:
//Command line: dmd -O -release -inline -noboundscheck

import std.uni, std.stdio;

//match bits that std.regex had before
alias codepointSetTrie!(13, 8) makeTrie;

void main(string argv[])
{
    auto tr = makeTrie(unicode.Alphabetic);
    int count;
    foreach(arg; argv)
    foreach(dchar ch; arg)
        if(tr[ch])
            count++;
    writeln(count);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 30 2013
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=10932



--- Comment #1 from Dmitry Olshansky <dmitry.olsh gmail.com> 2013-08-30
13:58:54 PDT ---
 See that read/write of arg_0 on stack ...
Should be var_8, of course. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 30 2013