void filtre_2_opt(char *data, int largeur, int hauteur, char *data_sortie) {
  int cpt_out, tmp_i;
  int x, y;
  unsigned char *pt0, *pt1, *pt2, *pt3, *pt4, *pt5, *pt6, *pt7, *pt8;
  int coef[9];
  int alpha, beta;
  unsigned int op_a, op_b;
  coef[0] = -1;
  coef[1] = -1;
  coef[2] = 0;
  coef[3] = -1;
  coef[4] = 0;
  coef[5] = +1;
  coef[6] = 0;
  coef[7] = +1;
  coef[8] = +1;
  alpha = 1;
  beta = 128;
  cpt_out = 0;
  for (y = 1; y < hauteur - 1; y++) {
    pt0 = data + 0 + largeur * (y - 1);
    pt1 = data + 1 + largeur * (y - 1);
    pt2 = data + 2 + largeur * (y - 1);
    pt3 = data + 0 + largeur * (y);
    pt4 = data + 1 + largeur * (y);
    pt5 = data + 2 + largeur * (y);
    pt6 = data + 0 + largeur * (y + 1);
    pt7 = data + 1 + largeur * (y + 1);
    pt8 = data + 2 + largeur * (y + 1);
    for (x = 1; x < largeur - 1; x++) {
      tmp_i = -1 * (*pt0) - 1 * (*pt1) - 1 * (*pt3) + (*pt5) + (*pt7) + (*pt8) +
              128;
      pt0++;
      pt1++;
      pt2++;
      pt3++;
      pt4++;
      pt5++;
      pt6++;
      pt7++;
      pt8++;
      if (tmp_i > 255)
        data_sortie[cpt_out] = 255;
      else if (tmp_i < 0)
        data_sortie[cpt_out] = 0;
      else
        data_sortie[cpt_out] = (unsigned char)tmp_i;
      cpt_out++;
    }
  }
}


x86 assembly (clang, -O0):
<filtre_2_opt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movl   $0xffffffff,-0xa0(%rbp)
ff ff ff
movl   $0xffffffff,-0x9c(%rbp)
ff ff ff
movl   $0x0,-0x98(%rbp)
movl   $0xffffffff,-0x94(%rbp)
ff ff ff
movl   $0x0,-0x90(%rbp)
movl   $0x1,-0x8c(%rbp)
movl   $0x0,-0x88(%rbp)
movl   $0x1,-0x84(%rbp)
movl   $0x1,-0x80(%rbp)
movl   $0x1,-0xa4(%rbp)
movl   $0x80,-0xa8(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13d7 <filtre_2_opt+0x2d7>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    -0xc(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    -0xc(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
add    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
add    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    -0xc(%rbp),%ecx
mov    -0x28(%rbp),%edx
add    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13c4 <filtre_2_opt+0x2c4>
mov    -0x30(%rbp),%rax
movzbl (%rax),%eax
imul   $0xffffffff,%eax,%eax
mov    -0x38(%rbp),%rcx
movzbl (%rcx),%ecx
shl    $0x0,%ecx
sub    %ecx,%eax
mov    -0x48(%rbp),%rcx
movzbl (%rcx),%ecx
shl    $0x0,%ecx
sub    %ecx,%eax
mov    -0x58(%rbp),%rcx
movzbl (%rcx),%ecx
add    %ecx,%eax
mov    -0x68(%rbp),%rcx
movzbl (%rcx),%ecx
add    %ecx,%eax
mov    -0x70(%rbp),%rcx
movzbl (%rcx),%ecx
add    %ecx,%eax
add    $0x80,%eax
mov    %eax,-0x20(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
mov    -0x60(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x68(%rbp)
mov    -0x70(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x70(%rbp)
cmpl   $0xff,-0x20(%rbp)
jle    137d <filtre_2_opt+0x27d>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0xff,(%rax,%rcx,1)
jmp    13ad <filtre_2_opt+0x2ad>
cmpl   $0x0,-0x20(%rbp)
jge    1398 <filtre_2_opt+0x298>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    13a8 <filtre_2_opt+0x2a8>
mov    -0x20(%rbp),%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    13ad <filtre_2_opt+0x2ad>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    129a <filtre_2_opt+0x19a>
jmp    13c9 <filtre_2_opt+0x2c9>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    118f <filtre_2_opt+0x8f>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<filtre_2_opt>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %rcx,-0x68(%rsp)
cmp    $0x3,%edx
jl     1640 <filtre_2_opt+0x540>
add    $0xffffffff,%edx
lea    0x1(%rdi),%rax
mov    %rax,0x18(%rsp)
lea    0x2(%rdi),%rax
mov    %rax,0x10(%rsp)
movslq %esi,%rbx
lea    -0x3(%rbx),%eax
lea    0x1(%rax),%rcx
mov    -0x68(%rsp),%rbp
lea    0x1(%rbp,%rax,1),%rbp
mov    %rbp,-0x10(%rsp)
lea    0x1(%rbx,%rbx,1),%rbp
mov    %rbp,-0x18(%rsp)
lea    0x3(%rax,%rbx,2),%rbp
mov    %rbp,-0x20(%rsp)
lea    0x3(%rbx,%rax,1),%rbp
mov    %rbp,-0x28(%rsp)
mov    %rax,(%rsp)
add    $0x2,%rax
mov    %rax,-0x30(%rsp)
mov    %rcx,-0x38(%rsp)
and    $0xfffffffffffffff0,%rcx
mov    %rcx,-0x40(%rsp)
lea    0x1(%rcx),%eax
mov    %eax,-0x5c(%rsp)
lea    (%rdi,%rbx,2),%rbp
add    $0x2,%rbp
lea    0x2(%rbx,%rdi,1),%rax
mov    %rax,-0x48(%rsp)
lea    -0x1(%rbx),%eax
mov    %eax,-0x58(%rsp)
pxor   %xmm12,%xmm12
movdqa 0xe4f(%rip),%xmm9
movdqa 0xe56(%rip),%xmm11
movdqa 0xe5d(%rip),%xmm10
movdqa 0xe64(%rip),%xmm8
xor    %ecx,%ecx
mov    $0x1,%r10d
mov    %rdi,%r12
xor    %r15d,%r15d
mov    %rdi,0x20(%rsp)
mov    %rbx,0x8(%rsp)
mov    %rdx,-0x78(%rsp)
mov    %esi,-0x54(%rsp)
jmp    1229 <filtre_2_opt+0x129>
nop
add    %rax,%rcx
mov    %r15,%rbp
mov    %rcx,%r15
mov    -0x54(%rsp),%esi
mov    0x20(%rsp),%rdi
mov    0x8(%rsp),%rbx
mov    0x30(%rsp),%rcx
mov    0x28(%rsp),%r10
add    $0x1,%rcx
add    %rbx,%rbp
add    %rbx,-0x48(%rsp)
add    %rbx,%r12
cmp    %rdx,%r10
je     1640 <filtre_2_opt+0x540>
mov    %r10,%r14
add    $0x1,%r10
cmp    $0x3,%esi
jl     1211 <filtre_2_opt+0x111>
lea    -0x1(%r14),%r8
imul   %rbx,%r8
imul   %rbx,%r14
mov    %r10,0x28(%rsp)
imul   %rbx,%r10
mov    0x10(%rsp),%rsi
lea    (%rsi,%r10,1),%r9
mov    0x18(%rsp),%rax
add    %rax,%r10
lea    (%rsi,%r14,1),%r13
add    %rdi,%r14
lea    (%rax,%r8,1),%r11
add    %rdi,%r8
movslq %r15d,%r15
mov    $0x1,%esi
cmpl   $0xf,(%rsp)
mov    %rcx,0x30(%rsp)
jae    1290 <filtre_2_opt+0x190>
mov    %r15,%rcx
jmp    15d0 <filtre_2_opt+0x4d0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rbp,-0x50(%rsp)
mov    %rcx,%rsi
imul   %rbx,%rsi
mov    -0x18(%rsp),%rax
add    %rsi,%rax
add    %rdi,%rax
mov    %rax,-0x70(%rsp)
mov    -0x20(%rsp),%rdx
lea    (%rdx,%rsi,1),%rbp
add    %rdi,%rbp
add    %rsi,%rbx
add    %rdi,%rbx
mov    -0x28(%rsp),%rdx
add    %rsi,%rdx
add    %rdi,%rdx
lea    (%rdi,%rsi,1),%rax
mov    %rax,-0x8(%rsp)
add    -0x30(%rsp),%rsi
add    %rdi,%rsi
mov    -0x68(%rsp),%rcx
lea    (%rcx,%r15,1),%rax
cmp    %rbp,%rax
mov    -0x10(%rsp),%rdi
lea    (%rdi,%r15,1),%rbp
setb   -0x79(%rsp)
cmp    %rbp,-0x70(%rsp)
setb   %cl
cmp    %rdx,%rax
setb   %dil
cmp    %rbp,%rbx
setb   %dl
mov    %rax,-0x70(%rsp)
cmp    %rsi,%rax
setb   %bl
cmp    %rbp,-0x8(%rsp)
setb   %al
test   %cl,-0x79(%rsp)
mov    %r15,%rcx
jne    15b7 <filtre_2_opt+0x4b7>
and    %dl,%dil
mov    -0x78(%rsp),%rdx
mov    -0x50(%rsp),%rbp
mov    $0x1,%esi
jne    15d0 <filtre_2_opt+0x4d0>
and    %al,%bl
jne    15d0 <filtre_2_opt+0x4d0>
mov    -0x40(%rsp),%rax
add    %rax,%rcx
mov    %rcx,%rsi
add    %rax,%r8
add    %rax,%r11
add    %rax,%r14
add    %rax,%r13
add    %rax,%r10
add    %rax,%r9
xor    %r15d,%r15d
mov    -0x48(%rsp),%rcx
mov    -0x70(%rsp),%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%r12,%r15,1),%xmm0
movdqu 0x1(%r12,%r15,1),%xmm1
movdqa %xmm0,%xmm4
punpckhbw %xmm12,%xmm4
movdqa %xmm4,%xmm5
punpckhwd %xmm12,%xmm5
punpcklwd %xmm12,%xmm4
punpcklbw %xmm12,%xmm0
movdqa %xmm0,%xmm6
punpckhwd %xmm12,%xmm6
punpcklwd %xmm12,%xmm0
movdqa %xmm1,%xmm2
punpckhbw %xmm12,%xmm2
movdqa %xmm2,%xmm3
punpckhwd %xmm12,%xmm3
paddd  %xmm5,%xmm3
punpcklwd %xmm12,%xmm2
paddd  %xmm4,%xmm2
punpcklbw %xmm12,%xmm1
movdqa %xmm1,%xmm7
punpckhwd %xmm12,%xmm7
paddd  %xmm6,%xmm7
punpcklwd %xmm12,%xmm1
paddd  %xmm0,%xmm1
movdqu -0x2(%rcx,%r15,1),%xmm0
movdqu (%rcx,%r15,1),%xmm15
movdqa %xmm0,%xmm5
punpcklbw %xmm12,%xmm5
movdqa %xmm5,%xmm4
punpcklwd %xmm12,%xmm4
paddd  %xmm1,%xmm4
punpckhwd %xmm12,%xmm5
paddd  %xmm7,%xmm5
punpckhbw %xmm12,%xmm0
movdqa %xmm0,%xmm7
punpcklwd %xmm12,%xmm7
paddd  %xmm2,%xmm7
punpckhwd %xmm12,%xmm0
paddd  %xmm3,%xmm0
movdqa %xmm15,%xmm1
punpckhbw %xmm12,%xmm1
movdqa %xmm1,%xmm2
punpckhwd %xmm12,%xmm2
psubd  %xmm0,%xmm2
punpcklwd %xmm12,%xmm1
psubd  %xmm7,%xmm1
punpcklbw %xmm12,%xmm15
movdqa %xmm15,%xmm14
punpckhwd %xmm12,%xmm14
psubd  %xmm5,%xmm14
punpcklwd %xmm12,%xmm15
psubd  %xmm4,%xmm15
movdqu -0x1(%rbp,%r15,1),%xmm0
movdqu 0x0(%rbp,%r15,1),%xmm5
movdqa %xmm0,%xmm3
punpcklbw %xmm12,%xmm3
movdqa %xmm3,%xmm13
punpcklwd %xmm12,%xmm13
punpckhwd %xmm12,%xmm3
punpckhbw %xmm12,%xmm0
movdqa %xmm0,%xmm6
punpcklwd %xmm12,%xmm6
punpckhwd %xmm12,%xmm0
movdqa %xmm5,%xmm7
punpckhbw %xmm12,%xmm7
movdqa %xmm7,%xmm4
punpckhwd %xmm12,%xmm4
paddd  %xmm0,%xmm4
paddd  %xmm2,%xmm4
punpcklwd %xmm12,%xmm7
paddd  %xmm6,%xmm7
paddd  %xmm1,%xmm7
punpcklbw %xmm12,%xmm5
movdqa %xmm5,%xmm1
punpckhwd %xmm12,%xmm1
paddd  %xmm3,%xmm1
paddd  %xmm14,%xmm1
punpcklwd %xmm12,%xmm5
paddd  %xmm13,%xmm5
paddd  %xmm15,%xmm5
movdqa %xmm4,%xmm0
pcmpgtd %xmm9,%xmm0
movdqa %xmm7,%xmm3
pcmpgtd %xmm9,%xmm3
packssdw %xmm0,%xmm3
movdqa %xmm1,%xmm0
pcmpgtd %xmm9,%xmm0
movdqa %xmm5,%xmm2
pcmpgtd %xmm9,%xmm2
packssdw %xmm0,%xmm2
packsswb %xmm3,%xmm2
movdqa %xmm11,%xmm0
pcmpgtd %xmm4,%xmm0
movdqa %xmm11,%xmm3
pcmpgtd %xmm7,%xmm3
packssdw %xmm0,%xmm3
movdqa %xmm11,%xmm0
pcmpgtd %xmm1,%xmm0
movdqa %xmm11,%xmm6
pcmpgtd %xmm5,%xmm6
packssdw %xmm0,%xmm6
packsswb %xmm3,%xmm6
pand   %xmm10,%xmm4
pand   %xmm10,%xmm7
packuswb %xmm4,%xmm7
pand   %xmm10,%xmm1
pand   %xmm10,%xmm5
packuswb %xmm1,%xmm5
packuswb %xmm7,%xmm5
pxor   %xmm8,%xmm5
por    %xmm2,%xmm5
pandn  %xmm5,%xmm6
movdqu %xmm6,(%rdx,%r15,1)
add    $0x10,%r15
cmp    %r15,%rax
jne    1380 <filtre_2_opt+0x280>
mov    -0x5c(%rsp),%edi
cmp    %rax,-0x38(%rsp)
mov    -0x78(%rsp),%rdx
mov    %rsi,%rcx
mov    %edi,%esi
je     11f6 <filtre_2_opt+0xf6>
jmp    15d0 <filtre_2_opt+0x4d0>
mov    -0x78(%rsp),%rdx
mov    -0x50(%rsp),%rbp
mov    $0x1,%esi
cs nopw 0x0(%rax,%rax,1)
mov    %rbp,%r15
mov    -0x58(%rsp),%eax
mov    %eax,%ebx
sub    %esi,%ebx
mov    -0x68(%rsp),%rax
lea    (%rax,%rcx,1),%rsi
xor    %eax,%eax
jmp    1606 <filtre_2_opt+0x506>
nopl   0x0(%rax,%rax,1)
xor    $0x80,%bpl
mov    %ebp,%edi
mov    %dil,(%rsi,%rax,1)
add    $0x1,%rax
cmp    %eax,%ebx
je     11f0 <filtre_2_opt+0xf0>
movzbl (%r8,%rax,1),%edi
movzbl (%r11,%rax,1),%ebp
add    %edi,%ebp
movzbl (%r14,%rax,1),%edi
add    %ebp,%edi
movzbl 0x0(%r13,%rax,1),%ebp
sub    %edi,%ebp
movzbl (%r10,%rax,1),%edi
add    %ebp,%edi
movzbl (%r9,%rax,1),%ebp
add    %edi,%ebp
mov    $0xff,%dil
cmp    $0x7f,%ebp
jg     15f6 <filtre_2_opt+0x4f6>
cmp    $0xffffff80,%ebp
jge    15f0 <filtre_2_opt+0x4f0>
xor    %edi,%edi
jmp    15f6 <filtre_2_opt+0x4f6>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @filtre_2_opt(i8* %0, i32 %1, i32 %2, i8* %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i8*
%17 = alloca i8*
%18 = alloca i8*
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca i8*
%22 = alloca [9 x i32]
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i8* %3, i8** %8
%27 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 0
store i32 -1, i32* %27
%28 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 1
store i32 -1, i32* %28
%29 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 2
store i32 0, i32* %29
%30 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 3
store i32 -1, i32* %30
%31 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 4
store i32 0, i32* %31
%32 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 5
store i32 1, i32* %32
%33 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 6
store i32 0, i32* %33
%34 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 7
store i32 1, i32* %34
%35 = getelementptr inbounds [9 x i32], [9 x i32]* %22, i64 0, i64 8
store i32 1, i32* %35
store i32 1, i32* %23
store i32 128, i32* %24
store i32 0, i32* %9
store i32 1, i32* %12
br label %36
36: ; preds = %192, %4
%37 = load i32, i32* %12
%38 = load i32, i32* %7
%39 = sub nsw i32 %38, 1
%40 = icmp slt i32 %37, %39
br i1 %40, label %41, label %195
41: ; preds = %36
%42 = load i8*, i8** %5
%43 = getelementptr inbounds i8, i8* %42, i64 0
%44 = load i32, i32* %6
%45 = load i32, i32* %12
%46 = sub nsw i32 %45, 1
%47 = mul nsw i32 %44, %46
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %43, i64 %48
store i8* %49, i8** %13
%50 = load i8*, i8** %5
%51 = getelementptr inbounds i8, i8* %50, i64 1
%52 = load i32, i32* %6
%53 = load i32, i32* %12
%54 = sub nsw i32 %53, 1
%55 = mul nsw i32 %52, %54
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %51, i64 %56
store i8* %57, i8** %14
%58 = load i8*, i8** %5
%59 = getelementptr inbounds i8, i8* %58, i64 2
%60 = load i32, i32* %6
%61 = load i32, i32* %12
%62 = sub nsw i32 %61, 1
%63 = mul nsw i32 %60, %62
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds i8, i8* %59, i64 %64
store i8* %65, i8** %15
%66 = load i8*, i8** %5
%67 = getelementptr inbounds i8, i8* %66, i64 0
%68 = load i32, i32* %6
%69 = load i32, i32* %12
%70 = mul nsw i32 %68, %69
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %67, i64 %71
store i8* %72, i8** %16
%73 = load i8*, i8** %5
%74 = getelementptr inbounds i8, i8* %73, i64 1
%75 = load i32, i32* %6
%76 = load i32, i32* %12
%77 = mul nsw i32 %75, %76
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i8, i8* %74, i64 %78
store i8* %79, i8** %17
%80 = load i8*, i8** %5
%81 = getelementptr inbounds i8, i8* %80, i64 2
%82 = load i32, i32* %6
%83 = load i32, i32* %12
%84 = mul nsw i32 %82, %83
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %81, i64 %85
store i8* %86, i8** %18
%87 = load i8*, i8** %5
%88 = getelementptr inbounds i8, i8* %87, i64 0
%89 = load i32, i32* %6
%90 = load i32, i32* %12
%91 = add nsw i32 %90, 1
%92 = mul nsw i32 %89, %91
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %88, i64 %93
store i8* %94, i8** %19
%95 = load i8*, i8** %5
%96 = getelementptr inbounds i8, i8* %95, i64 1
%97 = load i32, i32* %6
%98 = load i32, i32* %12
%99 = add nsw i32 %98, 1
%100 = mul nsw i32 %97, %99
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds i8, i8* %96, i64 %101
store i8* %102, i8** %20
%103 = load i8*, i8** %5
%104 = getelementptr inbounds i8, i8* %103, i64 2
%105 = load i32, i32* %6
%106 = load i32, i32* %12
%107 = add nsw i32 %106, 1
%108 = mul nsw i32 %105, %107
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i8, i8* %104, i64 %109
store i8* %110, i8** %21
store i32 1, i32* %11
br label %111
111: ; preds = %188, %41
%112 = load i32, i32* %11
%113 = load i32, i32* %6
%114 = sub nsw i32 %113, 1
%115 = icmp slt i32 %112, %114
br i1 %115, label %116, label %191
116: ; preds = %111
%117 = load i8*, i8** %13
%118 = load i8, i8* %117
%119 = zext i8 %118 to i32
%120 = mul nsw i32 -1, %119
%121 = load i8*, i8** %14
%122 = load i8, i8* %121
%123 = zext i8 %122 to i32
%124 = mul nsw i32 1, %123
%125 = sub nsw i32 %120, %124
%126 = load i8*, i8** %16
%127 = load i8, i8* %126
%128 = zext i8 %127 to i32
%129 = mul nsw i32 1, %128
%130 = sub nsw i32 %125, %129
%131 = load i8*, i8** %18
%132 = load i8, i8* %131
%133 = zext i8 %132 to i32
%134 = add nsw i32 %130, %133
%135 = load i8*, i8** %20
%136 = load i8, i8* %135
%137 = zext i8 %136 to i32
%138 = add nsw i32 %134, %137
%139 = load i8*, i8** %21
%140 = load i8, i8* %139
%141 = zext i8 %140 to i32
%142 = add nsw i32 %138, %141
%143 = add nsw i32 %142, 128
store i32 %143, i32* %10
%144 = load i8*, i8** %13
%145 = getelementptr inbounds i8, i8* %144, i32 1
store i8* %145, i8** %13
%146 = load i8*, i8** %14
%147 = getelementptr inbounds i8, i8* %146, i32 1
store i8* %147, i8** %14
%148 = load i8*, i8** %15
%149 = getelementptr inbounds i8, i8* %148, i32 1
store i8* %149, i8** %15
%150 = load i8*, i8** %16
%151 = getelementptr inbounds i8, i8* %150, i32 1
store i8* %151, i8** %16
%152 = load i8*, i8** %17
%153 = getelementptr inbounds i8, i8* %152, i32 1
store i8* %153, i8** %17
%154 = load i8*, i8** %18
%155 = getelementptr inbounds i8, i8* %154, i32 1
store i8* %155, i8** %18
%156 = load i8*, i8** %19
%157 = getelementptr inbounds i8, i8* %156, i32 1
store i8* %157, i8** %19
%158 = load i8*, i8** %20
%159 = getelementptr inbounds i8, i8* %158, i32 1
store i8* %159, i8** %20
%160 = load i8*, i8** %21
%161 = getelementptr inbounds i8, i8* %160, i32 1
store i8* %161, i8** %21
%162 = load i32, i32* %10
%163 = icmp sgt i32 %162, 255
br i1 %163, label %164, label %169
164: ; preds = %116
%165 = load i8*, i8** %8
%166 = load i32, i32* %9
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i8, i8* %165, i64 %167
store i8 -1, i8* %168
br label %185
169: ; preds = %116
%170 = load i32, i32* %10
%171 = icmp slt i32 %170, 0
br i1 %171, label %172, label %177
172: ; preds = %169
%173 = load i8*, i8** %8
%174 = load i32, i32* %9
%175 = sext i32 %174 to i64
%176 = getelementptr inbounds i8, i8* %173, i64 %175
store i8 0, i8* %176
br label %184
177: ; preds = %169
%178 = load i32, i32* %10
%179 = trunc i32 %178 to i8
%180 = load i8*, i8** %8
%181 = load i32, i32* %9
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds i8, i8* %180, i64 %182
store i8 %179, i8* %183
br label %184
184: ; preds = %177, %172
br label %185
185: ; preds = %184, %164
%186 = load i32, i32* %9
%187 = add nsw i32 %186, 1
store i32 %187, i32* %9
br label %188
188: ; preds = %185
%189 = load i32, i32* %11
%190 = add nsw i32 %189, 1
store i32 %190, i32* %11
br label %111
191: ; preds = %111
br label %192
192: ; preds = %191
%193 = load i32, i32* %12
%194 = add nsw i32 %193, 1
store i32 %194, i32* %12
br label %36
195: ; preds = %36
ret void
}

LLVM IR (-O2):
define void @filtre_2_opt(i8* nocapture %0, i32 %1, i32 %2, i8* nocapture writeonly %3) {
%5 = icmp sgt i32 %2, 2
br i1 %5, label %6, label %187
6: ; preds = %4
%7 = add nsw i32 %2, -1
%8 = getelementptr inbounds i8, i8* %0, i64 1
%9 = getelementptr inbounds i8, i8* %0, i64 2
%10 = add i32 %1, -1
%11 = icmp sgt i32 %1, 2
%12 = sext i32 %1 to i64
%13 = zext i32 %7 to i64
%14 = add i32 %1, -3
%15 = zext i32 %14 to i64
%16 = add nuw nsw i64 %15, 1
%17 = getelementptr i8, i8* %3, i64 %16
%18 = shl nsw i64 %12, 1
%19 = or i64 %18, 1
%20 = add nsw i64 %18, %15
%21 = add nsw i64 %20, 3
%22 = add nsw i64 %12, %15
%23 = add nsw i64 %22, 3
%24 = add nuw nsw i64 %15, 2
%25 = add i32 %1, -3
%26 = zext i32 %25 to i64
%27 = add nuw nsw i64 %26, 1
%28 = icmp ult i32 %25, 15
%29 = and i64 %27, 8589934576
%30 = trunc i64 %29 to i32
%31 = or i32 %30, 1
%32 = icmp eq i64 %27, %29
br label %40
33: ; preds = %181, %133
%34 = phi i64 [ %84, %133 ], [ %184, %181 ]
%35 = trunc i64 %34 to i32
br label %36
36: ; preds = %33, %40
%37 = phi i32 [ %43, %40 ], [ %35, %33 ]
%38 = icmp eq i64 %59, %13
%39 = add i64 %41, 1
br i1 %38, label %187, label %40
40: ; preds = %6, %36
%41 = phi i64 [ 0, %6 ], [ %39, %36 ]
%42 = phi i64 [ 1, %6 ], [ %59, %36 ]
%43 = phi i32 [ 0, %6 ], [ %37, %36 ]
%44 = mul i64 %41, %12
%45 = add i64 %19, %44
%46 = getelementptr i8, i8* %0, i64 %45
%47 = add i64 %21, %44
%48 = getelementptr i8, i8* %0, i64 %47
%49 = add i64 %44, %12
%50 = getelementptr i8, i8* %0, i64 %49
%51 = add i64 %23, %44
%52 = getelementptr i8, i8* %0, i64 %51
%53 = getelementptr i8, i8* %0, i64 %44
%54 = add i64 %24, %44
%55 = getelementptr i8, i8* %0, i64 %54
%56 = add nsw i64 %42, -1
%57 = mul nsw i64 %56, %12
%58 = mul nsw i64 %42, %12
%59 = add nuw nsw i64 %42, 1
%60 = mul nsw i64 %59, %12
br i1 %11, label %61, label %36
61: ; preds = %40
%62 = getelementptr inbounds i8, i8* %9, i64 %60
%63 = getelementptr inbounds i8, i8* %8, i64 %60
%64 = getelementptr inbounds i8, i8* %9, i64 %58
%65 = getelementptr inbounds i8, i8* %0, i64 %58
%66 = getelementptr inbounds i8, i8* %8, i64 %57
%67 = getelementptr inbounds i8, i8* %0, i64 %57
%68 = sext i32 %43 to i64
br i1 %28, label %134, label %69
69: ; preds = %61
%70 = getelementptr i8, i8* %3, i64 %68
%71 = getelementptr i8, i8* %17, i64 %68
%72 = icmp ult i8* %70, %48
%73 = icmp ult i8* %46, %71
%74 = and i1 %72, %73
%75 = icmp ult i8* %70, %52
%76 = icmp ult i8* %50, %71
%77 = and i1 %75, %76
%78 = or i1 %74, %77
%79 = icmp ult i8* %70, %55
%80 = icmp ult i8* %53, %71
%81 = and i1 %79, %80
%82 = or i1 %78, %81
br i1 %82, label %134, label %83
83: ; preds = %69
%84 = add nsw i64 %29, %68
%85 = getelementptr i8, i8* %67, i64 %29
%86 = getelementptr i8, i8* %66, i64 %29
%87 = getelementptr i8, i8* %65, i64 %29
%88 = getelementptr i8, i8* %64, i64 %29
%89 = getelementptr i8, i8* %63, i64 %29
%90 = getelementptr i8, i8* %62, i64 %29
br label %91
91: ; preds = %91, %83
%92 = phi i64 [ 0, %83 ], [ %131, %91 ]
%93 = add i64 %92, %68
%94 = getelementptr i8, i8* %67, i64 %92
%95 = getelementptr i8, i8* %66, i64 %92
%96 = getelementptr i8, i8* %65, i64 %92
%97 = getelementptr i8, i8* %64, i64 %92
%98 = getelementptr i8, i8* %63, i64 %92
%99 = getelementptr i8, i8* %62, i64 %92
%100 = bitcast i8* %94 to <16 x i8>*
%101 = load <16 x i8>, <16 x i8>* %100
%102 = zext <16 x i8> %101 to <16 x i32>
%103 = bitcast i8* %95 to <16 x i8>*
%104 = load <16 x i8>, <16 x i8>* %103
%105 = zext <16 x i8> %104 to <16 x i32>
%106 = bitcast i8* %96 to <16 x i8>*
%107 = load <16 x i8>, <16 x i8>* %106
%108 = zext <16 x i8> %107 to <16 x i32>
%109 = bitcast i8* %97 to <16 x i8>*
%110 = load <16 x i8>, <16 x i8>* %109
%111 = zext <16 x i8> %110 to <16 x i32>
%112 = add nuw nsw <16 x i32> %105, %102
%113 = add nuw nsw <16 x i32> %112, %108
%114 = sub nsw <16 x i32> %111, %113
%115 = bitcast i8* %98 to <16 x i8>*
%116 = load <16 x i8>, <16 x i8>* %115
%117 = zext <16 x i8> %116 to <16 x i32>
%118 = add nsw <16 x i32> %114, %117
%119 = bitcast i8* %99 to <16 x i8>*
%120 = load <16 x i8>, <16 x i8>* %119
%121 = zext <16 x i8> %120 to <16 x i32>
%122 = add nsw <16 x i32> %118, %121
%123 = icmp sgt <16 x i32> %122, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
%124 = icmp slt <16 x i32> %122, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
%125 = trunc <16 x i32> %122 to <16 x i8>
%126 = xor <16 x i8> %125, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
%127 = select <16 x i1> %123, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %126
%128 = select <16 x i1> %124, <16 x i8> zeroinitializer, <16 x i8> %127
%129 = getelementptr inbounds i8, i8* %3, i64 %93
%130 = bitcast i8* %129 to <16 x i8>*
store <16 x i8> %128, <16 x i8>* %130
%131 = add nuw i64 %92, 16
%132 = icmp eq i64 %131, %29
br i1 %132, label %133, label %91
133: ; preds = %91
br i1 %32, label %33, label %134
134: ; preds = %69, %61, %133
%135 = phi i64 [ %68, %69 ], [ %68, %61 ], [ %84, %133 ]
%136 = phi i32 [ 1, %69 ], [ 1, %61 ], [ %31, %133 ]
%137 = phi i8* [ %67, %69 ], [ %67, %61 ], [ %85, %133 ]
%138 = phi i8* [ %66, %69 ], [ %66, %61 ], [ %86, %133 ]
%139 = phi i8* [ %65, %69 ], [ %65, %61 ], [ %87, %133 ]
%140 = phi i8* [ %64, %69 ], [ %64, %61 ], [ %88, %133 ]
%141 = phi i8* [ %63, %69 ], [ %63, %61 ], [ %89, %133 ]
%142 = phi i8* [ %62, %69 ], [ %62, %61 ], [ %90, %133 ]
br label %143
143: ; preds = %134, %181
%144 = phi i64 [ %184, %181 ], [ %135, %134 ]
%145 = phi i32 [ %185, %181 ], [ %136, %134 ]
%146 = phi i8* [ %169, %181 ], [ %137, %134 ]
%147 = phi i8* [ %170, %181 ], [ %138, %134 ]
%148 = phi i8* [ %171, %181 ], [ %139, %134 ]
%149 = phi i8* [ %172, %181 ], [ %140, %134 ]
%150 = phi i8* [ %173, %181 ], [ %141, %134 ]
%151 = phi i8* [ %174, %181 ], [ %142, %134 ]
%152 = load i8, i8* %146
%153 = zext i8 %152 to i32
%154 = load i8, i8* %147
%155 = zext i8 %154 to i32
%156 = load i8, i8* %148
%157 = zext i8 %156 to i32
%158 = load i8, i8* %149
%159 = zext i8 %158 to i32
%160 = add nuw nsw i32 %155, %153
%161 = add nuw nsw i32 %160, %157
%162 = sub nsw i32 %159, %161
%163 = load i8, i8* %150
%164 = zext i8 %163 to i32
%165 = add nsw i32 %162, %164
%166 = load i8, i8* %151
%167 = zext i8 %166 to i32
%168 = add nsw i32 %165, %167
%169 = getelementptr inbounds i8, i8* %146, i64 1
%170 = getelementptr inbounds i8, i8* %147, i64 1
%171 = getelementptr inbounds i8, i8* %148, i64 1
%172 = getelementptr inbounds i8, i8* %149, i64 1
%173 = getelementptr inbounds i8, i8* %150, i64 1
%174 = getelementptr inbounds i8, i8* %151, i64 1
%175 = icmp sgt i32 %168, 127
br i1 %175, label %181, label %176
176: ; preds = %143
%177 = icmp slt i32 %168, -128
br i1 %177, label %181, label %178
178: ; preds = %176
%179 = trunc i32 %168 to i8
%180 = xor i8 %179, -128
br label %181
181: ; preds = %176, %143, %178
%182 = phi i8 [ %180, %178 ], [ -1, %143 ], [ 0, %176 ]
%183 = getelementptr inbounds i8, i8* %3, i64 %144
store i8 %182, i8* %183
%184 = add nsw i64 %144, 1
%185 = add nuw nsw i32 %145, 1
%186 = icmp eq i32 %185, %10
br i1 %186, label %33, label %143
187: ; preds = %36, %4
ret void
}