Array Bounds Check Elimination no CLR?

Eu estava lendo recentementeEste artig por Dave Detlefs, no qual ele apresenta alguns casos em que o CLR executa a eliminação de verificação de limites de matriz. Decidi testar isso sozinho, então fiz o seguinte:

Opened Visual Studio 2010 Ultimate SP1riou um novo projeto C # do tipo Aplicativo de Console (direcionado ao .NET 4 Client Profile por padrã

Adicionou o seguinte código (todos os sub-métodos são obtidos diretamente do artigo):

class Program {
    static void Main(string[] args) {
        int[] array = new int[30];
        Test_SimpleAscend(array);
        Test_SimpleRedundant(array, 3);

        foreach (int i in array) {
            Console.WriteLine(i);
        }
    }

    static void Test_SimpleAscend(int[] a) {
        for (int i = 0; i < a.Length; i++)
            a[i] = i;
    }

    static void Test_SimpleRedundant(int[] a, int i) {
        int k = a[i];
        k = k + a[i];
    }
}

Alterado para o modo Release; verificou que "Otimizar código" está marcado nas opções de compilação

Adicionou um ponto de interrupção para cada acesso ao array, iniciou a depuração (F5) e abriu a janela de desmontagem

Então aqui está a desmontagem para a [i] = i; em Test_SimpleAscend:

                a[i] = i;
00000024  mov         eax,dword ptr [ebp-4] 
00000027  mov         edx,dword ptr [ebp-8] 
0000002a  cmp         eax,dword ptr [edx+4] 
0000002d  jb          00000034 
0000002f  call        64FD6E08 
00000034  mov         ecx,dword ptr [ebp-4] 
00000037  mov         dword ptr [edx+eax*4+8],ecx 

A chamada cmp / jb / está dentro dos limites, forçando a chamada a ser executada lança uma IndexOutOfRangeExceptio

O mesmo para todos os acessos à matriz, incluindo o acesso redundante em Test_SimpleRedundant. Então, há algo errado com minha metodologia de teste ou o CLR não elimina a verificação de limites? Espero estar errado e, se assim for, gostaria de saber como posso realmente obter limites de matriz verificando a eliminaçã

questionAnswers(2)

yourAnswerToTheQuestion