void convolution(int *image, int *width, int *height, int *depth, double *mask,
                 int *mask_width, int *mask_height, int *bias, int *ret) {
  int x, y, d, i, j;
  int x_src = *mask_width / 2;
  int y_src = *mask_height / 2;
  for (x = 0; x < *width; x++) {
    for (y = 0; y < *height; y++) {
      for (d = 0; d < *depth; d++) {
        int value = 0;
        for (i = 0; i < *mask_width; i++) {
          for (j = 0; j < *mask_height; j++) {
            int x_pos, y_pos;
            x_pos = (x + i < x_src) ? 0 : x + i - x_src;
            x_pos = (x_pos > *width - 1) ? *width - 1 : x_pos;
            y_pos = (y + j < y_src) ? 0 : y + j - y_src;
            y_pos = (y_pos > *height - 1) ? *height - 1 : y_pos;
            value += image[((*height) * (x_pos) + (y_pos) +
                            (*width) * (*height) * (d))] *
                     mask[((*mask_height) * (i) + (j) +
                           (*mask_width) * (*mask_height) * (0))];
          }
        }
        value += *bias;
        ret[((*height) * (x) + (y) + (*width) * (*height) * (d))] =
            ((value) < (0)) ? (0) : (((value) > (255)) ? (255) : (value));
      }
    }
  }
}


x86 assembly (clang, -O0):
<convolution>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
mov    0x10(%rbp),%rax
mov    (%rax),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x4c(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    13aa <convolution+0x2aa>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x18(%rbp),%rcx
cmp    (%rcx),%eax
jge    1397 <convolution+0x297>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%eax
jge    1384 <convolution+0x284>
movl   $0x0,-0x50(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    -0x30(%rbp),%rcx
cmp    (%rcx),%eax
jge    1303 <convolution+0x203>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    12f0 <convolution+0x1f0>
mov    -0x34(%rbp),%eax
add    -0x40(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    11d8 <convolution+0xd8>
xor    %eax,%eax
mov    %eax,-0x5c(%rbp)
jmp    11e4 <convolution+0xe4>
mov    -0x34(%rbp),%eax
add    -0x40(%rbp),%eax
sub    -0x48(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    120f <convolution+0x10f>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sub    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    1215 <convolution+0x115>
mov    -0x54(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x38(%rbp),%eax
add    -0x44(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jge    1234 <convolution+0x134>
xor    %eax,%eax
mov    %eax,-0x64(%rbp)
jmp    1240 <convolution+0x140>
mov    -0x38(%rbp),%eax
add    -0x44(%rbp),%eax
sub    -0x4c(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x64(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jle    126b <convolution+0x16b>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
sub    $0x1,%eax
mov    %eax,-0x68(%rbp)
jmp    1271 <convolution+0x171>
mov    -0x58(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    -0x68(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%ecx
imul   -0x54(%rbp),%ecx
add    -0x58(%rbp),%ecx
mov    -0x10(%rbp),%rdx
mov    (%rdx),%edx
mov    -0x18(%rbp),%rsi
imul   (%rsi),%edx
imul   -0x3c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
mov    0x10(%rbp),%rcx
mov    (%rcx),%ecx
imul   -0x40(%rbp),%ecx
add    -0x44(%rbp),%ecx
mov    -0x30(%rbp),%rdx
mov    (%rdx),%edx
mov    0x10(%rbp),%rsi
imul   (%rsi),%edx
imul   $0x0,%edx,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
cvtsi2sdl -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11b0 <convolution+0xb0>
jmp    12f5 <convolution+0x1f5>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    119a <convolution+0x9a>
mov    0x18(%rbp),%rax
mov    (%rax),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x50(%rbp)
jge    1323 <convolution+0x223>
xor    %eax,%eax
mov    %eax,-0x6c(%rbp)
jmp    1349 <convolution+0x249>
cmpl   $0xff,-0x50(%rbp)
jle    133d <convolution+0x23d>
mov    $0xff,%eax
mov    %eax,-0x70(%rbp)
jmp    1343 <convolution+0x243>
mov    -0x50(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%edx
mov    0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%ecx
imul   -0x34(%rbp),%ecx
add    -0x38(%rbp),%ecx
mov    -0x10(%rbp),%rsi
mov    (%rsi),%esi
mov    -0x18(%rbp),%rdi
imul   (%rdi),%esi
imul   -0x3c(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    117d <convolution+0x7d>
jmp    1389 <convolution+0x289>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1167 <convolution+0x67>
jmp    139c <convolution+0x29c>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1151 <convolution+0x51>
pop    %rbp
ret

x86 assembly (clang, -O2):
<convolution>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r9,-0x38(%rsp)
mov    %r8,-0x20(%rsp)
mov    %rcx,-0x30(%rsp)
mov    %rdx,-0x48(%rsp)
mov    %rsi,-0x40(%rsp)
mov    (%rsi),%ebp
test   %ebp,%ebp
jle    1339 <convolution+0x239>
mov    0x38(%rsp),%rax
mov    (%rax),%eax
mov    %eax,%edx
shr    $0x1f,%edx
add    %eax,%edx
sar    %edx
mov    -0x38(%rsp),%rax
mov    (%rax),%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
movslq %edx,%rbx
neg    %edx
mov    %rdx,-0x28(%rsp)
movslq %ecx,%rax
mov    %rax,-0x18(%rsp)
mov    -0x48(%rsp),%rax
mov    (%rax),%ecx
xor    %r15d,%r15d
xor    %eax,%eax
mov    %rax,-0x50(%rsp)
jmp    11a4 <convolution+0xa4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    -0x40(%rsp),%rax
mov    (%rax),%ebp
mov    -0x50(%rsp),%rsi
add    $0x1,%rsi
movslq %ebp,%rax
mov    %rsi,%rdx
mov    %rsi,-0x50(%rsp)
cmp    %rax,%rsi
jge    1339 <convolution+0x239>
test   %ecx,%ecx
jle    1187 <convolution+0x87>
mov    -0x30(%rsp),%rax
mov    (%rax),%edx
mov    -0x28(%rsp),%r14
xor    %r11d,%r11d
jmp    11d7 <convolution+0xd7>
nopl   0x0(%rax)
mov    -0x48(%rsp),%rax
mov    (%rax),%ecx
add    $0x1,%r11
movslq %ecx,%rax
add    $0x1,%r14
cmp    %rax,%r11
jge    1180 <convolution+0x80>
test   %edx,%edx
jle    11c7 <convolution+0xc7>
movl   $0x0,-0x54(%rsp)
jmp    124d <convolution+0x14d>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x40(%rsp),%rax
add    (%rax),%r13d
cmp    $0xff,%r13d
mov    $0xff,%eax
cmovge %eax,%r13d
test   %r13d,%r13d
cmovs  %r15d,%r13d
mov    -0x40(%rsp),%rax
mov    (%rax),%eax
mov    -0x54(%rsp),%esi
imul   %esi,%eax
add    -0x50(%rsp),%eax
mov    -0x48(%rsp),%rcx
imul   (%rcx),%eax
add    %r11d,%eax
cltq
mov    0x48(%rsp),%rcx
mov    %r13d,(%rcx,%rax,4)
add    $0x1,%esi
mov    -0x30(%rsp),%rax
mov    (%rax),%edx
mov    %esi,-0x54(%rsp)
cmp    %edx,%esi
jge    11c0 <convolution+0xc0>
mov    -0x38(%rsp),%rax
mov    (%rax),%eax
mov    $0x0,%r13d
mov    %rax,-0x8(%rsp)
test   %eax,%eax
jle    11f0 <convolution+0xf0>
mov    0x38(%rsp),%rax
mov    (%rax),%ebp
movslq %ebp,%rax
shl    $0x3,%rax
mov    %rax,-0x10(%rsp)
xor    %r9d,%r9d
mov    -0x20(%rsp),%rcx
xor    %r13d,%r13d
jmp    12a4 <convolution+0x1a4>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r9
add    -0x10(%rsp),%rcx
cmp    -0x8(%rsp),%r9
je     11f0 <convolution+0xf0>
test   %ebp,%ebp
jle    1290 <convolution+0x190>
mov    -0x50(%rsp),%rax
lea    (%r9,%rax,1),%rdx
mov    %edx,%esi
mov    -0x18(%rsp),%rax
sub    %eax,%esi
cmp    %rax,%rdx
cmovl  %r15d,%esi
mov    -0x40(%rsp),%rax
mov    (%rax),%edx
lea    -0x1(%rdx),%eax
cmp    %edx,%esi
cmovl  %esi,%eax
mov    -0x48(%rsp),%rsi
mov    (%rsi),%esi
lea    -0x1(%rsi),%r12d
imul   -0x54(%rsp),%edx
add    %eax,%edx
imul   %esi,%edx
xor    %r10d,%r10d
nopl   0x0(%rax,%rax,1)
lea    (%r11,%r10,1),%rax
lea    (%r14,%r10,1),%r8d
cmp    %rbx,%rax
cmovl  %r15d,%r8d
cmp    %esi,%r8d
cmovge %r12d,%r8d
add    %edx,%r8d
movslq %r8d,%rax
xorps  %xmm0,%xmm0
cvtsi2sdl (%rdi,%rax,4),%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r13d,%xmm1
mulsd  (%rcx,%r10,8),%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%r13d
add    $0x1,%r10
cmp    %r10,%rbp
jne    12f0 <convolution+0x1f0>
jmp    1290 <convolution+0x190>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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