.NET JIT potential error?

后端 未结 3 734
北海茫月
北海茫月 2021-01-29 17:13

The following code gives different output when running the release inside Visual Studio, and running the release outside Visual Studio. I\'m using Visual Studio 2008 and targeti

3条回答
  •  不知归路
    2021-01-29 17:56

    I believe this is in a genuine JIT compilation bug. I would report it to Microsoft and see what they say. Interestingly, I found that the x64 JIT does not have the same problem.

    Here is my reading of the x86 JIT.

    // save context
    00000000  push        ebp  
    00000001  mov         ebp,esp 
    00000003  push        edi  
    00000004  push        esi  
    00000005  push        ebx  
    
    // put oDoesSomething pointer in ebx
    00000006  mov         ebx,ecx 
    
    // zero out edi, this will store oVec.y
    00000008  xor         edi,edi 
    
    // zero out esi, this will store oVec.x
    0000000a  xor         esi,esi 
    
    // NOTE: the inner loop is unrolled here.
    // set oVec.y to 2
    0000000c  mov         edi,2 
    
    // call oDoesSomething.Do(oVec) -- y is always 2!?!
    00000011  push        edi  
    00000012  push        esi  
    00000013  mov         ecx,ebx 
    00000015  call        dword ptr ds:[002F0010h] 
    
    // call oDoesSomething.Do(oVec) -- y is always 2?!?!
    0000001b  push        edi  
    0000001c  push        esi  
    0000001d  mov         ecx,ebx 
    0000001f  call        dword ptr ds:[002F0010h] 
    
    // increment oVec.x
    00000025  inc         esi  
    
    // loop back to 0000000C if oVec.x < 2
    00000026  cmp         esi,2 
    00000029  jl          0000000C 
    
    // restore context and return
    0000002b  pop         ebx  
    0000002c  pop         esi  
    0000002d  pop         edi  
    0000002e  pop         ebp  
    0000002f  ret     
    

    This looks like an optimization gone bad to me...

提交回复
热议问题