Это действительно ошибка сборки. x64, .net 4.7.1, сборка выпуска.
разборка:
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
Проблема находится по адресу 00007FF942690AFD, jg 00007FF942690AE7. Он возвращается, если ebx (который содержит 4, конечное значение цикла) больше (jg), чем eax, значение i. Конечно, это не удается, когда оно равно 4, поэтому он не записывает последний элемент в массиве.
Он терпит неудачу, потому что он включает значение регистра i (eax, по адресу 0x00007FF942690AF9), а затем проверяет его с 4, но ему все равно нужно записать это значение. Немного сложно определить, где именно находится проблема, поскольку похоже, что это может быть результатом оптимизации (N-Old.Length), поскольку сборка отладки содержит этот код, но сборка выпуска предварительно рассчитывает это. Так что это должны исправлять jit-люди;)