void _dpc(float *ima, short *gpm, long *w, long *w2, long stride, long npix,
          long nw, long npassmax) {
  long i, k, n, npass;
  float val;
  npass = 0;
  while (nw && (npass < npassmax)) {
    for (i = 0; i < nw; i++) {
      val = 0.0f;
      n = 0l;
      w2[i] = 0l;
      k = w[i] - 1;
      if ((k >= 0) && (k < npix) && (gpm[k])) {
        val += ima[k];
        n++;
      }
      k = w[i] + 1;
      if ((k >= 0) && (k < npix) && (gpm[k])) {
        val += ima[k];
        n++;
      }
      k = w[i] - stride;
      if ((k >= 0) && (k < npix) && (gpm[k])) {
        val += ima[k];
        n++;
      }
      k = w[i] + stride;
      if ((k >= 0) && (k < npix) && (gpm[k])) {
        val += ima[k];
        n++;
      }
      if (n) {
        ima[w[i]] = val / (float)n;
        w2[i] = 1;
      }
    }
    k = 0;
    for (i = 0; i < nw; i++) {
      if (w2[i]) {
        gpm[w[i]] = 1;
      } else {
        w[k++] = w[i];
      }
    }
    nw = k;
    npass++;
  }
}


x86 assembly (clang, -O0):
<_dpc>:
push   %rbp
mov    %rsp,%rbp
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)
movq   $0x0,-0x50(%rbp)
xor    %eax,%eax
cmpq   $0x0,0x10(%rbp)
mov    %al,-0x55(%rbp)
je     114a <_dpc+0x4a>
mov    -0x50(%rbp),%rax
cmp    0x18(%rbp),%rax
setl   %al
mov    %al,-0x55(%rbp)
mov    -0x55(%rbp),%al
test   $0x1,%al
jne    115a <_dpc+0x5a>
jmp    1417 <_dpc+0x317>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    0x10(%rbp),%rax
jge    1379 <_dpc+0x279>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x54(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jl     11f5 <_dpc+0xf5>
mov    -0x40(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    11f5 <_dpc+0xf5>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     11f5 <_dpc+0xf5>
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jl     125a <_dpc+0x15a>
mov    -0x40(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    125a <_dpc+0x15a>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     125a <_dpc+0x15a>
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
sub    -0x28(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jl     12bf <_dpc+0x1bf>
mov    -0x40(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    12bf <_dpc+0x1bf>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     12bf <_dpc+0x1bf>
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jl     1324 <_dpc+0x224>
mov    -0x40(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    1324 <_dpc+0x224>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
je     1324 <_dpc+0x224>
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
je     1363 <_dpc+0x263>
movss  -0x54(%rbp),%xmm0
cvtsi2ssq -0x48(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x38(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%rcx
movq   $0x1,(%rax,%rcx,8)
jmp    1368 <_dpc+0x268>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1162 <_dpc+0x62>
movq   $0x0,-0x40(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    0x10(%rbp),%rax
jge    13fe <_dpc+0x2fe>
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     13c5 <_dpc+0x2c5>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x38(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
movw   $0x1,(%rax,%rcx,2)
jmp    13e8 <_dpc+0x2e8>
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %rdx,(%rax,%rcx,8)
jmp    13ed <_dpc+0x2ed>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1389 <_dpc+0x289>
mov    -0x40(%rbp),%rax
mov    %rax,0x10(%rbp)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
jmp    112c <_dpc+0x2c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_dpc>:
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x28(%rsp),%r14
test   %r14,%r14
je     12ca <_dpc+0x1ca>
mov    0x30(%rsp),%r10
test   %r10,%r10
jle    12ca <_dpc+0x1ca>
xor    %r11d,%r11d
xorps  %xmm0,%xmm0
nopl   0x0(%rax)
test   %r14,%r14
jle    12ca <_dpc+0x1ca>
xor    %ebx,%ebx
jmp    1170 <_dpc+0x70>
nopl   (%rax)
addss  (%rdi,%rax,4),%xmm1
add    $0x1,%r15
xorps  %xmm2,%xmm2
cvtsi2ss %r15d,%xmm2
divss  %xmm2,%xmm1
movss  %xmm1,(%rdi,%r12,4)
movq   $0x1,(%rcx,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r14
je     1220 <_dpc+0x120>
movq   $0x0,(%rcx,%rbx,8)
mov    (%rdx,%rbx,8),%r12
xorps  %xmm1,%xmm1
test   %r12,%r12
jle    11b0 <_dpc+0xb0>
cmp    %r9,%r12
jg     11b0 <_dpc+0xb0>
cmpw   $0x0,-0x2(%rsi,%r12,2)
je     11b0 <_dpc+0xb0>
movss  -0x4(%rdi,%r12,4),%xmm1
addss  %xmm0,%xmm1
mov    $0x1,%r15d
cmp    $0xffffffffffffffff,%r12
jge    11b9 <_dpc+0xb9>
jmp    11d7 <_dpc+0xd7>
nopl   0x0(%rax,%rax,1)
xor    %r15d,%r15d
cmp    $0xffffffffffffffff,%r12
jl     11d7 <_dpc+0xd7>
lea    0x1(%r12),%rax
cmp    %r9,%rax
jge    11d7 <_dpc+0xd7>
cmpw   $0x0,0x2(%rsi,%r12,2)
je     11d7 <_dpc+0xd7>
addss  0x4(%rdi,%r12,4),%xmm1
add    $0x1,%r15
mov    %r12,%rax
sub    %r8,%rax
js     11f4 <_dpc+0xf4>
cmp    %r9,%rax
jge    11f4 <_dpc+0xf4>
cmpw   $0x0,(%rsi,%rax,2)
je     11f4 <_dpc+0xf4>
addss  (%rdi,%rax,4),%xmm1
add    $0x1,%r15
mov    %r12,%rax
add    %r8,%rax
js     120c <_dpc+0x10c>
cmp    %r9,%rax
jge    120c <_dpc+0x10c>
cmpw   $0x0,(%rsi,%rax,2)
jne    1140 <_dpc+0x40>
test   %r15,%r15
jne    1149 <_dpc+0x49>
jmp    1163 <_dpc+0x63>
nopw   0x0(%rax,%rax,1)
test   %r14,%r14
jle    12ca <_dpc+0x1ca>
cmp    $0x1,%r14
jne    1250 <_dpc+0x150>
xor    %r12d,%r12d
xor    %ebx,%ebx
test   $0x1,%r14b
mov    %r12,%r14
je     12b8 <_dpc+0x1b8>
cmpq   $0x0,(%rcx,%rbx,8)
mov    (%rdx,%rbx,8),%rax
je     12ad <_dpc+0x1ad>
movw   $0x1,(%rsi,%rax,2)
jmp    12b5 <_dpc+0x1b5>
mov    %r14,%r15
and    $0xfffffffffffffffe,%r15
xor    %r12d,%r12d
xor    %ebx,%ebx
jmp    1271 <_dpc+0x171>
xchg   %ax,%ax
mov    %rax,(%rdx,%r12,8)
add    $0x1,%r12
add    $0x2,%rbx
cmp    %rbx,%r15
je     1234 <_dpc+0x134>
cmpq   $0x0,(%rcx,%rbx,8)
mov    (%rdx,%rbx,8),%rax
je     1290 <_dpc+0x190>
movw   $0x1,(%rsi,%rax,2)
jmp    1298 <_dpc+0x198>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rax,(%rdx,%r12,8)
add    $0x1,%r12
cmpq   $0x0,0x8(%rcx,%rbx,8)
mov    0x8(%rdx,%rbx,8),%rax
je     1260 <_dpc+0x160>
movw   $0x1,(%rsi,%rax,2)
jmp    1268 <_dpc+0x168>
mov    %rax,(%rdx,%r12,8)
add    $0x1,%r12
mov    %r12,%r14
test   %r14,%r14
je     12ca <_dpc+0x1ca>
add    $0x1,%r11
cmp    %r10,%r11
jl     1130 <_dpc+0x30>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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