void Ipol2(float *Data, int Dim_1, int Dim_2, float f_1, float f_2,
           float *value) {
  const float eps = 1e-4;
  int cnt;
  float *pval1, *pval2, *pval3, *pval4;
  float w1, w2, w3, w4;
  float weight;
  int i_1, i_2;
  float r_1, r_2;
  (i_1) = floor(f_1);
  (r_1) = (f_1) - (float)(i_1);
  (i_2) = floor(f_2);
  (r_2) = (f_2) - (float)(i_2);
  weight = 0.0;
  *value = 0.0;
  cnt = 0;
  if (!Data)
    return;
  pval1 = (Data) + ((i_1) + ((i_2) * (Dim_1)));
  if (r_1 < eps) {
    if (r_2 < eps) {
      cnt++;
      *value = *pval1;
    } else {
      cnt++;
      w1 = 1.0 - r_2;
      weight += w1;
      *value += *pval1 * w1;
      pval4 = (pval1) + (Dim_1);
      cnt++;
      w4 = r_2;
      weight += w4;
      *value += *pval4 * w4;
      if (cnt)
        *value = *value / weight;
    }
  } else {
    if (r_2 < eps) {
      cnt++;
      w1 = (1 - r_1);
      weight += w1;
      *value = *pval1 * w1;
      pval2 = (pval1) + 1;
      cnt++;
      w2 = r_1;
      weight += w2;
      *value += *pval2 * w2;
      if (cnt)
        *value = *value / weight;
    } else {
      cnt++;
      w1 = (1.0 - r_1) * (1.0 - r_2);
      weight += w1;
      *value += *pval1 * w1;
      pval2 = (pval1) + 1;
      cnt++;
      w2 = r_1 * (1.0 - r_2);
      weight += w2;
      *value += *pval2 * w2;
      pval4 = (pval1) + (Dim_1);
      cnt++;
      w4 = (1.0 - r_1) * r_2;
      weight += w4;
      *value += *pval4 * w4;
      pval3 = (pval1) + (1 + (Dim_1));
      cnt++;
      w3 = r_1 * r_2;
      weight += w3;
      *value += *pval3 * w3;
      if (cnt)
        *value = *value / weight;
    }
  }
}


x86 assembly (clang, -O0):
<Ipol2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movss  0xec8(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x60(%rbp)
movss  -0x14(%rbp),%xmm0
cvtsi2ssl -0x60(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x68(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x64(%rbp)
movss  -0x18(%rbp),%xmm0
cvtsi2ssl -0x64(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x6c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movl   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x8(%rbp)
jne    11b7 <Ipol2+0xa7>
jmp    1591 <Ipol2+0x481>
mov    -0x8(%rbp),%rax
mov    -0x60(%rbp),%ecx
mov    -0x64(%rbp),%edx
imul   -0xc(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
movss  0xe23(%rip),%xmm0
ucomiss -0x68(%rbp),%xmm0
jbe    12ed <Ipol2+0x1dd>
movss  0xe11(%rip),%xmm0
ucomiss -0x6c(%rbp),%xmm0
jbe    1217 <Ipol2+0x107>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12e8 <Ipol2+0x1d8>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x6c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdd7(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x4c(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x6c(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x58(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x58(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
cmpl   $0x0,-0x28(%rbp)
je     12e3 <Ipol2+0x1d3>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
divss  -0x5c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12e8 <Ipol2+0x1d8>
jmp    1591 <Ipol2+0x481>
movss  0xd0b(%rip),%xmm0
ucomiss -0x6c(%rbp),%xmm0
jbe    13b1 <Ipol2+0x2a1>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  0xcf4(%rip),%xmm0
subss  -0x68(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
mulss  -0x4c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x68(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x50(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x50(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
cmpl   $0x0,-0x28(%rbp)
je     13ac <Ipol2+0x29c>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
divss  -0x5c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    158c <Ipol2+0x47c>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x68(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc3d(%rip),%xmm0
subsd  %xmm1,%xmm0
movss  -0x6c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xc28(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x4c(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x68(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x6c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xbb8(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x50(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x50(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x68(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb4a(%rip),%xmm0
subsd  %xmm1,%xmm0
movss  -0x6c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x58(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x58(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movss  -0x68(%rbp),%xmm0
mulss  -0x6c(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x54(%rbp),%xmm0
addss  -0x5c(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x40(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x54(%rbp),%xmm2
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
cmpl   $0x0,-0x28(%rbp)
je     1587 <Ipol2+0x477>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
divss  -0x5c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    158c <Ipol2+0x47c>
jmp    1591 <Ipol2+0x481>
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Ipol2>:
push   %rbp
push   %r14
push   %rbx
sub    $0x30,%rsp
mov    %rcx,%rbx
movaps %xmm0,(%rsp)
mov    %esi,%r14d
mov    %rdi,%rbp
movaps %xmm1,0x20(%rsp)
movaps %xmm1,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,0x10(%rsp)
movaps (%rsp),%xmm0
call   1030 <floorf@plt>
movl   $0x0,(%rbx)
test   %rbp,%rbp
je     12b7 <Ipol2+0x1a7>
movaps (%rsp),%xmm3
unpcklps 0x20(%rsp),%xmm3
unpcklps 0x10(%rsp),%xmm0
cvttps2dq %xmm0,%xmm0
cvtdq2ps %xmm0,%xmm1
subps  %xmm1,%xmm3
pshufd $0x55,%xmm0,%xmm1
movd   %xmm1,%eax
imul   %r14d,%eax
movd   %xmm0,%ecx
add    %eax,%ecx
movslq %ecx,%rax
lea    0x0(,%rax,4),%rax
add    %rbp,%rax
movss  0xe70(%rip),%xmm1
ucomiss %xmm3,%xmm1
movaps %xmm3,%xmm0
shufps $0x55,%xmm3,%xmm0
jbe    11aa <Ipol2+0x9a>
ucomiss %xmm0,%xmm1
jbe    11e4 <Ipol2+0xd4>
movss  (%rax),%xmm1
jmp    12b3 <Ipol2+0x1a3>
ucomiss %xmm0,%xmm1
jbe    1218 <Ipol2+0x108>
movss  0xe4d(%rip),%xmm0
subss  %xmm3,%xmm0
movss  (%rax),%xmm2
mulss  %xmm0,%xmm2
movss  %xmm2,(%rbx)
movss  0x4(%rax),%xmm1
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
xorps  %xmm2,%xmm2
addss  %xmm0,%xmm2
addss  %xmm3,%xmm2
jmp    12af <Ipol2+0x19f>
movss  0xe18(%rip),%xmm2
subss  %xmm0,%xmm2
movss  (%rax),%xmm3
mulss  %xmm2,%xmm3
xorps  %xmm4,%xmm4
addss  %xmm4,%xmm3
movss  %xmm3,(%rbx)
movslq %r14d,%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  %xmm0,%xmm1
addss  %xmm3,%xmm1
jmp    12a7 <Ipol2+0x197>
cvtps2pd %xmm3,%xmm1
movapd 0xded(%rip),%xmm4
subpd  %xmm1,%xmm4
movapd %xmm4,%xmm5
unpckhpd %xmm4,%xmm5
movapd %xmm4,%xmm2
mulsd  %xmm5,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  (%rax),%xmm6
mulss  %xmm2,%xmm6
xorps  %xmm8,%xmm8
addss  %xmm8,%xmm6
movss  %xmm6,(%rbx)
mulsd  %xmm1,%xmm5
cvtsd2ss %xmm5,%xmm5
movss  0x4(%rax),%xmm7
mulss  %xmm5,%xmm7
addss  %xmm6,%xmm7
movss  %xmm7,(%rbx)
movslq %r14d,%rcx
unpckhpd %xmm1,%xmm1
mulsd  %xmm4,%xmm1
xorps  %xmm4,%xmm4
cvtsd2ss %xmm1,%xmm4
movss  (%rax,%rcx,4),%xmm6
mulss  %xmm4,%xmm6
addss  %xmm7,%xmm6
movss  %xmm6,(%rbx)
mulss  %xmm3,%xmm0
movss  0x4(%rax,%rcx,4),%xmm1
mulss  %xmm0,%xmm1
addss  %xmm6,%xmm1
addss  %xmm8,%xmm2
addss  %xmm5,%xmm2
addss  %xmm4,%xmm2
addss  %xmm0,%xmm2
divss  %xmm2,%xmm1
movss  %xmm1,(%rbx)
add    $0x30,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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