C'est en effet une erreur d'assemblage. x64, .net 4.7.1, version de version.
démontage:
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADD xor eax,eax
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADF mov ebx,esi
00007FF942690AE1 sub ebx,ebp
00007FF942690AE3 test ebx,ebx
00007FF942690AE5 jle 00007FF942690AFF
dd[i] = d;
00007FF942690AE7 mov rdx,qword ptr [rdi]
00007FF942690AEA cmp eax,dword ptr [rdx+8]
00007FF942690AED jae 00007FF942690B11
00007FF942690AEF movsxd rcx,eax
00007FF942690AF2 vmovsd qword ptr [rdx+rcx*8+10h],xmm6
for(int i = 0; i < N - Old.Length; i++)
00007FF942690AF9 inc eax
00007FF942690AFB cmp ebx,eax
00007FF942690AFD jg 00007FF942690AE7
00007FF942690AFF vmovaps xmm6,xmmword ptr [rsp+20h]
00007FF942690B06 add rsp,30h
00007FF942690B0A pop rbx
00007FF942690B0B pop rbp
00007FF942690B0C pop rsi
00007FF942690B0D pop rdi
00007FF942690B0E pop r14
00007FF942690B10 ret
Le problème se trouve à l'adresse 00007FF942690AFD, le jg 00007FF942690AE7. Il saute en arrière si ebx (qui contient 4, la valeur de fin de boucle) est plus grand (jg) que eax, la valeur i. Cela échoue quand il est 4 bien sûr, donc il n'écrit pas le dernier élément du tableau.
Il échoue, car il incorpore la valeur de registre i (eax, à 0x00007FF942690AF9), puis le vérifie avec 4, mais il doit toujours écrire cette valeur. Il est un peu difficile de localiser exactement le problème, car il semble que cela pourrait être le résultat de l'optimisation de (N-Old.Length), car la version de débogage contient ce code, mais la version de version précalcule cela. C'est donc aux gens de jit de réparer;)