April 21, 2004 [BUG] bogus codegen with -inline (access violation) | ||||
|---|---|---|---|---|
| ||||
Here's a binary-chop with an interesting codegen issue. It operates fine with any compiler flags other than -inline which, when applied, will cause an access violation.
Compiler flags for the code listing are -g -O -release -inline
Will post the standalone module if Walter needs it.
- Kris
156: static int bsearch (short[] array, short size, short match)
0042DCB8 push eax
0042DCB9 push ebx
0042DCBA mov ebx,0FFFFFFFFh
161: u = size;
0042DCBF push ebp
0042DCC0 push esi
0042DCC1 mov si,word ptr [esp+14h]
162: while (l+1 != u)
0042DCC6 push edi
0042DCC7 mov edi,eax
157: {
158: short l, u, m;
159:
160: l = -1;
0042DCC9 cmp word ptr [esp+18h],0
0042DCCF je _D3dsc5cache6Primes6Primes7bsearchFAsssZi+5Bh
(0042dd13)
0042DCD1 mov word ptr [esp+10h],bx
165: if (array[m] < match)
0042DCD6 mov edx,dword ptr [esp+20h]
0042DCDA mov ebx,dword ptr [esp+1Ch]
0042DCDE mov ebp,edx
0042DCE0 mov bx,word ptr [esp+10h]
163: {
164: m = (l + u) / 2;
0042DCE5 movsx ecx,bx
0042DCE8 movsx eax,si
0042DCEB add ecx,eax
0042DCED test ecx,ecx
0042DCEF jns _D3dsc5cache6Primes6Primes7bsearchFAsssZi+3Ah
(0042dcf2)
0042DCF1 inc ecx
0042DCF2 sar ecx,1
0042DCF4 mov edx,ecx
0042DCF6 movsx ecx,cx
0042DCF9 cmp word ptr l[ecx*2],di
0042DCFE jge _D3dsc5cache6Primes6Primes7bsearchFAsssZi+57h
(0042dd0f)
166: l = m;
0042DD00 mov ebx,edx
0042DD02 movsx edx,bx
0042DD05 inc edx
0042DD06 movsx ecx,si
0042DD09 cmp edx,ecx
0042DD0B jne _D3dsc5cache6Primes6Primes7bsearchFAsssZi+2Dh
(0042dce5)
0042DD0D jmp _D3dsc5cache6Primes6Primes7bsearchFAsssZi+5Bh
(0042dd13)
167: else
168: u = m;
0042DD0F mov esi,edx
0042DD11 jmp _D3dsc5cache6Primes6Primes7bsearchFAsssZi+4Ah
(0042dd02)
169: }
170:
171: if (u >= size || array[u] != match)
0042DD13 cmp si,word ptr [esp+18h]
0042DD18 jge _D3dsc5cache6Primes6Primes7bsearchFAsssZi+73h
(0042dd2b)
0042DD1A movsx edx,si
0042DD1D mov ecx,dword ptr [esp+20h]
0042DD21 mov eax,dword ptr [esp+1Ch]
0042DD25 cmp word ptr [ecx+edx*2],di
0042DD29 je _D3dsc5cache6Primes6Primes7bsearchFAsssZi+80h
(0042dd38)
172: return -u;
0042DD2B pop edi
0042DD2C mov eax,esi
0042DD2E neg eax
0042DD30 pop esi
0042DD31 cwde
0042DD32 pop ebp
0042DD33 pop ebx
0042DD34 pop ecx
0042DD35 ret 0Ch
173: return u;
0042DD38 movsx eax,si
174: }
0042DD3B pop edi
0042DD3C pop esi
0042DD3D pop ebp
0042DD3E pop ebx
0042DD3F pop ecx
0042DD40 ret 0Ch
| ||||
April 23, 2004 Re: [BUG] bogus codegen with -inline (access violation) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kris Attachments: | Wanted to bring this one up again, since -inline apparently causes static array addresses to be passed incorrectly. Attached is the standalone example (sans main) | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply