void conv_kov(double *v, double *k, double *o, int n, int h, int w, int f,
              int ph, int pw, int out_f, int kh, int kw, int sh, int sw) {
  int out_h = (h + 2 * ph - kh) / sh + 1;
  int out_w = (w + 2 * pw - kw) / sw + 1;
  int colcol = kh * kw * f;
  int fkw = f * kw;
  int o_size = out_h * out_w * out_f;
  int v_size = h * w * f;
  double *o_ptr = o;
  double *v_ptr = v;
  int n_idx, ho, wo, fo, kcoli;
  int v_hi, v_wi, fi, v_idx, off_o, off_k, sho, swo;
  for (n_idx = 0; n_idx < n; ++n_idx) {
    for (ho = 0; ho < out_h; ++ho) {
      for (wo = 0; wo < out_w; ++wo) {
        off_o = out_f * (wo + out_w * ho);
        sho = ho * sh;
        swo = wo * sw;
        for (kcoli = 0; kcoli < colcol; ++kcoli) {
          v_hi = sho + kcoli / fkw % kh;
          v_wi = swo + kcoli / f % kw;
          if ((v_hi < ph) | (v_wi < pw) | (v_hi >= h + ph) | (v_wi >= w + pw)) {
            continue;
          }
          fi = kcoli % f;
          v_idx = fi + f * (v_wi - pw + w * (v_hi - ph));
          register double part = 0;
          for (fo = 0; fo < out_f; ++fo) {
            part += k[kcoli * out_f + fo] * o_ptr[fo + off_o];
          }
          v_ptr[v_idx] += part;
        }
      }
    }
    o_ptr += o_size;
    v_ptr += v_size;
  }
}


x86 assembly (clang, -O0):
<conv_kov>:
push   %rbp
mov    %rsp,%rbp
sub    $0x18,%rsp
mov    0x48(%rbp),%eax
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x20(%rbp),%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    0x30(%rbp),%eax
cltd
idivl  0x40(%rbp)
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    0x38(%rbp),%eax
cltd
idivl  0x48(%rbp)
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    0x30(%rbp),%eax
imul   0x38(%rbp),%eax
imul   0x10(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    0x10(%rbp),%eax
imul   0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
imul   -0x2c(%rbp),%eax
imul   0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%eax
imul   -0x24(%rbp),%eax
imul   0x10(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    13db <conv_kov+0x2db>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    13a3 <conv_kov+0x2a3>
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1390 <conv_kov+0x290>
mov    0x28(%rbp),%eax
mov    -0x5c(%rbp),%ecx
mov    -0x2c(%rbp),%edx
imul   -0x58(%rbp),%edx
add    %edx,%ecx
imul   %ecx,%eax
mov    %eax,-0x78(%rbp)
mov    -0x58(%rbp),%eax
imul   0x40(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x5c(%rbp),%eax
imul   0x48(%rbp),%eax
mov    %eax,-0x84(%rbp)
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    137d <conv_kov+0x27d>
mov    -0x80(%rbp),%eax
mov    %eax,-0x98(%rbp)
mov    -0x64(%rbp),%eax
cltd
idivl  -0x34(%rbp)
cltd
idivl  0x30(%rbp)
mov    -0x98(%rbp),%eax
add    %edx,%eax
mov    %eax,-0x68(%rbp)
mov    -0x84(%rbp),%eax
mov    %eax,-0x94(%rbp)
mov    -0x64(%rbp),%eax
cltd
idivl  0x10(%rbp)
cltd
idivl  0x38(%rbp)
mov    -0x94(%rbp),%eax
add    %edx,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x68(%rbp),%eax
cmp    0x18(%rbp),%eax
setl   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x6c(%rbp),%ecx
cmp    0x20(%rbp),%ecx
setl   %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
mov    -0x68(%rbp),%ecx
mov    -0x20(%rbp),%edx
add    0x18(%rbp),%edx
cmp    %edx,%ecx
setge  %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
mov    -0x6c(%rbp),%ecx
mov    -0x24(%rbp),%edx
add    0x20(%rbp),%edx
cmp    %edx,%ecx
setge  %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
cmp    $0x0,%eax
je     12bd <conv_kov+0x1bd>
jmp    136f <conv_kov+0x26f>
mov    -0x64(%rbp),%eax
cltd
idivl  0x10(%rbp)
mov    %edx,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    0x10(%rbp),%ecx
mov    -0x6c(%rbp),%edx
sub    0x20(%rbp),%edx
mov    -0x24(%rbp),%esi
mov    -0x68(%rbp),%edi
sub    0x18(%rbp),%edi
imul   %edi,%esi
add    %esi,%edx
imul   %edx,%ecx
add    %ecx,%eax
mov    %eax,-0x74(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
cmp    0x28(%rbp),%eax
jge    1355 <conv_kov+0x255>
mov    -0x10(%rbp),%rax
mov    -0x64(%rbp),%ecx
imul   0x28(%rbp),%ecx
add    -0x60(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
mov    -0x60(%rbp),%ecx
add    -0x78(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    12fb <conv_kov+0x1fb>
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x50(%rbp),%rax
movslq -0x74(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1217 <conv_kov+0x117>
jmp    1382 <conv_kov+0x282>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    11d8 <conv_kov+0xd8>
jmp    1395 <conv_kov+0x295>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    11c5 <conv_kov+0xc5>
mov    -0x38(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11b2 <conv_kov+0xb2>
add    $0x18,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<conv_kov>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x40,%rsp
mov    %rdx,-0x80(%rsp)
mov    %rsi,-0x40(%rsp)
mov    0x88(%rsp),%esi
mov    0x80(%rsp),%eax
lea    (%r8,%rax,2),%eax
sub    0x98(%rsp),%eax
cltd
idivl  0xa8(%rsp)
mov    %rax,-0x58(%rsp)
mov    %r9,%rax
mov    %r9,-0x30(%rsp)
lea    (%r9,%rsi,2),%eax
sub    0xa0(%rsp),%eax
cltd
idivl  0xb0(%rsp)
mov    %rax,-0x48(%rsp)
mov    %ecx,-0x60(%rsp)
test   %ecx,%ecx
jle    146a <conv_kov+0x36a>
mov    %r8,%rbp
mov    0x90(%rsp),%r8d
mov    0x78(%rsp),%edx
mov    -0x48(%rsp),%rax
lea    0x1(%rax),%r9d
mov    0xa0(%rsp),%r11d
imul   %edx,%r11d
mov    %r11d,%eax
imul   0x98(%rsp),%eax
mov    -0x30(%rsp),%rsi
mov    %esi,%ecx
imul   %ebp,%ecx
imul   %edx,%ecx
mov    -0x58(%rsp),%rdx
add    $0x1,%edx
mov    %rdx,0x8(%rsp)
imul   %r8d,%edx
imul   %r9d,%edx
mov    0x80(%rsp),%ebx
add    %ebx,%ebp
mov    %rbp,0x38(%rsp)
mov    0x88(%rsp),%ebp
add    %ebp,%esi
movslq %edx,%rdx
movslq %ecx,%rcx
mov    %rcx,-0x20(%rsp)
movslq %r8d,%rcx
movslq %r9d,%rbp
mov    %ebp,%ebx
mov    %rbx,0x20(%rsp)
mov    %eax,-0x5c(%rsp)
mov    %eax,%r14d
mov    %ecx,%r12d
mov    %r12,0x30(%rsp)
and    $0xfffffffe,%r12d
mov    %rcx,%rax
mov    %rbp,-0x8(%rsp)
imul   %rbp,%rax
shl    $0x3,%rax
mov    %rax,(%rsp)
mov    -0x40(%rsp),%rax
add    $0x8,%rax
mov    %rax,0x10(%rsp)
mov    %rcx,-0x38(%rsp)
lea    0x0(,%rcx,8),%rcx
mov    -0x80(%rsp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rsp)
mov    %rdx,-0x18(%rsp)
lea    0x0(,%rdx,8),%rax
mov    %rax,-0x28(%rsp)
xor    %edx,%edx
jmp    1288 <conv_kov+0x188>
mov    -0x80(%rsp),%rax
mov    -0x18(%rsp),%rdx
lea    (%rax,%rdx,8),%rax
mov    %rax,-0x80(%rsp)
mov    -0x20(%rsp),%rax
lea    (%rdi,%rax,8),%rdi
mov    -0x10(%rsp),%rdx
add    $0x1,%edx
mov    -0x28(%rsp),%rax
add    %rax,-0x50(%rsp)
cmp    -0x60(%rsp),%edx
je     146a <conv_kov+0x36a>
mov    %rdx,-0x10(%rsp)
cmpl   $0x0,-0x58(%rsp)
js     1250 <conv_kov+0x150>
mov    -0x50(%rsp),%rax
mov    %rax,-0x70(%rsp)
xor    %eax,%eax
mov    %rax,-0x78(%rsp)
jmp    12da <conv_kov+0x1da>
nopw   0x0(%rax,%rax,1)
mov    -0x78(%rsp),%rdx
add    $0x1,%rdx
mov    -0x70(%rsp),%rax
add    (%rsp),%rax
mov    %rax,-0x70(%rsp)
mov    %rdx,%rax
mov    %rdx,-0x78(%rsp)
cmp    0x8(%rsp),%rdx
je     1250 <conv_kov+0x150>
cmpl   $0x0,-0x48(%rsp)
js     12b0 <conv_kov+0x1b0>
mov    -0x78(%rsp),%rax
mov    %rax,%rdx
imul   -0x8(%rsp),%rdx
mov    %rdx,0x18(%rsp)
mov    %eax,%r9d
imul   0xa8(%rsp),%r9d
mov    -0x70(%rsp),%r13
xor    %eax,%eax
mov    %rax,-0x68(%rsp)
jmp    132b <conv_kov+0x22b>
xchg   %ax,%ax
mov    -0x68(%rsp),%rdx
add    $0x1,%rdx
add    %rcx,%r13
mov    %rdx,%rax
mov    %rdx,-0x68(%rsp)
cmp    0x20(%rsp),%rdx
je     12b0 <conv_kov+0x1b0>
cmpl   $0x0,-0x5c(%rsp)
jle    1310 <conv_kov+0x210>
mov    0x18(%rsp),%rax
mov    -0x68(%rsp),%rdx
add    %rdx,%rax
imul   -0x38(%rsp),%rax
mov    %rax,0x28(%rsp)
mov    %edx,%r10d
imul   0xb0(%rsp),%r10d
mov    0x10(%rsp),%r8
xor    %ebx,%ebx
jmp    137c <conv_kov+0x27c>
xorpd  %xmm0,%xmm0
movslq %r15d,%rax
addsd  (%rdi,%rax,8),%xmm0
movsd  %xmm0,(%rdi,%rax,8)
add    $0x1,%rbx
add    %rcx,%r8
cmp    %r14,%rbx
je     1310 <conv_kov+0x210>
mov    %ebx,%eax
cltd
idiv   %r11d
cltd
idivl  0x98(%rsp)
mov    %edx,%ebp
mov    %ebx,%eax
cltd
idivl  0x78(%rsp)
mov    %edx,%r15d
cltd
idivl  0xa0(%rsp)
add    %r10d,%edx
cmp    %esi,%edx
jge    1370 <conv_kov+0x270>
add    %r9d,%ebp
cmp    0x38(%rsp),%ebp
jge    1370 <conv_kov+0x270>
mov    0x80(%rsp),%eax
sub    %eax,%ebp
jl     1370 <conv_kov+0x270>
mov    0x88(%rsp),%eax
sub    %eax,%edx
jl     1370 <conv_kov+0x270>
imul   -0x30(%rsp),%ebp
add    %ebp,%edx
imul   0x78(%rsp),%edx
add    %edx,%r15d
mov    0x90(%rsp),%eax
test   %eax,%eax
jle    135f <conv_kov+0x25f>
cmp    $0x1,%eax
jne    13eb <conv_kov+0x2eb>
xorpd  %xmm0,%xmm0
xor    %eax,%eax
jmp    1430 <conv_kov+0x330>
xorpd  %xmm1,%xmm1
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%r8,%rax,8),%xmm2
movsd  (%r8,%rax,8),%xmm0
mulsd  -0x8(%r13,%rax,8),%xmm2
mulsd  0x0(%r13,%rax,8),%xmm0
addsd  %xmm1,%xmm2
addsd  %xmm2,%xmm0
add    $0x2,%rax
movapd %xmm0,%xmm1
cmp    %rax,%r12
jne    1400 <conv_kov+0x300>
testb  $0x1,0x30(%rsp)
je     1363 <conv_kov+0x263>
mov    %rbx,%rdx
imul   -0x38(%rsp),%rdx
add    %rax,%rdx
mov    -0x40(%rsp),%rbp
movsd  0x0(%rbp,%rdx,8),%xmm1
add    0x28(%rsp),%rax
mov    -0x80(%rsp),%rdx
mulsd  (%rdx,%rax,8),%xmm1
addsd  %xmm1,%xmm0
jmp    1363 <conv_kov+0x263>
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @conv_kov(double* nocapture %0, double* nocapture %1, double* nocapture %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13) {
%15 = shl nsw i32 %7, 1
%16 = add nsw i32 %15, %4
%17 = sub i32 %16, %10
%18 = sdiv i32 %17, %12
%19 = shl nsw i32 %8, 1
%20 = add nsw i32 %19, %5
%21 = sub i32 %20, %11
%22 = sdiv i32 %21, %13
%23 = add i32 %22, 1
%24 = mul i32 %11, %6
%25 = mul i32 %24, %10
%26 = icmp sgt i32 %3, 0
br i1 %26, label %27, label %148
27: ; preds = %14
%28 = mul nsw i32 %5, %4
%29 = mul nsw i32 %28, %6
%30 = add i32 %18, 1
%31 = mul i32 %30, %9
%32 = mul i32 %31, %23
%33 = icmp slt i32 %18, 0
%34 = icmp slt i32 %22, 0
%35 = icmp sgt i32 %25, 0
%36 = add nsw i32 %7, %4
%37 = add nsw i32 %8, %5
%38 = icmp sgt i32 %9, 0
%39 = sext i32 %32 to i64
%40 = sext i32 %29 to i64
%41 = sext i32 %9 to i64
%42 = sext i32 %23 to i64
%43 = zext i32 %30 to i64
%44 = zext i32 %23 to i64
%45 = zext i32 %25 to i64
%46 = zext i32 %9 to i64
%47 = and i64 %46, 1
%48 = icmp eq i32 %9, 1
%49 = and i64 %46, 4294967294
%50 = icmp eq i64 %47, 0
br label %51
51: ; preds = %27, %143
%52 = phi double* [ %2, %27 ], [ %144, %143 ]
%53 = phi double* [ %0, %27 ], [ %145, %143 ]
%54 = phi i32 [ 0, %27 ], [ %146, %143 ]
br i1 %33, label %143, label %55
55: ; preds = %51, %140
%56 = phi i64 [ %141, %140 ], [ 0, %51 ]
br i1 %34, label %140, label %57
57: ; preds = %55
%58 = mul nsw i64 %56, %42
%59 = trunc i64 %56 to i32
%60 = mul i32 %59, %12
br label %61
61: ; preds = %57, %137
%62 = phi i64 [ 0, %57 ], [ %138, %137 ]
%63 = add nsw i64 %62, %58
%64 = mul nsw i64 %63, %41
br i1 %35, label %65, label %137
65: ; preds = %61
%66 = trunc i64 %62 to i32
%67 = mul i32 %66, %13
br label %68
68: ; preds = %65, %134
%69 = phi i64 [ 0, %65 ], [ %135, %134 ]
%70 = trunc i64 %69 to i32
%71 = sdiv i32 %70, %24
%72 = srem i32 %71, %10
%73 = add nsw i32 %72, %60
%74 = sdiv i32 %70, %6
%75 = srem i32 %70, %6
%76 = srem i32 %74, %11
%77 = add nsw i32 %76, %67
%78 = icmp slt i32 %73, %7
%79 = icmp slt i32 %77, %8
%80 = or i1 %78, %79
%81 = icmp sge i32 %73, %36
%82 = or i1 %81, %80
%83 = icmp sge i32 %77, %37
%84 = or i1 %83, %82
br i1 %84, label %134, label %85
85: ; preds = %68
%86 = sub i32 %77, %8
%87 = sub nsw i32 %73, %7
%88 = mul nsw i32 %87, %5
%89 = add nsw i32 %86, %88
%90 = mul nsw i32 %89, %6
%91 = add nsw i32 %75, %90
br i1 %38, label %92, label %128
92: ; preds = %85
%93 = mul nsw i64 %69, %41
br i1 %48, label %116, label %94
94: ; preds = %92, %94
%95 = phi i64 [ %113, %94 ], [ 0, %92 ]
%96 = phi double [ %112, %94 ], [ 0.000000e+00, %92 ]
%97 = phi i64 [ %114, %94 ], [ 0, %92 ]
%98 = add nsw i64 %95, %93
%99 = getelementptr inbounds double, double* %1, i64 %98
%100 = load double, double* %99
%101 = add nsw i64 %95, %64
%102 = getelementptr inbounds double, double* %52, i64 %101
%103 = load double, double* %102
%104 = tail call double @llvm.fmuladd.f64(double %100, double %103, double %96)
%105 = or i64 %95, 1
%106 = add nsw i64 %105, %93
%107 = getelementptr inbounds double, double* %1, i64 %106
%108 = load double, double* %107
%109 = add nsw i64 %105, %64
%110 = getelementptr inbounds double, double* %52, i64 %109
%111 = load double, double* %110
%112 = tail call double @llvm.fmuladd.f64(double %108, double %111, double %104)
%113 = add nuw nsw i64 %95, 2
%114 = add i64 %97, 2
%115 = icmp eq i64 %114, %49
br i1 %115, label %116, label %94
116: ; preds = %94, %92
%117 = phi double [ undef, %92 ], [ %112, %94 ]
%118 = phi i64 [ 0, %92 ], [ %113, %94 ]
%119 = phi double [ 0.000000e+00, %92 ], [ %112, %94 ]
br i1 %50, label %128, label %120
120: ; preds = %116
%121 = add nsw i64 %118, %93
%122 = getelementptr inbounds double, double* %1, i64 %121
%123 = load double, double* %122
%124 = add nsw i64 %118, %64
%125 = getelementptr inbounds double, double* %52, i64 %124
%126 = load double, double* %125
%127 = tail call double @llvm.fmuladd.f64(double %123, double %126, double %119)
br label %128
128: ; preds = %120, %116, %85
%129 = phi double [ 0.000000e+00, %85 ], [ %117, %116 ], [ %127, %120 ]
%130 = sext i32 %91 to i64
%131 = getelementptr inbounds double, double* %53, i64 %130
%132 = load double, double* %131
%133 = fadd double %129, %132
store double %133, double* %131
br label %134
134: ; preds = %68, %128
%135 = add nuw nsw i64 %69, 1
%136 = icmp eq i64 %135, %45
br i1 %136, label %137, label %68
137: ; preds = %134, %61
%138 = add nuw nsw i64 %62, 1
%139 = icmp eq i64 %138, %44
br i1 %139, label %140, label %61
140: ; preds = %137, %55
%141 = add nuw nsw i64 %56, 1
%142 = icmp eq i64 %141, %43
br i1 %142, label %143, label %55
143: ; preds = %140, %51
%144 = getelementptr inbounds double, double* %52, i64 %39
%145 = getelementptr inbounds double, double* %53, i64 %40
%146 = add nuw nsw i32 %54, 1
%147 = icmp eq i32 %146, %3
br i1 %147, label %148, label %51
148: ; preds = %143, %14
ret void
}