void neuralops_caffe_im2col(const float *in_buf, const int channels,
                            const int height, const int width,
                            const int kernel_h, const int kernel_w,
                            const int pad_h, const int pad_w,
                            const int stride_h, const int stride_w,
                            const int dilation_h, const int dilation_w,
                            float *col_buf) {
  const float *data_im = in_buf;
  float *data_col = col_buf;
  const int output_h =
      (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1;
  const int output_w =
      (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1;
  const int channel_size = height * width;
  for (int channel = channels; channel--; data_im += channel_size) {
    for (int kernel_row = 0; kernel_row < kernel_h; kernel_row++) {
      for (int kernel_col = 0; kernel_col < kernel_w; kernel_col++) {
        int input_row = -pad_h + kernel_row * dilation_h;
        for (int output_rows = output_h; output_rows; output_rows--) {
          if (!(input_row >= 0 && input_row < height)) {
            for (int output_cols = output_w; output_cols; output_cols--) {
              *(data_col++) = 0.0f;
            }
          } else {
            int input_col = -pad_w + kernel_col * dilation_w;
            for (int output_col = output_w; output_col; output_col--) {
              if (input_col >= 0 && input_col < width) {
                *(data_col++) = data_im[input_row * width + input_col];
              } else {
                *(data_col++) = 0.0f;
              }
              input_col += stride_w;
            }
          }
          input_row += stride_h;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<neuralops_caffe_im2col>:
push   %rbp
mov    %rsp,%rbp
mov    0x40(%rbp),%rax
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    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    0x40(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%eax
mov    0x10(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
mov    0x30(%rbp),%ecx
mov    -0x18(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
add    $0x1,%ecx
sub    %ecx,%eax
cltd
idivl  0x20(%rbp)
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
mov    0x38(%rbp),%ecx
mov    -0x1c(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
add    $0x1,%ecx
sub    %ecx,%eax
cltd
idivl  0x28(%rbp)
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x40(%rbp)
cmp    $0x0,%eax
je     1338 <neuralops_caffe_im2col+0x238>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1319 <neuralops_caffe_im2col+0x219>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1306 <neuralops_caffe_im2col+0x206>
xor    %eax,%eax
sub    0x10(%rbp),%eax
mov    -0x44(%rbp),%ecx
imul   0x30(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x50(%rbp)
je     12f3 <neuralops_caffe_im2col+0x1f3>
cmpl   $0x0,-0x4c(%rbp)
jl     120c <neuralops_caffe_im2col+0x10c>
mov    -0x4c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jl     1245 <neuralops_caffe_im2col+0x145>
mov    -0x38(%rbp),%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x0,-0x54(%rbp)
je     1240 <neuralops_caffe_im2col+0x140>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x54(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x54(%rbp)
jmp    1212 <neuralops_caffe_im2col+0x112>
jmp    12dc <neuralops_caffe_im2col+0x1dc>
xor    %eax,%eax
sub    0x18(%rbp),%eax
mov    -0x48(%rbp),%ecx
imul   0x38(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x58(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x5c(%rbp)
cmpl   $0x0,-0x5c(%rbp)
je     12d7 <neuralops_caffe_im2col+0x1d7>
cmpl   $0x0,-0x58(%rbp)
jl     12aa <neuralops_caffe_im2col+0x1aa>
mov    -0x58(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12aa <neuralops_caffe_im2col+0x1aa>
mov    -0x28(%rbp),%rax
mov    -0x4c(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x58(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
movss  %xmm0,(%rax)
jmp    12c0 <neuralops_caffe_im2col+0x1c0>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    0x28(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x5c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x5c(%rbp)
jmp    125c <neuralops_caffe_im2col+0x15c>
jmp    12dc <neuralops_caffe_im2col+0x1dc>
mov    0x20(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x50(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x50(%rbp)
jmp    11ec <neuralops_caffe_im2col+0xec>
jmp    12f8 <neuralops_caffe_im2col+0x1f8>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    11c9 <neuralops_caffe_im2col+0xc9>
jmp    130b <neuralops_caffe_im2col+0x20b>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11b6 <neuralops_caffe_im2col+0xb6>
jmp    131e <neuralops_caffe_im2col+0x21e>
mov    -0x3c(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    119b <neuralops_caffe_im2col+0x9b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<neuralops_caffe_im2col>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xb8,%rsp
mov    %edx,%ebp
mov    %rdi,0x20(%rsp)
mov    0x108(%rsp),%edi
mov    0x100(%rsp),%r10d
mov    0xf8(%rsp),%ebx
mov    0xf0(%rsp),%eax
mov    %rax,0x10(%rsp)
lea    0x0(%rbp,%rax,2),%edx
mov    %r8,%rax
mov    %r8,0x38(%rsp)
lea    -0x1(%r8),%eax
imul   0x110(%rsp),%eax
not    %eax
add    %edx,%eax
cltd
idiv   %r10d
mov    %eax,0x8(%rsp)
mov    %rcx,%rax
mov    %rcx,0x40(%rsp)
mov    %rbx,0x18(%rsp)
lea    (%rcx,%rbx,2),%edx
mov    %r9,%rax
mov    %r9,0x48(%rsp)
lea    -0x1(%r9),%eax
imul   0x118(%rsp),%eax
not    %eax
add    %edx,%eax
cltd
idiv   %edi
test   %esi,%esi
je     147d <neuralops_caffe_im2col+0x36d>
mov    %eax,%r8d
mov    0x120(%rsp),%r14
addl   $0x1,0x8(%rsp)
lea    0x1(%r8),%r9d
mov    0x40(%rsp),%rcx
mov    %ecx,%eax
imul   %ebp,%eax
movslq %eax,%rdx
mov    %r8d,%eax
lea    0x4(,%rax,4),%rbx
mov    %rbx,0xa0(%rsp)
add    $0x1,%rax
mov    %rax,0xa8(%rsp)
mov    0x18(%rsp),%rax
neg    %eax
mov    %rax,0x18(%rsp)
movslq %edi,%rbx
movslq %ecx,%rdi
mov    0x10(%rsp),%rax
neg    %eax
mov    %rax,0x10(%rsp)
movslq %r10d,%r10
movslq %ebp,%r11
shl    $0x2,%rdx
mov    %rdx,0x60(%rsp)
mov    %r10,%rax
imul   %rdi,%rax
shl    $0x2,%rax
mov    %rax,0x58(%rsp)
mov    %r8,0xb0(%rsp)
mov    %r9d,0x34(%rsp)
mov    %rdi,0x98(%rsp)
mov    %r10,0x90(%rsp)
mov    %r11,0x88(%rsp)
jmp    1262 <neuralops_caffe_im2col+0x152>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x60(%rsp),%rax
add    %rax,0x20(%rsp)
test   %esi,%esi
je     147d <neuralops_caffe_im2col+0x36d>
add    $0xffffffff,%esi
cmpl   $0x0,0x38(%rsp)
jle    1250 <neuralops_caffe_im2col+0x140>
movl   $0x0,0xc(%rsp)
mov    0x10(%rsp),%rax
mov    %eax,0x4(%rsp)
mov    %esi,0x28(%rsp)
mov    0x8(%rsp),%ebp
jmp    12b0 <neuralops_caffe_im2col+0x1a0>
nopw   0x0(%rax,%rax,1)
mov    0xc(%rsp),%eax
add    $0x1,%eax
mov    0x4(%rsp),%ecx
add    0x110(%rsp),%ecx
mov    %ecx,0x4(%rsp)
mov    %eax,0xc(%rsp)
cmp    0x38(%rsp),%eax
je     1250 <neuralops_caffe_im2col+0x140>
cmpl   $0x0,0x48(%rsp)
jle    1290 <neuralops_caffe_im2col+0x180>
movslq 0x4(%rsp),%rcx
mov    %rdi,%rax
mov    %rcx,0x78(%rsp)
imul   %rcx,%rax
lea    (%rbx,%rax,1),%rcx
mov    0x20(%rsp),%rdx
lea    (%rdx,%rax,4),%rax
mov    %rax,0x70(%rsp)
lea    (%rdx,%rcx,4),%rax
mov    %rax,0x68(%rsp)
xor    %ecx,%ecx
mov    0x18(%rsp),%rax
jmp    1310 <neuralops_caffe_im2col+0x200>
nopl   0x0(%rax)
mov    0x30(%rsp),%ecx
add    $0x1,%ecx
mov    0x2c(%rsp),%eax
add    0x118(%rsp),%eax
cmp    0x48(%rsp),%ecx
mov    0x28(%rsp),%esi
mov    0x8(%rsp),%ebp
je     1290 <neuralops_caffe_im2col+0x180>
test   %ebp,%ebp
mov    %ecx,0x30(%rsp)
mov    %eax,0x2c(%rsp)
je     12f0 <neuralops_caffe_im2col+0x1e0>
movslq %eax,%rcx
test   %ecx,%ecx
setns  %al
cmp    0x40(%rsp),%ecx
setl   %dl
and    %al,%dl
mov    %dl,0x3(%rsp)
mov    %rcx,0x50(%rsp)
lea    (%rcx,%rbx,1),%rax
mov    %rax,0x80(%rsp)
mov    0x68(%rsp),%r12
mov    0x70(%rsp),%r13
mov    0x78(%rsp),%r15
mov    0x58(%rsp),%rsi
jmp    136e <neuralops_caffe_im2col+0x25e>
nopl   0x0(%rax,%rax,1)
add    %r10,%r15
add    %rsi,%r13
add    %rsi,%r12
add    $0xffffffff,%ebp
je     12f0 <neuralops_caffe_im2col+0x1e0>
test   %r15,%r15
js     13a0 <neuralops_caffe_im2col+0x290>
cmp    %r11,%r15
jge    13a0 <neuralops_caffe_im2col+0x290>
test   %r9d,%r9d
je     1360 <neuralops_caffe_im2col+0x250>
test   $0x1,%r9b
jne    13f2 <neuralops_caffe_im2col+0x2e2>
mov    0x50(%rsp),%rcx
mov    %r9d,%eax
test   %r8d,%r8d
jne    1449 <neuralops_caffe_im2col+0x339>
jmp    1360 <neuralops_caffe_im2col+0x250>
cs nopw 0x0(%rax,%rax,1)
test   %r9d,%r9d
je     1360 <neuralops_caffe_im2col+0x250>
mov    %r14,%rdi
xor    %esi,%esi
mov    0xa0(%rsp),%rdx
call   1030 <memset@plt>
mov    0x58(%rsp),%rsi
mov    0x88(%rsp),%r11
mov    0x90(%rsp),%r10
mov    0x98(%rsp),%rdi
mov    0x34(%rsp),%r9d
mov    0xb0(%rsp),%r8
mov    0xa8(%rsp),%rax
lea    (%r14,%rax,4),%r14
jmp    1360 <neuralops_caffe_im2col+0x250>
xorps  %xmm0,%xmm0
cmpb   $0x0,0x3(%rsp)
je     1412 <neuralops_caffe_im2col+0x302>
mov    %r15,%rax
imul   %rdi,%rax
add    0x50(%rsp),%rax
mov    0x20(%rsp),%rcx
movss  (%rcx,%rax,4),%xmm0
movss  %xmm0,(%r14)
add    $0x4,%r14
mov    0x80(%rsp),%rcx
mov    %r8d,%eax
test   %r8d,%r8d
jne    1449 <neuralops_caffe_im2col+0x339>
jmp    1360 <neuralops_caffe_im2col+0x250>
movss  %xmm0,0x4(%r14)
add    $0x8,%r14
add    %rbx,%rdx
mov    %rdx,%rcx
add    $0xfffffffe,%eax
je     1360 <neuralops_caffe_im2col+0x250>
xorps  %xmm0,%xmm0
xorps  %xmm1,%xmm1
test   %rcx,%rcx
js     1463 <neuralops_caffe_im2col+0x353>
xorps  %xmm1,%xmm1
cmp    %rdi,%rcx
jge    1463 <neuralops_caffe_im2col+0x353>
movss  0x0(%r13,%rcx,4),%xmm1
movss  %xmm1,(%r14)
mov    %rcx,%rdx
add    %rbx,%rdx
js     1430 <neuralops_caffe_im2col+0x320>
cmp    %rdi,%rdx
jge    1430 <neuralops_caffe_im2col+0x320>
movss  (%r12,%rcx,4),%xmm0
jmp    1430 <neuralops_caffe_im2col+0x320>
add    $0xb8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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