Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - code generation/optimizer bug
#include <stdio.h> char *f(char *c) { return c + 1; } void g(char *ptr) { char *p; char c; c = *ptr; *ptr = '\0'; if (f(ptr)) { *ptr = c; p = ptr; if (c == '(') { printf("OK\n"); } *p++ = '\0'; if (*p != '\0') { f(p); } } } int main() { g("(abc)"); return 0; } This test-case should print "OK", but it doesn't if compiled with -o+speed Here ist the generated assembler code: ?g YAXPAD Z: push EAX push EAX push EBX mov EBX,010h[ESP] mov AL,[EBX] ; c = *ptr push ESI mov 0Ch[ESP],AL mov byte ptr [EBX],0 ; *ptr = '\0'; push EBX call near ptr ?f YAPADPAD Z ; f(ptr); add ESP,4 test EAX,EAX je L50 mov AL,0Ch[ESP] mov ESI,EBX ; p = ptr mov [EBX],AL ; *ptr = c cmp BL,028h ; But this one should be "cmp AL, 028h" jne L3E push offset FLAT:_DATA call near ptr _printf add ESP,4 BTW, I have tried it with DMC 8.37.7 and 8.38.2. bye, Christof -- http://cmeerw.org JID: cmeerw jabber.at mailto cmeerw at web.de ...and what have you contributed to the Net? Oct 26 2003
|