digitalmars.D.bugs - [Issue 10932] New: Useless temporaries and other absurd in inlined code
- d-bugmail puremagic.com (78/78) Aug 30 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10932
- d-bugmail puremagic.com (6/7) Aug 30 2013 Should be var_8, of course.
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 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
http://d.puremagic.com/issues/show_bug.cgi?id=10932 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