http://d.puremagic.com/issues/show_bug.cgi?id=4443
Summary: Optimizer produces wrong code for statements after loop Product: D Version: D1 & D2 Platform: Other OS/Version: Windows Status: NEW Keywords: wrong-code Severity: normal Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: r.sagita...@gmx.de --- Comment #0 from Rainer Schuetze <r.sagita...@gmx.de> 2010-07-10 01:27:42 PDT --- The code compiled from this source crashes when compiled with "dmd -O -release test.d": module test; struct TokenInfo { // seems important to have a "complicated" struct size (so a calculation is necessary) int type; int StartIndex; int EndIndex; } int GetTokenInfoAt(TokenInfo[] infoArray, int col, ref TokenInfo info) { for (int i = 0; i < infoArray.length; i++) { int start = infoArray[i].StartIndex; int end = infoArray[i].EndIndex; if (i == 0 && start > col) return -1; if (col >= start && col < end) { info = infoArray[i]; return i; } } if (infoArray.length > 0 && col == infoArray[$-1].EndIndex) { info = infoArray[$-1]; return infoArray.length-1; /* code generated for the 2 statements above: ov ECX,024h[ESP] // infoArray.ptr mov EBX,020h[ESP] // infoArray.length mov EDX,ECX lea ESI,[ECX*2][ECX] // uses pointer instead of length!!! mov EAX,EBX lea ESI,-0Ch[ESI*4][EDX] // crashes here! mov EDI,014h[ESP] movsd movsd movsd lea EAX,-1[EBX] */ } return -1; } int main() { TokenInfo[] arr = new TokenInfo[9]; arr[8].EndIndex = 11; TokenInfo info; return GetTokenInfoAt(arr, 11, info); } The crash goes away if - one of the conditions in the loop are removed - the struct size of TokenInfo is reduced to 8 bytes - dmd is executed without "-O" - dmd is executed without "-release" happens for all dmd version back to 2.032 and also in dmd 1.056 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------