int nb_voisins_M(int **tab, int i, int j, int n, int m) {
  int nb_vivantes = 0;
  int k, l;
  if ((j > 0) && (j < m) && (i > 0) && (i < n)) {
    for (k = -1; k < 2; k++) {
      for (l = -1; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == 0) && (i == 0)) {
    for (k = 0; k < 2; k++) {
      for (l = 0; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == 0) && (i == n)) {
    for (k = -1; k < 1; k++) {
      for (l = 0; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == m) && (i == 0)) {
    for (k = 0; k < 2; k++) {
      for (l = -1; l < 1; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == m) && (i == n)) {
    for (k = -1; k < 1; k++) {
      for (l = -1; l < 1; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j > 0) && (i == n) && (j < m)) {
    for (k = -1; k < 1; k++) {
      for (l = -1; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j > 0) && (i == 0) && (j < m)) {
    for (k = 0; k < 2; k++) {
      for (l = -1; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == 0) && (i > 0) && (i < n)) {
    for (k = -1; k < 2; k++) {
      for (l = 0; l < 2; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if ((j == m) && (i > 0) && (i < n)) {
    for (k = -1; k < 2; k++) {
      for (l = -1; l < 1; l++) {
        if (tab[i + k][j + l] == 1) {
          nb_vivantes++;
        }
      }
    }
  }
  if (tab[i][j] == 1) {
    nb_vivantes--;
  }
  return nb_vivantes;
}


x86 assembly (clang, -O0):
<nb_voisins_M>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x0,-0x10(%rbp)
jle    11c2 <nb_voisins_M+0xc2>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11c2 <nb_voisins_M+0xc2>
cmpl   $0x0,-0xc(%rbp)
jle    11c2 <nb_voisins_M+0xc2>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11c2 <nb_voisins_M+0xc2>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    11bd <nb_voisins_M+0xbd>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    11aa <nb_voisins_M+0xaa>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1197 <nb_voisins_M+0x97>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119c <nb_voisins_M+0x9c>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1160 <nb_voisins_M+0x60>
jmp    11af <nb_voisins_M+0xaf>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    114f <nb_voisins_M+0x4f>
jmp    11c2 <nb_voisins_M+0xc2>
cmpl   $0x0,-0x10(%rbp)
jne    1250 <nb_voisins_M+0x150>
cmpl   $0x0,-0xc(%rbp)
jne    1250 <nb_voisins_M+0x150>
movl   $0x0,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    124b <nb_voisins_M+0x14b>
movl   $0x0,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    1238 <nb_voisins_M+0x138>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1225 <nb_voisins_M+0x125>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    122a <nb_voisins_M+0x12a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11ee <nb_voisins_M+0xee>
jmp    123d <nb_voisins_M+0x13d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11dd <nb_voisins_M+0xdd>
jmp    1250 <nb_voisins_M+0x150>
cmpl   $0x0,-0x10(%rbp)
jne    12e0 <nb_voisins_M+0x1e0>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    12e0 <nb_voisins_M+0x1e0>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x1,-0x20(%rbp)
jge    12db <nb_voisins_M+0x1db>
movl   $0x0,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    12c8 <nb_voisins_M+0x1c8>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    12b5 <nb_voisins_M+0x1b5>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12ba <nb_voisins_M+0x1ba>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    127e <nb_voisins_M+0x17e>
jmp    12cd <nb_voisins_M+0x1cd>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    126d <nb_voisins_M+0x16d>
jmp    12e0 <nb_voisins_M+0x1e0>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    1370 <nb_voisins_M+0x270>
cmpl   $0x0,-0xc(%rbp)
jne    1370 <nb_voisins_M+0x270>
movl   $0x0,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    136b <nb_voisins_M+0x26b>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x1,-0x24(%rbp)
jge    1358 <nb_voisins_M+0x258>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1345 <nb_voisins_M+0x245>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    134a <nb_voisins_M+0x24a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    130e <nb_voisins_M+0x20e>
jmp    135d <nb_voisins_M+0x25d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12fd <nb_voisins_M+0x1fd>
jmp    1370 <nb_voisins_M+0x270>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    1402 <nb_voisins_M+0x302>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    1402 <nb_voisins_M+0x302>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x1,-0x20(%rbp)
jge    13fd <nb_voisins_M+0x2fd>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x1,-0x24(%rbp)
jge    13ea <nb_voisins_M+0x2ea>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    13d7 <nb_voisins_M+0x2d7>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    13dc <nb_voisins_M+0x2dc>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13a0 <nb_voisins_M+0x2a0>
jmp    13ef <nb_voisins_M+0x2ef>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    138f <nb_voisins_M+0x28f>
jmp    1402 <nb_voisins_M+0x302>
cmpl   $0x0,-0x10(%rbp)
jle    149e <nb_voisins_M+0x39e>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    149e <nb_voisins_M+0x39e>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    149e <nb_voisins_M+0x39e>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x1,-0x20(%rbp)
jge    1499 <nb_voisins_M+0x399>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    1486 <nb_voisins_M+0x386>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1473 <nb_voisins_M+0x373>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1478 <nb_voisins_M+0x378>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    143c <nb_voisins_M+0x33c>
jmp    148b <nb_voisins_M+0x38b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    142b <nb_voisins_M+0x32b>
jmp    149e <nb_voisins_M+0x39e>
cmpl   $0x0,-0x10(%rbp)
jle    1538 <nb_voisins_M+0x438>
cmpl   $0x0,-0xc(%rbp)
jne    1538 <nb_voisins_M+0x438>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1538 <nb_voisins_M+0x438>
movl   $0x0,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    1533 <nb_voisins_M+0x433>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    1520 <nb_voisins_M+0x420>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    150d <nb_voisins_M+0x40d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1512 <nb_voisins_M+0x412>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    14d6 <nb_voisins_M+0x3d6>
jmp    1525 <nb_voisins_M+0x425>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    14c5 <nb_voisins_M+0x3c5>
jmp    1538 <nb_voisins_M+0x438>
cmpl   $0x0,-0x10(%rbp)
jne    15d2 <nb_voisins_M+0x4d2>
cmpl   $0x0,-0xc(%rbp)
jle    15d2 <nb_voisins_M+0x4d2>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    15d2 <nb_voisins_M+0x4d2>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    15cd <nb_voisins_M+0x4cd>
movl   $0x0,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    15ba <nb_voisins_M+0x4ba>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    15a7 <nb_voisins_M+0x4a7>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    15ac <nb_voisins_M+0x4ac>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1570 <nb_voisins_M+0x470>
jmp    15bf <nb_voisins_M+0x4bf>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    155f <nb_voisins_M+0x45f>
jmp    15d2 <nb_voisins_M+0x4d2>
mov    -0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    166e <nb_voisins_M+0x56e>
cmpl   $0x0,-0xc(%rbp)
jle    166e <nb_voisins_M+0x56e>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    166e <nb_voisins_M+0x56e>
movl   $0xffffffff,-0x20(%rbp)
cmpl   $0x2,-0x20(%rbp)
jge    1669 <nb_voisins_M+0x569>
movl   $0xffffffff,-0x24(%rbp)
cmpl   $0x1,-0x24(%rbp)
jge    1656 <nb_voisins_M+0x556>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1643 <nb_voisins_M+0x543>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1648 <nb_voisins_M+0x548>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    160c <nb_voisins_M+0x50c>
jmp    165b <nb_voisins_M+0x55b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    15fb <nb_voisins_M+0x4fb>
jmp    166e <nb_voisins_M+0x56e>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x10(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    1691 <nb_voisins_M+0x591>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<nb_voisins_M>:
push   %rbp
push   %r14
push   %rbx
xor    %eax,%eax
test   %edx,%edx
jle    11d0 <nb_voisins_M+0xd0>
cmp    %ecx,%esi
jge    11d0 <nb_voisins_M+0xd0>
test   %esi,%esi
jle    11d0 <nb_voisins_M+0xd0>
cmp    %r8d,%edx
jge    11d0 <nb_voisins_M+0xd0>
mov    %edx,%r9d
mov    %esi,%r10d
mov    -0x8(%rdi,%r10,8),%rax
mov    (%rdi,%r10,8),%rbx
movsd  (%rax,%r9,4),%xmm0
movss  -0x4(%rax,%r9,4),%xmm1
movss  -0x4(%rbx,%r9,4),%xmm2
shufps $0xd4,%xmm0,%xmm2
unpcklps %xmm1,%xmm0
shufps $0x21,%xmm2,%xmm0
xor    %r11d,%r11d
cmpl   $0x1,(%rbx,%r9,4)
sete   %r11b
xor    %r14d,%r14d
cmpl   $0x1,0x4(%rbx,%r9,4)
sete   %r14b
mov    0x8(%rdi,%r10,8),%r10
xor    %ebx,%ebx
cmpl   $0x1,-0x4(%r10,%r9,4)
sete   %bl
pcmpeqd 0xe7a(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%eax
shr    %al
and    $0x5,%al
sub    %al,%bpl
mov    %ebp,%eax
and    $0x33,%al
shr    $0x2,%bpl
and    $0x33,%bpl
add    %al,%bpl
mov    %ebp,%eax
shr    $0x4,%al
add    %bpl,%al
and    $0xf,%al
movzbl %al,%eax
add    %r11d,%eax
add    %r14d,%eax
add    %ebx,%eax
xor    %ebp,%ebp
cmpl   $0x1,(%r10,%r9,4)
sete   %bpl
add    %eax,%ebp
xor    %eax,%eax
cmpl   $0x1,0x4(%r10,%r9,4)
sete   %al
add    %ebp,%eax
mov    %edx,%ebp
or     %esi,%ebp
jne    121f <nb_voisins_M+0x11f>
mov    (%rdi),%rbp
mov    0x8(%rdi),%rbx
movq   0x0(%rbp),%xmm0
movq   (%rbx),%xmm1
punpcklqdq %xmm1,%xmm0
pcmpeqd 0xe0e(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %ebp,%eax
test   %edx,%edx
jne    1275 <nb_voisins_M+0x175>
cmp    %ecx,%esi
jne    1275 <nb_voisins_M+0x175>
movslq %esi,%rbp
mov    -0x8(%rdi,%rbp,8),%rbx
mov    (%rdi,%rbp,8),%rbp
movq   (%rbx),%xmm0
movq   0x0(%rbp),%xmm1
punpcklqdq %xmm1,%xmm0
pcmpeqd 0xdb8(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %ebp,%eax
test   %esi,%esi
jne    12ce <nb_voisins_M+0x1ce>
cmp    %r8d,%edx
jne    12ce <nb_voisins_M+0x1ce>
movslq %edx,%rbp
mov    (%rdi),%rbx
mov    0x8(%rdi),%r9
movq   -0x4(%rbx,%rbp,4),%xmm0
movq   -0x4(%r9,%rbp,4),%xmm1
punpcklqdq %xmm1,%xmm0
pcmpeqd 0xd5f(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %ebp,%eax
cmp    %ecx,%esi
jne    132c <nb_voisins_M+0x22c>
cmp    %r8d,%edx
jne    132c <nb_voisins_M+0x22c>
movslq %edx,%rbp
movslq %esi,%rbx
mov    -0x8(%rdi,%rbx,8),%r9
mov    (%rdi,%rbx,8),%rbx
movq   -0x4(%r9,%rbp,4),%xmm0
movq   -0x4(%rbx,%rbp,4),%xmm1
punpcklqdq %xmm1,%xmm0
pcmpeqd 0xd01(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %ebp,%eax
test   %edx,%edx
jle    13bf <nb_voisins_M+0x2bf>
cmp    %ecx,%esi
jne    13bf <nb_voisins_M+0x2bf>
cmp    %r8d,%edx
jge    13bf <nb_voisins_M+0x2bf>
mov    %edx,%ebp
movslq %esi,%rbx
mov    -0x8(%rdi,%rbx,8),%r9
mov    (%rdi,%rbx,8),%rbx
movsd  (%r9,%rbp,4),%xmm0
movss  -0x4(%r9,%rbp,4),%xmm1
movss  -0x4(%rbx,%rbp,4),%xmm2
shufps $0xd4,%xmm0,%xmm2
unpcklps %xmm1,%xmm0
shufps $0x21,%xmm2,%xmm0
xor    %r9d,%r9d
cmpl   $0x1,(%rbx,%rbp,4)
sete   %r9b
xor    %r10d,%r10d
cmpl   $0x1,0x4(%rbx,%rbp,4)
pcmpeqd 0xc78(%rip),%xmm0
sete   %r10b
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %r9d,%ebp
add    %r10d,%ebp
add    %ebp,%eax
test   %esi,%esi
jne    1460 <nb_voisins_M+0x360>
test   %edx,%edx
jle    1460 <nb_voisins_M+0x360>
cmp    %r8d,%edx
jge    1460 <nb_voisins_M+0x360>
mov    %edx,%ebp
mov    (%rdi),%rbx
mov    0x8(%rdi),%r10
movsd  (%rbx,%rbp,4),%xmm0
movss  -0x4(%rbx,%rbp,4),%xmm1
movss  -0x4(%r10,%rbp,4),%xmm2
shufps $0xd4,%xmm0,%xmm2
unpcklps %xmm1,%xmm0
shufps $0x21,%xmm2,%xmm0
xor    %r9d,%r9d
cmpl   $0x1,(%r10,%rbp,4)
sete   %r9b
xor    %r11d,%r11d
cmpl   $0x1,0x4(%r10,%rbp,4)
sete   %r11b
pcmpeqd 0xbe1(%rip),%xmm0
movmskps %xmm0,%ebp
mov    %ebp,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%bpl
mov    %ebp,%ebx
and    $0x33,%bl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %bl,%bpl
mov    %ebp,%ebx
shr    $0x4,%bl
add    %bpl,%bl
and    $0xf,%bl
movzbl %bl,%ebp
add    %r9d,%ebp
add    %r11d,%ebp
add    %ebp,%eax
cmp    %ecx,%esi
setl   %r10b
xor    %r9d,%r9d
jmp    14e1 <nb_voisins_M+0x3e1>
cmp    %ecx,%esi
setl   %r10b
test   %esi,%esi
setg   %r9b
jle    14e1 <nb_voisins_M+0x3e1>
test   %edx,%edx
jne    14e1 <nb_voisins_M+0x3e1>
cmp    %ecx,%esi
jge    14e1 <nb_voisins_M+0x3e1>
mov    %esi,%ecx
mov    -0x8(%rdi,%rcx,8),%rbp
mov    (%rdi,%rcx,8),%rbx
movq   0x0(%rbp),%xmm0
movq   (%rbx),%xmm1
punpcklqdq %xmm1,%xmm0
mov    0x8(%rdi,%rcx,8),%rbp
xor    %r11d,%r11d
cmpl   $0x1,0x0(%rbp)
sete   %r11b
xor    %ebx,%ebx
cmpl   $0x1,0x4(%rbp)
pcmpeqd 0xb54(%rip),%xmm0
sete   %bl
movmskps %xmm0,%ebp
mov    %ebp,%ecx
shr    %cl
and    $0x5,%cl
sub    %cl,%bpl
mov    %ebp,%ecx
and    $0x33,%cl
shr    $0x2,%bpl
and    $0x33,%bpl
add    %cl,%bpl
mov    %ebp,%ecx
shr    $0x4,%cl
add    %bpl,%cl
and    $0xf,%cl
movzbl %cl,%ecx
add    %r11d,%ecx
add    %ebx,%ecx
add    %ecx,%eax
test   %r10b,%r10b
je     1573 <nb_voisins_M+0x473>
test   %r9b,%r9b
je     1573 <nb_voisins_M+0x473>
cmp    %r8d,%edx
jne    1573 <nb_voisins_M+0x473>
movslq %edx,%rbp
movslq %esi,%rdx
mov    -0x8(%rdi,%rdx,8),%rcx
mov    (%rdi,%rdx,8),%rsi
movq   -0x4(%rcx,%rbp,4),%xmm0
mov    -0x4(%rsi,%rbp,4),%rcx
movq   %rcx,%xmm1
mov    0x8(%rdi,%rdx,8),%rdi
xor    %edx,%edx
cmpl   $0x1,-0x4(%rdi,%rbp,4)
sete   %dl
xor    %esi,%esi
cmpl   $0x1,(%rdi,%rbp,4)
punpcklqdq %xmm1,%xmm0
sete   %sil
pcmpeqd 0xac4(%rip),%xmm0
movmskps %xmm0,%edi
mov    %edi,%ebx
shr    %bl
and    $0x5,%bl
sub    %bl,%dil
mov    %edi,%ebx
and    $0x33,%bl
shr    $0x2,%dil
and    $0x33,%dil
add    %bl,%dil
mov    %edi,%ebx
shr    $0x4,%bl
add    %dil,%bl
and    $0xf,%bl
movzbl %bl,%edi
add    %edx,%edi
add    %esi,%edi
add    %edi,%eax
shr    $0x20,%rcx
jmp    1580 <nb_voisins_M+0x480>
movslq %esi,%rcx
mov    (%rdi,%rcx,8),%rcx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
xor    %edx,%edx
cmp    $0x1,%ecx
sete   %dl
sub    %edx,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @nb_voisins_M(i32** %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32**
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i32** %0, i32*** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
store i32 0, i32* %11
%14 = load i32, i32* %8
%15 = icmp sgt i32 %14, 0
br i1 %15, label %16, label %62
16: ; preds = %5
%17 = load i32, i32* %8
%18 = load i32, i32* %10
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %62
20: ; preds = %16
%21 = load i32, i32* %7
%22 = icmp sgt i32 %21, 0
br i1 %22, label %23, label %62
23: ; preds = %20
%24 = load i32, i32* %7
%25 = load i32, i32* %9
%26 = icmp slt i32 %24, %25
br i1 %26, label %27, label %62
27: ; preds = %23
store i32 -1, i32* %12
br label %28
28: ; preds = %58, %27
%29 = load i32, i32* %12
%30 = icmp slt i32 %29, 2
br i1 %30, label %31, label %61
31: ; preds = %28
store i32 -1, i32* %13
br label %32
32: ; preds = %54, %31
%33 = load i32, i32* %13
%34 = icmp slt i32 %33, 2
br i1 %34, label %35, label %57
35: ; preds = %32
%36 = load i32**, i32*** %6
%37 = load i32, i32* %7
%38 = load i32, i32* %12
%39 = add nsw i32 %37, %38
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i32*, i32** %36, i64 %40
%42 = load i32*, i32** %41
%43 = load i32, i32* %8
%44 = load i32, i32* %13
%45 = add nsw i32 %43, %44
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i32, i32* %42, i64 %46
%48 = load i32, i32* %47
%49 = icmp eq i32 %48, 1
br i1 %49, label %50, label %53
50: ; preds = %35
%51 = load i32, i32* %11
%52 = add nsw i32 %51, 1
store i32 %52, i32* %11
br label %53
53: ; preds = %50, %35
br label %54
54: ; preds = %53
%55 = load i32, i32* %13
%56 = add nsw i32 %55, 1
store i32 %56, i32* %13
br label %32
57: ; preds = %32
br label %58
58: ; preds = %57
%59 = load i32, i32* %12
%60 = add nsw i32 %59, 1
store i32 %60, i32* %12
br label %28
61: ; preds = %28
br label %62
62: ; preds = %61, %23, %20, %16, %5
%63 = load i32, i32* %8
%64 = icmp eq i32 %63, 0
br i1 %64, label %65, label %103
65: ; preds = %62
%66 = load i32, i32* %7
%67 = icmp eq i32 %66, 0
br i1 %67, label %68, label %103
68: ; preds = %65
store i32 0, i32* %12
br label %69
69: ; preds = %99, %68
%70 = load i32, i32* %12
%71 = icmp slt i32 %70, 2
br i1 %71, label %72, label %102
72: ; preds = %69
store i32 0, i32* %13
br label %73
73: ; preds = %95, %72
%74 = load i32, i32* %13
%75 = icmp slt i32 %74, 2
br i1 %75, label %76, label %98
76: ; preds = %73
%77 = load i32**, i32*** %6
%78 = load i32, i32* %7
%79 = load i32, i32* %12
%80 = add nsw i32 %78, %79
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i32*, i32** %77, i64 %81
%83 = load i32*, i32** %82
%84 = load i32, i32* %8
%85 = load i32, i32* %13
%86 = add nsw i32 %84, %85
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i32, i32* %83, i64 %87
%89 = load i32, i32* %88
%90 = icmp eq i32 %89, 1
br i1 %90, label %91, label %94
91: ; preds = %76
%92 = load i32, i32* %11
%93 = add nsw i32 %92, 1
store i32 %93, i32* %11
br label %94
94: ; preds = %91, %76
br label %95
95: ; preds = %94
%96 = load i32, i32* %13
%97 = add nsw i32 %96, 1
store i32 %97, i32* %13
br label %73
98: ; preds = %73
br label %99
99: ; preds = %98
%100 = load i32, i32* %12
%101 = add nsw i32 %100, 1
store i32 %101, i32* %12
br label %69
102: ; preds = %69
br label %103
103: ; preds = %102, %65, %62
%104 = load i32, i32* %8
%105 = icmp eq i32 %104, 0
br i1 %105, label %106, label %145
106: ; preds = %103
%107 = load i32, i32* %7
%108 = load i32, i32* %9
%109 = icmp eq i32 %107, %108
br i1 %109, label %110, label %145
110: ; preds = %106
store i32 -1, i32* %12
br label %111
111: ; preds = %141, %110
%112 = load i32, i32* %12
%113 = icmp slt i32 %112, 1
br i1 %113, label %114, label %144
114: ; preds = %111
store i32 0, i32* %13
br label %115
115: ; preds = %137, %114
%116 = load i32, i32* %13
%117 = icmp slt i32 %116, 2
br i1 %117, label %118, label %140
118: ; preds = %115
%119 = load i32**, i32*** %6
%120 = load i32, i32* %7
%121 = load i32, i32* %12
%122 = add nsw i32 %120, %121
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i32*, i32** %119, i64 %123
%125 = load i32*, i32** %124
%126 = load i32, i32* %8
%127 = load i32, i32* %13
%128 = add nsw i32 %126, %127
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i32, i32* %125, i64 %129
%131 = load i32, i32* %130
%132 = icmp eq i32 %131, 1
br i1 %132, label %133, label %136
133: ; preds = %118
%134 = load i32, i32* %11
%135 = add nsw i32 %134, 1
store i32 %135, i32* %11
br label %136
136: ; preds = %133, %118
br label %137
137: ; preds = %136
%138 = load i32, i32* %13
%139 = add nsw i32 %138, 1
store i32 %139, i32* %13
br label %115
140: ; preds = %115
br label %141
141: ; preds = %140
%142 = load i32, i32* %12
%143 = add nsw i32 %142, 1
store i32 %143, i32* %12
br label %111
144: ; preds = %111
br label %145
145: ; preds = %144, %106, %103
%146 = load i32, i32* %8
%147 = load i32, i32* %10
%148 = icmp eq i32 %146, %147
br i1 %148, label %149, label %187
149: ; preds = %145
%150 = load i32, i32* %7
%151 = icmp eq i32 %150, 0
br i1 %151, label %152, label %187
152: ; preds = %149
store i32 0, i32* %12
br label %153
153: ; preds = %183, %152
%154 = load i32, i32* %12
%155 = icmp slt i32 %154, 2
br i1 %155, label %156, label %186
156: ; preds = %153
store i32 -1, i32* %13
br label %157
157: ; preds = %179, %156
%158 = load i32, i32* %13
%159 = icmp slt i32 %158, 1
br i1 %159, label %160, label %182
160: ; preds = %157
%161 = load i32**, i32*** %6
%162 = load i32, i32* %7
%163 = load i32, i32* %12
%164 = add nsw i32 %162, %163
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds i32*, i32** %161, i64 %165
%167 = load i32*, i32** %166
%168 = load i32, i32* %8
%169 = load i32, i32* %13
%170 = add nsw i32 %168, %169
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds i32, i32* %167, i64 %171
%173 = load i32, i32* %172
%174 = icmp eq i32 %173, 1
br i1 %174, label %175, label %178
175: ; preds = %160
%176 = load i32, i32* %11
%177 = add nsw i32 %176, 1
store i32 %177, i32* %11
br label %178
178: ; preds = %175, %160
br label %179
179: ; preds = %178
%180 = load i32, i32* %13
%181 = add nsw i32 %180, 1
store i32 %181, i32* %13
br label %157
182: ; preds = %157
br label %183
183: ; preds = %182
%184 = load i32, i32* %12
%185 = add nsw i32 %184, 1
store i32 %185, i32* %12
br label %153
186: ; preds = %153
br label %187
187: ; preds = %186, %149, %145
%188 = load i32, i32* %8
%189 = load i32, i32* %10
%190 = icmp eq i32 %188, %189
br i1 %190, label %191, label %230
191: ; preds = %187
%192 = load i32, i32* %7
%193 = load i32, i32* %9
%194 = icmp eq i32 %192, %193
br i1 %194, label %195, label %230
195: ; preds = %191
store i32 -1, i32* %12
br label %196
196: ; preds = %226, %195
%197 = load i32, i32* %12
%198 = icmp slt i32 %197, 1
br i1 %198, label %199, label %229
199: ; preds = %196
store i32 -1, i32* %13
br label %200
200: ; preds = %222, %199
%201 = load i32, i32* %13
%202 = icmp slt i32 %201, 1
br i1 %202, label %203, label %225
203: ; preds = %200
%204 = load i32**, i32*** %6
%205 = load i32, i32* %7
%206 = load i32, i32* %12
%207 = add nsw i32 %205, %206
%208 = sext i32 %207 to i64
%209 = getelementptr inbounds i32*, i32** %204, i64 %208
%210 = load i32*, i32** %209
%211 = load i32, i32* %8
%212 = load i32, i32* %13
%213 = add nsw i32 %211, %212
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds i32, i32* %210, i64 %214
%216 = load i32, i32* %215
%217 = icmp eq i32 %216, 1
br i1 %217, label %218, label %221
218: ; preds = %203
%219 = load i32, i32* %11
%220 = add nsw i32 %219, 1
store i32 %220, i32* %11
br label %221
221: ; preds = %218, %203
br label %222
222: ; preds = %221
%223 = load i32, i32* %13
%224 = add nsw i32 %223, 1
store i32 %224, i32* %13
br label %200
225: ; preds = %200
br label %226
226: ; preds = %225
%227 = load i32, i32* %12
%228 = add nsw i32 %227, 1
store i32 %228, i32* %12
br label %196
229: ; preds = %196
br label %230
230: ; preds = %229, %191, %187
%231 = load i32, i32* %8
%232 = icmp sgt i32 %231, 0
br i1 %232, label %233, label %276
233: ; preds = %230
%234 = load i32, i32* %7
%235 = load i32, i32* %9
%236 = icmp eq i32 %234, %235
br i1 %236, label %237, label %276
237: ; preds = %233
%238 = load i32, i32* %8
%239 = load i32, i32* %10
%240 = icmp slt i32 %238, %239
br i1 %240, label %241, label %276
241: ; preds = %237
store i32 -1, i32* %12
br label %242
242: ; preds = %272, %241
%243 = load i32, i32* %12
%244 = icmp slt i32 %243, 1
br i1 %244, label %245, label %275
245: ; preds = %242
store i32 -1, i32* %13
br label %246
246: ; preds = %268, %245
%247 = load i32, i32* %13
%248 = icmp slt i32 %247, 2
br i1 %248, label %249, label %271
249: ; preds = %246
%250 = load i32**, i32*** %6
%251 = load i32, i32* %7
%252 = load i32, i32* %12
%253 = add nsw i32 %251, %252
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds i32*, i32** %250, i64 %254
%256 = load i32*, i32** %255
%257 = load i32, i32* %8
%258 = load i32, i32* %13
%259 = add nsw i32 %257, %258
%260 = sext i32 %259 to i64
%261 = getelementptr inbounds i32, i32* %256, i64 %260
%262 = load i32, i32* %261
%263 = icmp eq i32 %262, 1
br i1 %263, label %264, label %267
264: ; preds = %249
%265 = load i32, i32* %11
%266 = add nsw i32 %265, 1
store i32 %266, i32* %11
br label %267
267: ; preds = %264, %249
br label %268
268: ; preds = %267
%269 = load i32, i32* %13
%270 = add nsw i32 %269, 1
store i32 %270, i32* %13
br label %246
271: ; preds = %246
br label %272
272: ; preds = %271
%273 = load i32, i32* %12
%274 = add nsw i32 %273, 1
store i32 %274, i32* %12
br label %242
275: ; preds = %242
br label %276
276: ; preds = %275, %237, %233, %230
%277 = load i32, i32* %8
%278 = icmp sgt i32 %277, 0
br i1 %278, label %279, label %321
279: ; preds = %276
%280 = load i32, i32* %7
%281 = icmp eq i32 %280, 0
br i1 %281, label %282, label %321
282: ; preds = %279
%283 = load i32, i32* %8
%284 = load i32, i32* %10
%285 = icmp slt i32 %283, %284
br i1 %285, label %286, label %321
286: ; preds = %282
store i32 0, i32* %12
br label %287
287: ; preds = %317, %286
%288 = load i32, i32* %12
%289 = icmp slt i32 %288, 2
br i1 %289, label %290, label %320
290: ; preds = %287
store i32 -1, i32* %13
br label %291
291: ; preds = %313, %290
%292 = load i32, i32* %13
%293 = icmp slt i32 %292, 2
br i1 %293, label %294, label %316
294: ; preds = %291
%295 = load i32**, i32*** %6
%296 = load i32, i32* %7
%297 = load i32, i32* %12
%298 = add nsw i32 %296, %297
%299 = sext i32 %298 to i64
%300 = getelementptr inbounds i32*, i32** %295, i64 %299
%301 = load i32*, i32** %300
%302 = load i32, i32* %8
%303 = load i32, i32* %13
%304 = add nsw i32 %302, %303
%305 = sext i32 %304 to i64
%306 = getelementptr inbounds i32, i32* %301, i64 %305
%307 = load i32, i32* %306
%308 = icmp eq i32 %307, 1
br i1 %308, label %309, label %312
309: ; preds = %294
%310 = load i32, i32* %11
%311 = add nsw i32 %310, 1
store i32 %311, i32* %11
br label %312
312: ; preds = %309, %294
br label %313
313: ; preds = %312
%314 = load i32, i32* %13
%315 = add nsw i32 %314, 1
store i32 %315, i32* %13
br label %291
316: ; preds = %291
br label %317
317: ; preds = %316
%318 = load i32, i32* %12
%319 = add nsw i32 %318, 1
store i32 %319, i32* %12
br label %287
320: ; preds = %287
br label %321
321: ; preds = %320, %282, %279, %276
%322 = load i32, i32* %8
%323 = icmp eq i32 %322, 0
br i1 %323, label %324, label %366
324: ; preds = %321
%325 = load i32, i32* %7
%326 = icmp sgt i32 %325, 0
br i1 %326, label %327, label %366
327: ; preds = %324
%328 = load i32, i32* %7
%329 = load i32, i32* %9
%330 = icmp slt i32 %328, %329
br i1 %330, label %331, label %366
331: ; preds = %327
store i32 -1, i32* %12
br label %332
332: ; preds = %362, %331
%333 = load i32, i32* %12
%334 = icmp slt i32 %333, 2
br i1 %334, label %335, label %365
335: ; preds = %332
store i32 0, i32* %13
br label %336
336: ; preds = %358, %335
%337 = load i32, i32* %13
%338 = icmp slt i32 %337, 2
br i1 %338, label %339, label %361
339: ; preds = %336
%340 = load i32**, i32*** %6
%341 = load i32, i32* %7
%342 = load i32, i32* %12
%343 = add nsw i32 %341, %342
%344 = sext i32 %343 to i64
%345 = getelementptr inbounds i32*, i32** %340, i64 %344
%346 = load i32*, i32** %345
%347 = load i32, i32* %8
%348 = load i32, i32* %13
%349 = add nsw i32 %347, %348
%350 = sext i32 %349 to i64
%351 = getelementptr inbounds i32, i32* %346, i64 %350
%352 = load i32, i32* %351
%353 = icmp eq i32 %352, 1
br i1 %353, label %354, label %357
354: ; preds = %339
%355 = load i32, i32* %11
%356 = add nsw i32 %355, 1
store i32 %356, i32* %11
br label %357
357: ; preds = %354, %339
br label %358
358: ; preds = %357
%359 = load i32, i32* %13
%360 = add nsw i32 %359, 1
store i32 %360, i32* %13
br label %336
361: ; preds = %336
br label %362
362: ; preds = %361
%363 = load i32, i32* %12
%364 = add nsw i32 %363, 1
store i32 %364, i32* %12
br label %332
365: ; preds = %332
br label %366
366: ; preds = %365, %327, %324, %321
%367 = load i32, i32* %8
%368 = load i32, i32* %10
%369 = icmp eq i32 %367, %368
br i1 %369, label %370, label %412
370: ; preds = %366
%371 = load i32, i32* %7
%372 = icmp sgt i32 %371, 0
br i1 %372, label %373, label %412
373: ; preds = %370
%374 = load i32, i32* %7
%375 = load i32, i32* %9
%376 = icmp slt i32 %374, %375
br i1 %376, label %377, label %412
377: ; preds = %373
store i32 -1, i32* %12
br label %378
378: ; preds = %408, %377
%379 = load i32, i32* %12
%380 = icmp slt i32 %379, 2
br i1 %380, label %381, label %411
381: ; preds = %378
store i32 -1, i32* %13
br label %382
382: ; preds = %404, %381
%383 = load i32, i32* %13
%384 = icmp slt i32 %383, 1
br i1 %384, label %385, label %407
385: ; preds = %382
%386 = load i32**, i32*** %6
%387 = load i32, i32* %7
%388 = load i32, i32* %12
%389 = add nsw i32 %387, %388
%390 = sext i32 %389 to i64
%391 = getelementptr inbounds i32*, i32** %386, i64 %390
%392 = load i32*, i32** %391
%393 = load i32, i32* %8
%394 = load i32, i32* %13
%395 = add nsw i32 %393, %394
%396 = sext i32 %395 to i64
%397 = getelementptr inbounds i32, i32* %392, i64 %396
%398 = load i32, i32* %397
%399 = icmp eq i32 %398, 1
br i1 %399, label %400, label %403
400: ; preds = %385
%401 = load i32, i32* %11
%402 = add nsw i32 %401, 1
store i32 %402, i32* %11
br label %403
403: ; preds = %400, %385
br label %404
404: ; preds = %403
%405 = load i32, i32* %13
%406 = add nsw i32 %405, 1
store i32 %406, i32* %13
br label %382
407: ; preds = %382
br label %408
408: ; preds = %407
%409 = load i32, i32* %12
%410 = add nsw i32 %409, 1
store i32 %410, i32* %12
br label %378
411: ; preds = %378
br label %412
412: ; preds = %411, %373, %370, %366
%413 = load i32**, i32*** %6
%414 = load i32, i32* %7
%415 = sext i32 %414 to i64
%416 = getelementptr inbounds i32*, i32** %413, i64 %415
%417 = load i32*, i32** %416
%418 = load i32, i32* %8
%419 = sext i32 %418 to i64
%420 = getelementptr inbounds i32, i32* %417, i64 %419
%421 = load i32, i32* %420
%422 = icmp eq i32 %421, 1
br i1 %422, label %423, label %426
423: ; preds = %412
%424 = load i32, i32* %11
%425 = add nsw i32 %424, -1
store i32 %425, i32* %11
br label %426
426: ; preds = %423, %412
%427 = load i32, i32* %11
ret i32 %427
}

LLVM IR (-O2):
define i32 @nb_voisins_M(i32** nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = icmp sgt i32 %2, 0
br i1 %6, label %7, label %66
7: ; preds = %5
%8 = icmp slt i32 %2, %4
%9 = icmp sgt i32 %1, 0
%10 = and i1 %9, %8
%11 = icmp slt i32 %1, %3
%12 = and i1 %11, %10
br i1 %12, label %13, label %66
13: ; preds = %7
%14 = zext i32 %2 to i64
%15 = add nsw i64 %14, -1
%16 = zext i32 %1 to i64
%17 = add nsw i64 %16, -1
%18 = getelementptr inbounds i32*, i32** %0, i64 %17
%19 = load i32*, i32** %18
%20 = getelementptr inbounds i32, i32* %19, i64 %15
%21 = load i32, i32* %20
%22 = getelementptr inbounds i32, i32* %19, i64 %14
%23 = add nuw nsw i64 %14, 1
%24 = bitcast i32* %22 to <2 x i32>*
%25 = load <2 x i32>, <2 x i32>* %24
%26 = getelementptr inbounds i32*, i32** %0, i64 %16
%27 = load i32*, i32** %26
%28 = getelementptr inbounds i32, i32* %27, i64 %15
%29 = load i32, i32* %28
%30 = insertelement <4 x i32> poison, i32 %21, i64 0
%31 = shufflevector <2 x i32> %25, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
%32 = shufflevector <4 x i32> %30, <4 x i32> %31, <4 x i32> <i32 0, i32 4, i32 5, i32 undef>
%33 = insertelement <4 x i32> %32, i32 %29, i64 3
%34 = icmp eq <4 x i32> %33, <i32 1, i32 1, i32 1, i32 1>
%35 = getelementptr inbounds i32, i32* %27, i64 %14
%36 = load i32, i32* %35
%37 = icmp eq i32 %36, 1
%38 = zext i1 %37 to i32
%39 = getelementptr inbounds i32, i32* %27, i64 %23
%40 = load i32, i32* %39
%41 = icmp eq i32 %40, 1
%42 = zext i1 %41 to i32
%43 = add nuw nsw i64 %16, 1
%44 = getelementptr inbounds i32*, i32** %0, i64 %43
%45 = load i32*, i32** %44
%46 = getelementptr inbounds i32, i32* %45, i64 %15
%47 = load i32, i32* %46
%48 = icmp eq i32 %47, 1
%49 = zext i1 %48 to i32
%50 = bitcast <4 x i1> %34 to i4
%51 = call i4 @llvm.ctpop.i4(i4 %50)
%52 = zext i4 %51 to i32
%53 = add nuw nsw i32 %52, %38
%54 = add nuw nsw i32 %53, %42
%55 = add nuw nsw i32 %54, %49
%56 = getelementptr inbounds i32, i32* %45, i64 %14
%57 = load i32, i32* %56
%58 = icmp eq i32 %57, 1
%59 = zext i1 %58 to i32
%60 = add nuw nsw i32 %55, %59
%61 = getelementptr inbounds i32, i32* %45, i64 %23
%62 = load i32, i32* %61
%63 = icmp eq i32 %62, 1
%64 = zext i1 %63 to i32
%65 = add nuw nsw i32 %60, %64
br label %66
66: ; preds = %13, %7, %5
%67 = phi i32 [ 0, %7 ], [ 0, %5 ], [ %65, %13 ]
%68 = icmp eq i32 %2, 0
%69 = icmp eq i32 %1, 0
%70 = or i32 %2, %1
%71 = icmp eq i32 %70, 0
br i1 %71, label %72, label %86
72: ; preds = %66
%73 = bitcast i32** %0 to <2 x i32>**
%74 = load <2 x i32>*, <2 x i32>** %73
%75 = load <2 x i32>, <2 x i32>* %74
%76 = getelementptr inbounds i32*, i32** %0, i64 1
%77 = bitcast i32** %76 to <2 x i32>**
%78 = load <2 x i32>*, <2 x i32>** %77
%79 = load <2 x i32>, <2 x i32>* %78
%80 = shufflevector <2 x i32> %75, <2 x i32> %79, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%81 = icmp eq <4 x i32> %80, <i32 1, i32 1, i32 1, i32 1>
%82 = bitcast <4 x i1> %81 to i4
%83 = call i4 @llvm.ctpop.i4(i4 %82)
%84 = zext i4 %83 to i32
%85 = add nuw nsw i32 %67, %84
br label %86
86: ; preds = %72, %66
%87 = phi i32 [ %67, %66 ], [ %85, %72 ]
%88 = icmp eq i32 %1, %3
%89 = and i1 %68, %88
br i1 %89, label %90, label %107
90: ; preds = %86
%91 = sext i32 %1 to i64
%92 = add nsw i64 %91, -1
%93 = getelementptr inbounds i32*, i32** %0, i64 %92
%94 = bitcast i32** %93 to <2 x i32>**
%95 = load <2 x i32>*, <2 x i32>** %94
%96 = load <2 x i32>, <2 x i32>* %95
%97 = getelementptr inbounds i32*, i32** %0, i64 %91
%98 = bitcast i32** %97 to <2 x i32>**
%99 = load <2 x i32>*, <2 x i32>** %98
%100 = load <2 x i32>, <2 x i32>* %99
%101 = shufflevector <2 x i32> %96, <2 x i32> %100, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%102 = icmp eq <4 x i32> %101, <i32 1, i32 1, i32 1, i32 1>
%103 = bitcast <4 x i1> %102 to i4
%104 = call i4 @llvm.ctpop.i4(i4 %103)
%105 = zext i4 %104 to i32
%106 = add nuw nsw i32 %87, %105
br label %107
107: ; preds = %90, %86
%108 = phi i32 [ %87, %86 ], [ %106, %90 ]
%109 = icmp eq i32 %2, %4
%110 = and i1 %69, %109
br i1 %110, label %111, label %129
111: ; preds = %107
%112 = sext i32 %2 to i64
%113 = add nsw i64 %112, -1
%114 = load i32*, i32** %0
%115 = getelementptr inbounds i32, i32* %114, i64 %113
%116 = bitcast i32* %115 to <2 x i32>*
%117 = load <2 x i32>, <2 x i32>* %116
%118 = getelementptr inbounds i32*, i32** %0, i64 1
%119 = load i32*, i32** %118
%120 = getelementptr inbounds i32, i32* %119, i64 %113
%121 = bitcast i32* %120 to <2 x i32>*
%122 = load <2 x i32>, <2 x i32>* %121
%123 = shufflevector <2 x i32> %117, <2 x i32> %122, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%124 = icmp eq <4 x i32> %123, <i32 1, i32 1, i32 1, i32 1>
%125 = bitcast <4 x i1> %124 to i4
%126 = call i4 @llvm.ctpop.i4(i4 %125)
%127 = zext i4 %126 to i32
%128 = add nuw nsw i32 %108, %127
br label %129
129: ; preds = %111, %107
%130 = phi i32 [ %108, %107 ], [ %128, %111 ]
%131 = and i1 %88, %109
br i1 %131, label %132, label %153
132: ; preds = %129
%133 = sext i32 %2 to i64
%134 = add nsw i64 %133, -1
%135 = sext i32 %1 to i64
%136 = add nsw i64 %135, -1
%137 = getelementptr inbounds i32*, i32** %0, i64 %136
%138 = load i32*, i32** %137
%139 = getelementptr inbounds i32, i32* %138, i64 %134
%140 = bitcast i32* %139 to <2 x i32>*
%141 = load <2 x i32>, <2 x i32>* %140
%142 = getelementptr inbounds i32*, i32** %0, i64 %135
%143 = load i32*, i32** %142
%144 = getelementptr inbounds i32, i32* %143, i64 %134
%145 = bitcast i32* %144 to <2 x i32>*
%146 = load <2 x i32>, <2 x i32>* %145
%147 = shufflevector <2 x i32> %141, <2 x i32> %146, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%148 = icmp eq <4 x i32> %147, <i32 1, i32 1, i32 1, i32 1>
%149 = bitcast <4 x i1> %148 to i4
%150 = call i4 @llvm.ctpop.i4(i4 %149)
%151 = zext i4 %150 to i32
%152 = add nuw nsw i32 %130, %151
br label %153
153: ; preds = %132, %129
%154 = phi i32 [ %130, %129 ], [ %152, %132 ]
%155 = and i1 %6, %88
%156 = icmp slt i32 %2, %4
%157 = and i1 %155, %156
br i1 %157, label %158, label %194
158: ; preds = %153
%159 = zext i32 %2 to i64
%160 = add nsw i64 %159, -1
%161 = sext i32 %1 to i64
%162 = add nsw i64 %161, -1
%163 = getelementptr inbounds i32*, i32** %0, i64 %162
%164 = load i32*, i32** %163
%165 = getelementptr inbounds i32, i32* %164, i64 %160
%166 = load i32, i32* %165
%167 = getelementptr inbounds i32, i32* %164, i64 %159
%168 = add nuw nsw i64 %159, 1
%169 = bitcast i32* %167 to <2 x i32>*
%170 = load <2 x i32>, <2 x i32>* %169
%171 = getelementptr inbounds i32*, i32** %0, i64 %161
%172 = load i32*, i32** %171
%173 = getelementptr inbounds i32, i32* %172, i64 %160
%174 = load i32, i32* %173
%175 = insertelement <4 x i32> poison, i32 %166, i64 0
%176 = shufflevector <2 x i32> %170, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
%177 = shufflevector <4 x i32> %175, <4 x i32> %176, <4 x i32> <i32 0, i32 4, i32 5, i32 undef>
%178 = insertelement <4 x i32> %177, i32 %174, i64 3
%179 = icmp eq <4 x i32> %178, <i32 1, i32 1, i32 1, i32 1>
%180 = getelementptr inbounds i32, i32* %172, i64 %159
%181 = load i32, i32* %180
%182 = icmp eq i32 %181, 1
%183 = zext i1 %182 to i32
%184 = getelementptr inbounds i32, i32* %172, i64 %168
%185 = load i32, i32* %184
%186 = icmp eq i32 %185, 1
%187 = zext i1 %186 to i32
%188 = bitcast <4 x i1> %179 to i4
%189 = call i4 @llvm.ctpop.i4(i4 %188)
%190 = zext i4 %189 to i32
%191 = add nuw nsw i32 %190, %183
%192 = add nuw nsw i32 %191, %187
%193 = add nuw nsw i32 %192, %154
br label %194
194: ; preds = %158, %153
%195 = phi i32 [ %154, %153 ], [ %193, %158 ]
%196 = and i1 %69, %6
%197 = and i1 %196, %156
br i1 %197, label %198, label %232
198: ; preds = %194
%199 = zext i32 %2 to i64
%200 = add nsw i64 %199, -1
%201 = load i32*, i32** %0
%202 = getelementptr inbounds i32, i32* %201, i64 %200
%203 = load i32, i32* %202
%204 = getelementptr inbounds i32, i32* %201, i64 %199
%205 = add nuw nsw i64 %199, 1
%206 = bitcast i32* %204 to <2 x i32>*
%207 = load <2 x i32>, <2 x i32>* %206
%208 = getelementptr inbounds i32*, i32** %0, i64 1
%209 = load i32*, i32** %208
%210 = getelementptr inbounds i32, i32* %209, i64 %200
%211 = load i32, i32* %210
%212 = insertelement <4 x i32> poison, i32 %203, i64 0
%213 = shufflevector <2 x i32> %207, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
%214 = shufflevector <4 x i32> %212, <4 x i32> %213, <4 x i32> <i32 0, i32 4, i32 5, i32 undef>
%215 = insertelement <4 x i32> %214, i32 %211, i64 3
%216 = icmp eq <4 x i32> %215, <i32 1, i32 1, i32 1, i32 1>
%217 = getelementptr inbounds i32, i32* %209, i64 %199
%218 = load i32, i32* %217
%219 = icmp eq i32 %218, 1
%220 = zext i1 %219 to i32
%221 = getelementptr inbounds i32, i32* %209, i64 %205
%222 = load i32, i32* %221
%223 = icmp eq i32 %222, 1
%224 = zext i1 %223 to i32
%225 = bitcast <4 x i1> %216 to i4
%226 = call i4 @llvm.ctpop.i4(i4 %225)
%227 = zext i4 %226 to i32
%228 = add nuw nsw i32 %227, %220
%229 = add nuw nsw i32 %228, %224
%230 = add nuw nsw i32 %229, %195
%231 = icmp slt i32 %1, %3
br label %266
232: ; preds = %194
%233 = icmp sgt i32 %1, 0
%234 = and i1 %233, %68
%235 = icmp slt i32 %1, %3
%236 = and i1 %234, %235
br i1 %236, label %237, label %266
237: ; preds = %232
%238 = zext i32 %1 to i64
%239 = add nsw i64 %238, -1
%240 = getelementptr inbounds i32*, i32** %0, i64 %239
%241 = bitcast i32** %240 to <2 x i32>**
%242 = load <2 x i32>*, <2 x i32>** %241
%243 = load <2 x i32>, <2 x i32>* %242
%244 = getelementptr inbounds i32*, i32** %0, i64 %238
%245 = bitcast i32** %244 to <2 x i32>**
%246 = load <2 x i32>*, <2 x i32>** %245
%247 = load <2 x i32>, <2 x i32>* %246
%248 = shufflevector <2 x i32> %243, <2 x i32> %247, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%249 = icmp eq <4 x i32> %248, <i32 1, i32 1, i32 1, i32 1>
%250 = add nuw nsw i64 %238, 1
%251 = getelementptr inbounds i32*, i32** %0, i64 %250
%252 = load i32*, i32** %251
%253 = load i32, i32* %252
%254 = icmp eq i32 %253, 1
%255 = zext i1 %254 to i32
%256 = getelementptr inbounds i32, i32* %252, i64 1
%257 = load i32, i32* %256
%258 = icmp eq i32 %257, 1
%259 = zext i1 %258 to i32
%260 = bitcast <4 x i1> %249 to i4
%261 = call i4 @llvm.ctpop.i4(i4 %260)
%262 = zext i4 %261 to i32
%263 = add nuw nsw i32 %262, %255
%264 = add nuw nsw i32 %263, %259
%265 = add nuw nsw i32 %264, %195
br label %266
266: ; preds = %198, %237, %232
%267 = phi i1 [ %235, %232 ], [ %235, %237 ], [ %231, %198 ]
%268 = phi i1 [ %233, %232 ], [ %233, %237 ], [ false, %198 ]
%269 = phi i32 [ %195, %232 ], [ %265, %237 ], [ %230, %198 ]
%270 = and i1 %268, %109
%271 = and i1 %267, %270
br i1 %271, label %279, label %272
272: ; preds = %266
%273 = sext i32 %1 to i64
%274 = getelementptr inbounds i32*, i32** %0, i64 %273
%275 = load i32*, i32** %274
%276 = sext i32 %2 to i64
%277 = getelementptr inbounds i32, i32* %275, i64 %276
%278 = load i32, i32* %277
br label %314
279: ; preds = %266
%280 = sext i32 %2 to i64
%281 = add nsw i64 %280, -1
%282 = sext i32 %1 to i64
%283 = add nsw i64 %282, -1
%284 = getelementptr inbounds i32*, i32** %0, i64 %283
%285 = load i32*, i32** %284
%286 = getelementptr inbounds i32, i32* %285, i64 %281
%287 = bitcast i32* %286 to <2 x i32>*
%288 = load <2 x i32>, <2 x i32>* %287
%289 = getelementptr inbounds i32*, i32** %0, i64 %282
%290 = load i32*, i32** %289
%291 = getelementptr inbounds i32, i32* %290, i64 %281
%292 = bitcast i32* %291 to <2 x i32>*
%293 = load <2 x i32>, <2 x i32>* %292
%294 = shufflevector <2 x i32> %288, <2 x i32> %293, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%295 = icmp eq <4 x i32> %294, <i32 1, i32 1, i32 1, i32 1>
%296 = add nsw i64 %282, 1
%297 = getelementptr inbounds i32*, i32** %0, i64 %296
%298 = load i32*, i32** %297
%299 = getelementptr inbounds i32, i32* %298, i64 %281
%300 = load i32, i32* %299
%301 = icmp eq i32 %300, 1
%302 = zext i1 %301 to i32
%303 = getelementptr inbounds i32, i32* %298, i64 %280
%304 = load i32, i32* %303
%305 = icmp eq i32 %304, 1
%306 = zext i1 %305 to i32
%307 = bitcast <4 x i1> %295 to i4
%308 = call i4 @llvm.ctpop.i4(i4 %307)
%309 = zext i4 %308 to i32
%310 = add nuw nsw i32 %309, %302
%311 = add nuw nsw i32 %310, %306
%312 = add nuw nsw i32 %311, %269
%313 = extractelement <2 x i32> %293, i64 1
br label %314
314: ; preds = %272, %279
%315 = phi i32 [ %278, %272 ], [ %313, %279 ]
%316 = phi i32 [ %269, %272 ], [ %312, %279 ]
%317 = icmp eq i32 %315, 1
%318 = sext i1 %317 to i32
%319 = add nsw i32 %316, %318
ret i32 %319
}