void BoxCarAvg(float **avgarr, float **padarr, long nrow, long ncol, long krow,
               long kcol) {
  long i, row, col, n;
  double window;
  for (row = 0; row < nrow; row++) {
    window = 0;
    for (i = row; i < row + krow; i++) {
      for (col = 0; col < kcol; col++) {
        window += padarr[i][col];
      }
    }
    avgarr[row][0] = (float)window;
    for (col = 1; col < ncol; col++) {
      for (i = row; i < row + krow; i++) {
        window -= padarr[i][col - 1];
        window += padarr[i][col + kcol - 1];
      }
      avgarr[row][col] = (float)window;
    }
  }
  n = krow * kcol;
  for (row = 0; row < nrow; row++) {
    for (col = 0; col < ncol; col++) {
      avgarr[row][col] /= n;
    }
  }
}


x86 assembly (clang, -O0):
<BoxCarAvg>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    12af <BoxCarAvg+0x1af>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%rcx
add    -0x28(%rbp),%rcx
cmp    %rcx,%rax
jge    11b7 <BoxCarAvg+0xb7>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    11a1 <BoxCarAvg+0xa1>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    115f <BoxCarAvg+0x5f>
jmp    11a6 <BoxCarAvg+0xa6>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1142 <BoxCarAvg+0x42>
movsd  -0x58(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movss  %xmm0,(%rax)
movq   $0x1,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    1299 <BoxCarAvg+0x199>
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%rcx
add    -0x28(%rbp),%rcx
cmp    %rcx,%rax
jge    126a <BoxCarAvg+0x16a>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
sub    $0x1,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
add    -0x30(%rbp),%rcx
sub    $0x1,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11ee <BoxCarAvg+0xee>
movsd  -0x58(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    11d8 <BoxCarAvg+0xd8>
jmp    129e <BoxCarAvg+0x19e>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1124 <BoxCarAvg+0x24>
mov    -0x28(%rbp),%rax
imul   -0x30(%rbp),%rax
mov    %rax,-0x50(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1333 <BoxCarAvg+0x233>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    131d <BoxCarAvg+0x21d>
cvtsi2ssq -0x50(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    12da <BoxCarAvg+0x1da>
jmp    1322 <BoxCarAvg+0x222>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    12c4 <BoxCarAvg+0x1c4>
pop    %rbp
ret

x86 assembly (clang, -O2):
<BoxCarAvg>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,-0x8(%rsp)
test   %rdx,%rdx
jle    135c <BoxCarAvg+0x25c>
lea    -0x1(%r9),%rdi
mov    %r9d,%r12d
and    $0x3,%r12d
mov    %r9,%r11
and    $0xfffffffffffffffc,%r11
xor    %r14d,%r14d
jmp    113d <BoxCarAvg+0x3d>
nop
add    $0x1,%r14
cmp    %rdx,%r14
je     127c <BoxCarAvg+0x17c>
lea    (%r14,%r8,1),%r13
xorpd  %xmm0,%xmm0
test   %r8,%r8
jle    11f0 <BoxCarAvg+0xf0>
mov    %r14,%r15
jmp    116d <BoxCarAvg+0x6d>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r15
cmp    %r13,%r15
jge    11f0 <BoxCarAvg+0xf0>
test   %r9,%r9
jle    1160 <BoxCarAvg+0x60>
mov    (%rsi,%r15,8),%rax
xor    %ebx,%ebx
cmp    $0x3,%rdi
jb     11c3 <BoxCarAvg+0xc3>
xchg   %ax,%ax
movss  (%rax,%rbx,4),%xmm1
movss  0x4(%rax,%rbx,4),%xmm2
cvtss2sd %xmm1,%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  0x8(%rax,%rbx,4),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm0,%xmm1
movss  0xc(%rax,%rbx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
add    $0x4,%rbx
cmp    %rbx,%r11
jne    1180 <BoxCarAvg+0x80>
test   %r12,%r12
je     1160 <BoxCarAvg+0x60>
lea    (%rax,%rbx,4),%rax
xor    %ebx,%ebx
xchg   %ax,%ax
movss  (%rax,%rbx,4),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rbx
cmp    %rbx,%r12
jne    11d0 <BoxCarAvg+0xd0>
jmp    1160 <BoxCarAvg+0x60>
nopl   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
mov    -0x8(%rsp),%rax
mov    (%rax,%r14,8),%r15
movss  %xmm1,(%r15)
cmp    $0x2,%rcx
jl     1130 <BoxCarAvg+0x30>
mov    $0x1,%eax
jmp    123a <BoxCarAvg+0x13a>
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movss  %xmm1,(%r15,%rax,4)
add    $0x1,%rax
cmp    %rcx,%rax
je     1130 <BoxCarAvg+0x30>
test   %r8,%r8
jle    1220 <BoxCarAvg+0x120>
lea    (%rax,%r9,1),%rbx
add    $0xffffffffffffffff,%rbx
mov    %r14,%rbp
nopw   0x0(%rax,%rax,1)
mov    (%rsi,%rbp,8),%r10
movss  -0x4(%r10,%rax,4),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
movss  (%r10,%rbx,4),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rbp
cmp    %r13,%rbp
jl     1250 <BoxCarAvg+0x150>
jmp    1220 <BoxCarAvg+0x120>
test   %rdx,%rdx
jle    135c <BoxCarAvg+0x25c>
imul   %r8,%r9
xorps  %xmm0,%xmm0
cvtsi2ss %r9,%xmm0
lea    -0x4(%rcx),%r9
mov    %r9,%r10
shr    $0x2,%r10
add    $0x1,%r10
mov    %rcx,%r11
and    $0xfffffffffffffffc,%r11
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
mov    %r10,%r8
and    $0xfffffffffffffffe,%r8
xor    %r14d,%r14d
jmp    12cd <BoxCarAvg+0x1cd>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r14
cmp    %rdx,%r14
je     135c <BoxCarAvg+0x25c>
test   %rcx,%rcx
jle    12c0 <BoxCarAvg+0x1c0>
mov    -0x8(%rsp),%rax
mov    (%rax,%r14,8),%rsi
cmp    $0x4,%rcx
jae    12f0 <BoxCarAvg+0x1f0>
xor    %eax,%eax
jmp    1340 <BoxCarAvg+0x240>
cs nopw 0x0(%rax,%rax,1)
nop
cmp    $0x4,%r9
jae    12fa <BoxCarAvg+0x1fa>
xor    %ebx,%ebx
jmp    1322 <BoxCarAvg+0x222>
mov    %r8,%rax
xor    %ebx,%ebx
nop
movups (%rsi,%rbx,4),%xmm2
movups 0x10(%rsi,%rbx,4),%xmm3
divps  %xmm1,%xmm2
movups %xmm2,(%rsi,%rbx,4)
divps  %xmm1,%xmm3
movups %xmm3,0x10(%rsi,%rbx,4)
add    $0x8,%rbx
add    $0xfffffffffffffffe,%rax
jne    1300 <BoxCarAvg+0x200>
test   $0x1,%r10b
je     1333 <BoxCarAvg+0x233>
movups (%rsi,%rbx,4),%xmm2
divps  %xmm1,%xmm2
movups %xmm2,(%rsi,%rbx,4)
mov    %r11,%rax
cmp    %rcx,%r11
je     12c0 <BoxCarAvg+0x1c0>
nopl   0x0(%rax,%rax,1)
movss  (%rsi,%rax,4),%xmm2
divss  %xmm0,%xmm2
movss  %xmm2,(%rsi,%rax,4)
add    $0x1,%rax
cmp    %rax,%rcx
jne    1340 <BoxCarAvg+0x240>
jmp    12c0 <BoxCarAvg+0x1c0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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