Saturday 21 October 2017

c# - .NET JIT potential error?

It is a JIT optimizer bug. It is unrolling the inner loop
but not updating the oVec.y value properly:



for (oVec.x = 0; oVec.x < 2; oVec.x++) {
0000000a xor esi,esi ; oVec.x =
0
for (oVec.y = 0; oVec.y < 2; oVec.y++) {
0000000c mov edi,2 ;
oVec.y = 2, WRONG!
oDoesSomething.Do(oVec);
00000011 push
edi
00000012 push esi
00000013 mov ecx,ebx
00000015 call
dword ptr ds:[00170210h] ; first unrolled call
0000001b push edi ; WRONG! does
not increment oVec.y
0000001c push esi
0000001d mov
ecx,ebx
0000001f call dword ptr ds:[00170210h] ; second unrolled
call
for (oVec.x = 0; oVec.x < 2; oVec.x++) {
00000025 inc
esi
00000026 cmp esi,2
00000029 jl
0000000C

The bug disappears when
you let oVec.y increment to 4, that's too many calls to
unroll.


One workaround is
this:


 for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 2; y++) {
oDoesSomething.Do(new IntVec(x,
y));
}

}

UPDATE: re-checked in August
2012, this bug was fixed in the version 4.0.30319 jitter. But is still present in the
v2.0.50727 jitter. It seems unlikely they'll fix this in the old version after this
long.

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...