void gaussian5x5int(unsigned char *out, unsigned char *in, int w, int h) {
  int i, j, k;
  unsigned char *tmp;
  tmp = (unsigned char *)malloc(w * h * sizeof(unsigned char));
  int coef[5] = {62, 248, 392, 248, 62};
  int accu;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      if (j > 1 && j < w - 2) {
        accu = 0;
        for (k = -2; k <= +2; k++) {
          accu += (int)(in[i * w + j + k]) * coef[k + 2];
        }
        tmp[i * w + j] = (unsigned char)(accu >> 10);
      } else {
        tmp[i * w + j] = in[i * w + j];
      }
    }
  }
  for (i = 0; i < h; i++) {
    if (i > 1 && i < h - 2) {
      for (j = 0; j < w; j++) {
        accu = 0;
        for (k = -2; k <= +2; k++) {
          accu += (int)(tmp[(i + k) * w + j]) * coef[k + 2];
        }
        out[i * w + j] = (unsigned char)(accu >> 10);
      }
    } else {
      for (j = 0; j < w; j++) {
        out[i * w + j] = tmp[i * w + j];
      }
    }
  }
  free(tmp);
}


x86 assembly (clang, -O0):
<gaussian5x5int>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
movslq %eax,%rdi
shl    $0x0,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x30(%rbp)
mov    0xeac(%rip),%rax
mov    %rax,-0x50(%rbp)
mov    0xea9(%rip),%rax
mov    %rax,-0x48(%rbp)
mov    0xea7(%rip),%eax
mov    %eax,-0x40(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    126e <gaussian5x5int+0x14e>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    125b <gaussian5x5int+0x13b>
cmpl   $0x1,-0x20(%rbp)
jle    1220 <gaussian5x5int+0x100>
mov    -0x20(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    1220 <gaussian5x5int+0x100>
movl   $0x0,-0x54(%rbp)
movl   $0xfffffffe,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jg     11ff <gaussian5x5int+0xdf>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
imul   -0x50(%rbp,%rcx,4),%eax
add    -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11bb <gaussian5x5int+0x9b>
mov    -0x54(%rbp),%eax
sar    $0xa,%eax
mov    %al,%dl
mov    -0x30(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1248 <gaussian5x5int+0x128>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x30(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    124d <gaussian5x5int+0x12d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1186 <gaussian5x5int+0x66>
jmp    1260 <gaussian5x5int+0x140>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1173 <gaussian5x5int+0x53>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1391 <gaussian5x5int+0x271>
cmpl   $0x1,-0x1c(%rbp)
jle    1330 <gaussian5x5int+0x210>
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    1330 <gaussian5x5int+0x210>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    132b <gaussian5x5int+0x20b>
movl   $0x0,-0x54(%rbp)
movl   $0xfffffffe,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jg     1301 <gaussian5x5int+0x1e1>
mov    -0x30(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x24(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x24(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
imul   -0x50(%rbp,%rcx,4),%eax
add    -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12bd <gaussian5x5int+0x19d>
mov    -0x54(%rbp),%eax
sar    $0xa,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12a3 <gaussian5x5int+0x183>
jmp    137e <gaussian5x5int+0x25e>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1379 <gaussian5x5int+0x259>
mov    -0x30(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1337 <gaussian5x5int+0x217>
jmp    137e <gaussian5x5int+0x25e>
jmp    1383 <gaussian5x5int+0x263>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1275 <gaussian5x5int+0x155>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gaussian5x5int>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %ecx,%r15d
mov    %edx,%ebx
mov    %rsi,%rbp
mov    %rdi,0x18(%rsp)
mov    %ecx,%eax
imul   %edx,%eax
movslq %eax,%rdi
call   1050 <malloc@plt>
mov    %rax,0x8(%rsp)
test   %r15d,%r15d
jle    1677 <gaussian5x5int+0x547>
mov    %rbx,%r8
lea    -0x2(%rbx),%eax
cltq
movslq %r8d,%r14
mov    %r15d,%r9d
mov    %r14d,%r13d
xor    %ecx,%ecx
pxor   %xmm0,%xmm0
movdqa 0xe7b(%rip),%xmm1
mov    0x8(%rsp),%rdx
jmp    119f <gaussian5x5int+0x6f>
nopl   0x0(%rax)
add    $0x1,%rcx
add    %r14,%rdx
add    %r14,%rbp
cmp    %r9,%rcx
je     120a <gaussian5x5int+0xda>
test   %r8d,%r8d
jle    1190 <gaussian5x5int+0x60>
xor    %esi,%esi
jmp    11c2 <gaussian5x5int+0x92>
nopl   0x0(%rax,%rax,1)
movzbl 0x0(%rbp,%rsi,1),%edi
mov    %dil,(%rdx,%rsi,1)
add    $0x1,%rsi
cmp    %rsi,%r13
je     1190 <gaussian5x5int+0x60>
cmp    $0x2,%rsi
jb     11b0 <gaussian5x5int+0x80>
cmp    %rax,%rsi
jge    11b0 <gaussian5x5int+0x80>
movzbl -0x2(%rbp,%rsi,1),%edi
mov    %edi,%ebx
shl    $0x6,%ebx
sub    %edi,%ebx
sub    %edi,%ebx
movd   -0x1(%rbp,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
pmaddwd %xmm1,%xmm2
pshufd $0xee,%xmm2,%xmm3
paddd  %xmm2,%xmm3
pshufd $0x55,%xmm3,%xmm2
paddd  %xmm3,%xmm2
movd   %xmm2,%edi
add    %ebx,%edi
shr    $0xa,%edi
jmp    11b5 <gaussian5x5int+0x85>
test   %r15d,%r15d
jle    1677 <gaussian5x5int+0x547>
add    $0xfffffffe,%r15d
movslq %r15d,%rdi
mov    %r13d,%eax
and    $0xfffffff0,%eax
mov    %rax,0x10(%rsp)
mov    %r13d,%eax
and    $0xfffffff8,%eax
mov    %rax,0x20(%rsp)
mov    0x8(%rsp),%r15
sub    %r14,%r15
sub    %r14,%r15
xor    %r10d,%r10d
pxor   %xmm8,%xmm8
movdqa 0xdc4(%rip),%xmm9
movdqa 0xdcb(%rip),%xmm10
movdqa 0xdd2(%rip),%xmm11
movdqa 0xdd9(%rip),%xmm12
movdqa 0xde0(%rip),%xmm13
mov    0x18(%rsp),%r12
mov    %rdi,0x28(%rsp)
jmp    1293 <gaussian5x5int+0x163>
nopl   0x0(%rax)
add    $0x1,%r10
add    %r14,%r15
add    %r14,%r12
cmp    %r9,%r10
je     1677 <gaussian5x5int+0x547>
cmp    $0x2,%r10
jb     12b0 <gaussian5x5int+0x180>
cmp    %rdi,%r10
jge    12b0 <gaussian5x5int+0x180>
test   %r8d,%r8d
jle    1280 <gaussian5x5int+0x150>
cmp    $0x8,%r8d
jae    1327 <gaussian5x5int+0x1f7>
xor    %ecx,%ecx
jmp    1610 <gaussian5x5int+0x4e0>
test   %r8d,%r8d
jle    1280 <gaussian5x5int+0x150>
mov    %r10d,%eax
imul   %r8d,%eax
movslq %eax,%rsi
mov    0x18(%rsp),%rax
lea    (%rax,%rsi,1),%rdi
add    0x8(%rsp),%rsi
mov    %r13,%rdx
mov    %r8,%rbx
mov    %r9,%rbp
mov    %r10,0x30(%rsp)
call   1040 <memcpy@plt>
movdqa 0xd67(%rip),%xmm13
movdqa 0xd4e(%rip),%xmm12
movdqa 0xd35(%rip),%xmm11
movdqa 0xd1c(%rip),%xmm10
movdqa 0xd03(%rip),%xmm9
pxor   %xmm8,%xmm8
mov    0x30(%rsp),%r10
mov    0x28(%rsp),%rdi
mov    %rbp,%r9
mov    %rbx,%r8
jmp    1280 <gaussian5x5int+0x150>
xor    %eax,%eax
cmp    $0x10,%r8d
jb     14ff <gaussian5x5int+0x3cf>
mov    0x10(%rsp),%rdx
nopl   0x0(%rax,%rax,1)
lea    (%r15,%rax,1),%rcx
movdqu (%r15,%rax,1),%xmm0
movdqa %xmm0,%xmm2
punpckhbw %xmm8,%xmm2
punpcklbw %xmm8,%xmm0
movdqu (%r14,%rcx,1),%xmm3
add    %r14,%rcx
movdqa %xmm3,%xmm1
punpckhbw %xmm8,%xmm1
punpcklbw %xmm8,%xmm3
movdqa %xmm3,%xmm6
punpcklwd %xmm0,%xmm6
pmaddwd %xmm9,%xmm6
punpckhwd %xmm0,%xmm3
pmaddwd %xmm9,%xmm3
movdqa %xmm1,%xmm7
punpcklwd %xmm2,%xmm7
pmaddwd %xmm9,%xmm7
punpckhwd %xmm2,%xmm1
pmaddwd %xmm9,%xmm1
movdqu (%r14,%rcx,1),%xmm0
add    %r14,%rcx
movdqa %xmm0,%xmm2
punpckhbw %xmm8,%xmm2
movdqa %xmm2,%xmm5
punpckhwd %xmm8,%xmm5
punpcklwd %xmm8,%xmm2
punpcklbw %xmm8,%xmm0
movdqa %xmm0,%xmm4
punpckhwd %xmm8,%xmm4
punpcklwd %xmm8,%xmm0
pmaddwd %xmm10,%xmm0
paddd  %xmm6,%xmm0
pmaddwd %xmm10,%xmm4
paddd  %xmm3,%xmm4
pmaddwd %xmm10,%xmm2
paddd  %xmm7,%xmm2
pmaddwd %xmm10,%xmm5
paddd  %xmm1,%xmm5
movdqu (%r14,%rcx,1),%xmm1
add    %r14,%rcx
movdqa %xmm1,%xmm3
punpcklbw %xmm8,%xmm3
movdqa %xmm3,%xmm7
punpcklwd %xmm8,%xmm7
punpckhwd %xmm8,%xmm3
punpckhbw %xmm8,%xmm1
movdqa %xmm1,%xmm6
punpcklwd %xmm8,%xmm6
punpckhwd %xmm8,%xmm1
pmaddwd %xmm11,%xmm1
paddd  %xmm5,%xmm1
pmaddwd %xmm11,%xmm6
paddd  %xmm2,%xmm6
pmaddwd %xmm11,%xmm3
paddd  %xmm4,%xmm3
pmaddwd %xmm11,%xmm7
paddd  %xmm0,%xmm7
movdqu (%r14,%rcx,1),%xmm0
movdqa %xmm0,%xmm2
punpckhbw %xmm8,%xmm2
movdqa %xmm2,%xmm5
punpckhwd %xmm8,%xmm5
punpcklwd %xmm8,%xmm2
punpcklbw %xmm8,%xmm0
movdqa %xmm0,%xmm4
punpckhwd %xmm8,%xmm4
punpcklwd %xmm8,%xmm0
pmaddwd %xmm12,%xmm0
paddd  %xmm7,%xmm0
pmaddwd %xmm12,%xmm4
paddd  %xmm3,%xmm4
pmaddwd %xmm12,%xmm2
paddd  %xmm6,%xmm2
pmaddwd %xmm12,%xmm5
paddd  %xmm1,%xmm5
psrld  $0xa,%xmm0
psrld  $0xa,%xmm4
psrld  $0xa,%xmm2
psrld  $0xa,%xmm5
pand   %xmm13,%xmm5
pand   %xmm13,%xmm2
packuswb %xmm5,%xmm2
pand   %xmm13,%xmm4
pand   %xmm13,%xmm0
packuswb %xmm4,%xmm0
packuswb %xmm2,%xmm0
movdqu %xmm0,(%r12,%rax,1)
add    $0x10,%rax
cmp    %rax,%rdx
jne    1340 <gaussian5x5int+0x210>
cmp    %r13,%rdx
je     1280 <gaussian5x5int+0x150>
mov    0x10(%rsp),%rcx
mov    %rcx,%rax
test   $0x8,%r13b
je     1610 <gaussian5x5int+0x4e0>
mov    0x20(%rsp),%rdx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    (%r15,%rax,1),%rcx
movq   (%r15,%rax,1),%xmm0
punpcklbw %xmm8,%xmm0
movq   (%r14,%rcx,1),%xmm1
add    %r14,%rcx
punpcklbw %xmm8,%xmm1
movdqa %xmm1,%xmm2
punpcklwd %xmm0,%xmm2
pmaddwd %xmm9,%xmm2
punpckhwd %xmm0,%xmm1
pmaddwd %xmm9,%xmm1
movq   (%r14,%rcx,1),%xmm0
add    %r14,%rcx
punpcklbw %xmm8,%xmm0
movdqa %xmm0,%xmm3
punpckhwd %xmm8,%xmm3
punpcklwd %xmm8,%xmm0
pmaddwd %xmm10,%xmm0
paddd  %xmm2,%xmm0
pmaddwd %xmm10,%xmm3
paddd  %xmm1,%xmm3
movq   (%r14,%rcx,1),%xmm1
add    %r14,%rcx
punpcklbw %xmm8,%xmm1
movdqa %xmm1,%xmm2
punpcklwd %xmm8,%xmm2
punpckhwd %xmm8,%xmm1
pmaddwd %xmm11,%xmm1
paddd  %xmm3,%xmm1
pmaddwd %xmm11,%xmm2
paddd  %xmm0,%xmm2
movq   (%r14,%rcx,1),%xmm0
punpcklbw %xmm8,%xmm0
movdqa %xmm0,%xmm3
punpckhwd %xmm8,%xmm3
punpcklwd %xmm8,%xmm0
pmaddwd %xmm12,%xmm0
paddd  %xmm2,%xmm0
pmaddwd %xmm12,%xmm3
paddd  %xmm1,%xmm3
psrld  $0xa,%xmm0
psrld  $0xa,%xmm3
pand   %xmm13,%xmm3
pand   %xmm13,%xmm0
packuswb %xmm3,%xmm0
packuswb %xmm0,%xmm0
movq   %xmm0,(%r12,%rax,1)
add    $0x8,%rax
cmp    %rax,%rdx
jne    1510 <gaussian5x5int+0x3e0>
mov    %rdx,%rcx
cmp    %r13,%rdx
je     1280 <gaussian5x5int+0x150>
cs nopw 0x0(%rax,%rax,1)
nop
lea    (%r15,%rcx,1),%rax
movzbl (%r15,%rcx,1),%edx
mov    %edx,%esi
shl    $0x6,%esi
sub    %edx,%esi
sub    %edx,%esi
movzbl (%r14,%rax,1),%edx
add    %r14,%rax
imul   $0xf8,%edx,%edx
add    %esi,%edx
movzbl (%r14,%rax,1),%esi
add    %r14,%rax
imul   $0x188,%esi,%esi
add    %edx,%esi
movzbl (%r14,%rax,1),%edx
add    %r14,%rax
imul   $0xf8,%edx,%edx
add    %esi,%edx
movzbl (%r14,%rax,1),%eax
mov    %eax,%esi
shl    $0x6,%esi
sub    %eax,%esi
sub    %eax,%esi
add    %edx,%esi
shr    $0xa,%esi
mov    %sil,(%r12,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%r13
jne    1610 <gaussian5x5int+0x4e0>
jmp    1280 <gaussian5x5int+0x150>
mov    0x8(%rsp),%rdi
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

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

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