void _bilinear(float *image, long nx, long ny, float *out, float *xout,
               float *yout, long nout, long skipoutside) {
  long i;
  long i0, j0, i1, j1, i00, i01, i10, i11;
  float wi, wj, w00, w01, w10, w11;
  for (i = 0; i < nout; i++) {
    if (((xout[i] < 1) | (xout[i] > nx) | (yout[i] < 1) | (yout[i] > ny)) &
        skipoutside)
      continue;
    i0 = (long)(xout[i]) - 1;
    j0 = (long)(yout[i]) - 1;
    i1 = i0 + 1;
    j1 = j0 + 1;
    if (i0 < 0)
      i0 = 0;
    if (i0 > (nx - 1))
      i0 = nx - 1;
    if (j0 < 0)
      j0 = 0;
    if (j0 > (ny - 1))
      j0 = ny - 1;
    if (i1 < 0)
      i1 = 0;
    if (i1 > (nx - 1))
      i1 = nx - 1;
    if (j1 < 0)
      j1 = 0;
    if (j1 > (ny - 1))
      j1 = ny - 1;
    i00 = i0 + nx * j0;
    i10 = i1 + nx * j0;
    i01 = i0 + nx * j1;
    i11 = i1 + nx * j1;
    wi = 1.0f - (xout[i] - (long)(xout[i]));
    wj = 1.0f - (yout[i] - (long)(yout[i]));
    w00 = wi * wj;
    w10 = (1 - wi) * wj;
    w01 = wi * (1 - wj);
    w11 = (1 - wi) * (1 - wj);
    out[i] = image[i00] * w00 + image[i10] * w10 + image[i01] * w01 +
             image[i11] * w11;
  }
}


x86 assembly (clang, -O0):
<_bilinear>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
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,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    0x10(%rbp),%rax
jge    1498 <_bilinear+0x398>
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  0xeb2(%rip),%xmm0
ucomiss (%rax,%rcx,4),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x28(%rbp),%rcx
mov    -0x38(%rbp),%rdx
movss  (%rcx,%rdx,4),%xmm0
cvtsi2ssq -0x10(%rbp),%xmm1
ucomiss %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdx
movss  0xe75(%rip),%xmm0
ucomiss (%rcx,%rdx,4),%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%rdx
movss  (%rcx,%rdx,4),%xmm0
cvtsi2ssq -0x18(%rbp),%xmm1
ucomiss %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
or     %ecx,%eax
cltq
and    0x18(%rbp),%rax
cmp    $0x0,%rax
je     11d0 <_bilinear+0xd0>
jmp    1487 <_bilinear+0x387>
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%rax
sub    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x40(%rbp)
jge    1227 <_bilinear+0x127>
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jle    1248 <_bilinear+0x148>
mov    -0x10(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x48(%rbp)
jge    125b <_bilinear+0x15b>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jle    127c <_bilinear+0x17c>
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x50(%rbp)
jge    128f <_bilinear+0x18f>
movq   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jle    12b0 <_bilinear+0x1b0>
mov    -0x10(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x58(%rbp)
jge    12c3 <_bilinear+0x1c3>
movq   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jle    12e4 <_bilinear+0x1e4>
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x58(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x10(%rbp),%rcx
imul   -0x48(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
imul   -0x48(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x10(%rbp),%rcx
imul   -0x58(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x10(%rbp),%rcx
imul   -0x58(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%rax
cvtsi2ss %rax,%xmm0
subss  %xmm0,%xmm1
movss  0xca0(%rip),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x7c(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%rax
cvtsi2ss %rax,%xmm0
subss  %xmm0,%xmm1
movss  0xc6b(%rip),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x80(%rbp)
movss  -0x7c(%rbp),%xmm0
mulss  -0x80(%rbp),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
movss  0xc48(%rip),%xmm0
subss  -0x7c(%rbp),%xmm0
mulss  -0x80(%rbp),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
movss  -0x7c(%rbp),%xmm0
movss  0xc29(%rip),%xmm1
subss  -0x80(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x88(%rbp)
ff
movss  0xc10(%rip),%xmm0
subss  -0x7c(%rbp),%xmm0
movss  0xc03(%rip),%xmm1
subss  -0x80(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x60(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x84(%rbp),%xmm2
ff
mov    -0x8(%rbp),%rax
mov    -0x70(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  -0x8c(%rbp),%xmm1
ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x68(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x88(%rbp),%xmm2
ff
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
mov    -0x78(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x90(%rbp),%xmm2
ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1130 <_bilinear+0x30>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_bilinear>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,-0x8(%rsp)
mov    %rdx,-0x28(%rsp)
mov    %rdi,-0x10(%rsp)
mov    0x38(%rsp),%r15
test   %r15,%r15
jle    12a3 <_bilinear+0x1a3>
cvtsi2ss %rsi,%xmm0
mov    0x40(%rsp),%r14
mov    -0x28(%rsp),%rax
cvtsi2ss %rax,%xmm1
lea    -0x1(%rsi),%rcx
mov    %rcx,-0x18(%rsp)
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rsp)
xor    %r11d,%r11d
movss  0xea8(%rip),%xmm2
mov    -0x18(%rsp),%rdx
jmp    116d <_bilinear+0x6d>
nop
add    $0x1,%r11
cmp    %r11,%r15
je     12a3 <_bilinear+0x1a3>
movss  (%r8,%r11,4),%xmm3
ucomiss %xmm3,%xmm2
seta   %cl
ucomiss %xmm0,%xmm3
seta   %bl
or     %cl,%bl
movss  (%r9,%r11,4),%xmm4
ucomiss %xmm4,%xmm2
seta   %cl
ucomiss %xmm1,%xmm4
seta   %al
or     %cl,%al
or     %bl,%al
movzbl %al,%eax
and    %r14d,%eax
test   $0x1,%al
jne    1160 <_bilinear+0x60>
cvttss2si %xmm3,%r10
cvttss2si %xmm4,%rbp
test   %rbp,%rbp
mov    $0x1,%eax
cmovg  %rbp,%rax
mov    $0x0,%ebx
cmovns %rbp,%rbx
test   %r10,%r10
mov    $0x1,%ecx
cmovg  %r10,%rcx
mov    %r8,%rdi
mov    %r9,%r8
mov    %r14,%r9
mov    $0x0,%r14d
cmovns %r10,%r14
lea    -0x1(%rcx),%r12
cmp    %rsi,%rcx
cmovg  %rdx,%r12
lea    -0x1(%rax),%r13
mov    -0x28(%rsp),%rcx
cmp    %rcx,%rax
mov    -0x20(%rsp),%rax
cmovg  %rax,%r13
cmp    %rsi,%r14
cmovge %rdx,%r14
cmp    %rcx,%rbx
cmovge %rax,%rbx
imul   %rsi,%r13
lea    (%r12,%r13,1),%rcx
add    %r14,%r13
imul   %rsi,%rbx
add    %rbx,%r12
add    %r14,%rbx
mov    %r9,%r14
mov    %r8,%r9
mov    %rdi,%r8
xorps  %xmm5,%xmm5
cvtsi2ss %r10,%xmm5
subss  %xmm3,%xmm5
addss  %xmm2,%xmm5
xorps  %xmm3,%xmm3
cvtsi2ss %rbp,%xmm3
subss  %xmm4,%xmm3
addss  %xmm2,%xmm3
movaps %xmm5,%xmm4
mulss  %xmm3,%xmm4
movaps %xmm2,%xmm6
subss  %xmm5,%xmm6
movaps %xmm2,%xmm7
subss  %xmm3,%xmm7
mulss  %xmm7,%xmm5
mulss  %xmm6,%xmm7
mulss  %xmm3,%xmm6
mov    -0x10(%rsp),%rax
mulss  (%rax,%r13,4),%xmm6
mulss  (%rax,%rcx,4),%xmm4
addss  %xmm6,%xmm4
mulss  (%rax,%r12,4),%xmm5
addss  %xmm4,%xmm5
mulss  (%rax,%rbx,4),%xmm7
addss  %xmm5,%xmm7
mov    -0x8(%rsp),%rax
movss  %xmm7,(%rax,%r11,4)
jmp    1160 <_bilinear+0x60>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @_bilinear(float* nocapture %0, i64 %1, i64 %2, float* nocapture writeonly %3, float* nocapture %4, float* nocapture %5, i64 %6, i64 %7) {
%9 = icmp sgt i64 %6, 0
br i1 %9, label %10, label %86
10: ; preds = %8
%11 = sitofp i64 %1 to float
%12 = sitofp i64 %2 to float
%13 = add nsw i64 %1, -1
%14 = add nsw i64 %2, -1
br label %15
15: ; preds = %10, %83
%16 = phi i64 [ 0, %10 ], [ %84, %83 ]
%17 = getelementptr inbounds float, float* %4, i64 %16
%18 = load float, float* %17
%19 = fcmp olt float %18, 1.000000e+00
%20 = fcmp ogt float %18, %11
%21 = or i1 %19, %20
%22 = getelementptr inbounds float, float* %5, i64 %16
%23 = load float, float* %22
%24 = fcmp olt float %23, 1.000000e+00
%25 = or i1 %21, %24
%26 = fcmp ogt float %23, %12
%27 = or i1 %26, %25
%28 = zext i1 %27 to i64
%29 = and i64 %28, %7
%30 = icmp eq i64 %29, 0
br i1 %30, label %31, label %83
31: ; preds = %15
%32 = fptosi float %18 to i64
%33 = fptosi float %23 to i64
%34 = icmp sgt i64 %32, 1
%35 = select i1 %34, i64 %32, i64 1
%36 = add nsw i64 %35, -1
%37 = icmp sgt i64 %35, %1
%38 = select i1 %37, i64 %13, i64 %36
%39 = icmp sgt i64 %33, 1
%40 = select i1 %39, i64 %33, i64 1
%41 = add nsw i64 %40, -1
%42 = icmp sgt i64 %40, %2
%43 = select i1 %42, i64 %14, i64 %41
%44 = icmp sgt i64 %32, 0
%45 = select i1 %44, i64 %32, i64 0
%46 = icmp slt i64 %45, %1
%47 = select i1 %46, i64 %45, i64 %13
%48 = icmp sgt i64 %33, 0
%49 = select i1 %48, i64 %33, i64 0
%50 = icmp slt i64 %49, %2
%51 = select i1 %50, i64 %49, i64 %14
%52 = mul nsw i64 %43, %1
%53 = add nsw i64 %52, %38
%54 = add nsw i64 %52, %47
%55 = mul nsw i64 %51, %1
%56 = add nsw i64 %55, %38
%57 = add nsw i64 %55, %47
%58 = sitofp i64 %32 to float
%59 = fsub float %58, %18
%60 = fadd float %59, 1.000000e+00
%61 = sitofp i64 %33 to float
%62 = fsub float %61, %23
%63 = fadd float %62, 1.000000e+00
%64 = fmul float %60, %63
%65 = fsub float 1.000000e+00, %60
%66 = fmul float %65, %63
%67 = fsub float 1.000000e+00, %63
%68 = fmul float %60, %67
%69 = fmul float %65, %67
%70 = getelementptr inbounds float, float* %0, i64 %53
%71 = load float, float* %70
%72 = getelementptr inbounds float, float* %0, i64 %54
%73 = load float, float* %72
%74 = fmul float %66, %73
%75 = tail call float @llvm.fmuladd.f32(float %71, float %64, float %74)
%76 = getelementptr inbounds float, float* %0, i64 %56
%77 = load float, float* %76
%78 = tail call float @llvm.fmuladd.f32(float %77, float %68, float %75)
%79 = getelementptr inbounds float, float* %0, i64 %57
%80 = load float, float* %79
%81 = tail call float @llvm.fmuladd.f32(float %80, float %69, float %78)
%82 = getelementptr inbounds float, float* %3, i64 %16
store float %81, float* %82
br label %83
83: ; preds = %15, %31
%84 = add nuw nsw i64 %16, 1
%85 = icmp eq i64 %84, %6
br i1 %85, label %86, label %15
86: ; preds = %83, %8
ret void
}