double spline(int image[4][4], double x, double y) {
  double column[4];
  double a0, a1, a2, a3;
  double x_plus_1, y_plus_1;
  double one_minus_x, one_minus_y;
  int i;
  double pixel;
  if (x == 0 && y == 0) {
    return (double)image[1][1];
  }
  if (x == 0) {
    for (i = 0; i < 4; i++) {
      column[i] = (double)image[i][1];
    }
  } else {
    x_plus_1 = x + 1;
    one_minus_x = 1 - x;
    a0 = ((-0.16666666 * x_plus_1 + 1) * x_plus_1 - 2) * x_plus_1 + 1.33333;
    a1 = (0.5 * x - 1) * x * x + 0.66666667;
    a2 = (0.5 * one_minus_x - 1) * one_minus_x * one_minus_x + 0.66666667;
    a3 = 1 - a0 - a1 - a2;
    if (y == 0) {
      return (a0 * image[1][0] + a1 * image[1][1] + a2 * image[1][2] +
              a3 * image[1][3]);
    }
    for (i = 0; i < 4; i++) {
      column[i] = a0 * image[i][0] + a1 * image[i][1] + a2 * image[i][2] +
                  a3 * image[i][3];
    }
  }
  y_plus_1 = y + 1;
  one_minus_y = 1 - y;
  a0 = ((-0.16666666 * y_plus_1 + 1) * y_plus_1 - 2) * y_plus_1 + 1.33333;
  a1 = (0.5 * y - 1) * y * y + 0.66666667;
  a2 = (0.5 * one_minus_y - 1) * one_minus_y * one_minus_y + 0.66666667;
  a3 = 1 - a0 - a1 - a2;
  pixel = column[0] * a0 + column[1] * a1 + column[2] * a2 + column[3] * a3;
  return pixel;
}


x86 assembly (clang, -O0):
<spline>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1159 <spline+0x59>
jp     1159 <spline+0x59>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1159 <spline+0x59>
jp     1159 <spline+0x59>
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x14(%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1560 <spline+0x460>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11c5 <spline+0xc5>
jp     11c5 <spline+0xc5>
movl   $0x0,-0x84(%rbp)
cmpl   $0x4,-0x84(%rbp)
jge    11c0 <spline+0xc0>
mov    -0x10(%rbp),%rax
movslq -0x84(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cvtsi2sdl 0x4(%rax),%xmm0
movslq -0x84(%rbp),%rax
movsd  %xmm0,-0x40(%rbp,%rax,8)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    117b <spline+0x7b>
jmp    1407 <spline+0x307>
movsd  0xe33(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xe21(%rip),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  0xe3a(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdfe(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe11(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdf4(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xdce(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdca(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xda0(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  0xd92(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd8e(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd64(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xd4b(%rip),%xmm0
subsd  -0x48(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    133f <spline+0x23f>
jp     133f <spline+0x23f>
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x10(%rax),%xmm2
movsd  -0x50(%rbp),%xmm1
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x14(%rax),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x58(%rbp),%xmm1
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x18(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
cvtsi2sdl 0x1c(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1560 <spline+0x460>
movl   $0x0,-0x84(%rbp)
cmpl   $0x4,-0x84(%rbp)
jge    1402 <spline+0x302>
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x84(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cvtsi2sdl (%rax),%xmm2
movsd  -0x50(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x84(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cvtsi2sdl 0x4(%rax),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x58(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x84(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cvtsi2sdl 0x8(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x84(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cvtsi2sdl 0xc(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movslq -0x84(%rbp),%rax
movsd  %xmm0,-0x40(%rbp,%rax,8)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1349 <spline+0x249>
jmp    1407 <spline+0x307>
movsd  0xbf1(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  0xbdf(%rip),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  0xbf8(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbbc(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbcf(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbb2(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xb8c(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb88(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb5e(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  0xb50(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb4c(%rip),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x80(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb22(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xb09(%rip),%xmm0
subsd  -0x48(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<spline>:
movapd %xmm0,%xmm2
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
jne    1121 <spline+0x21>
jp     1121 <spline+0x21>
ucomisd %xmm0,%xmm1
jne    1121 <spline+0x21>
jp     1121 <spline+0x21>
xorps  %xmm0,%xmm0
cvtsi2sdl 0x14(%rdi),%xmm0
ret
ucomisd %xmm0,%xmm2
jne    1213 <spline+0x113>
jp     1213 <spline+0x113>
movss  0x24(%rdi),%xmm0
movss  0x34(%rdi),%xmm2
unpcklps %xmm0,%xmm2
movss  0x4(%rdi),%xmm0
movss  0x14(%rdi),%xmm3
unpcklps %xmm0,%xmm3
cvtdq2pd %xmm3,%xmm4
cvtdq2pd %xmm2,%xmm0
movsd  0xea5(%rip),%xmm2
movapd %xmm1,%xmm5
addsd  %xmm2,%xmm5
movapd %xmm2,%xmm6
subsd  %xmm1,%xmm6
movsd  0xe95(%rip),%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm5,%xmm3
addsd  0xe89(%rip),%xmm3
mulsd  %xmm5,%xmm3
addsd  0xe85(%rip),%xmm3
movsd  0xe85(%rip),%xmm5
movapd %xmm1,%xmm7
mulsd  %xmm5,%xmm7
movsd  0xe7c(%rip),%xmm8
addsd  %xmm8,%xmm7
mulsd  %xmm1,%xmm7
mulsd  %xmm1,%xmm7
movsd  0xe6f(%rip),%xmm1
addsd  %xmm1,%xmm7
mulsd  %xmm6,%xmm5
addsd  %xmm8,%xmm5
mulsd  %xmm6,%xmm5
mulsd  %xmm6,%xmm5
addsd  %xmm1,%xmm5
subsd  %xmm3,%xmm2
subsd  %xmm7,%xmm2
subsd  %xmm5,%xmm2
mulsd  %xmm4,%xmm7
unpckhpd %xmm4,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm7,%xmm4
movapd %xmm0,%xmm1
unpckhpd %xmm0,%xmm1
mulsd  %xmm5,%xmm1
addsd  %xmm4,%xmm1
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm2
movapd %xmm2,%xmm0
ret
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
movsd  0xddd(%rip),%xmm0
movapd %xmm2,%xmm3
addsd  %xmm0,%xmm3
movapd %xmm0,%xmm6
movsd  0xdd1(%rip),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm0,%xmm4
mulsd  %xmm3,%xmm4
addsd  0xdc5(%rip),%xmm4
subsd  %xmm2,%xmm6
mulsd  %xmm3,%xmm4
addsd  0xdbd(%rip),%xmm4
movsd  0xdbd(%rip),%xmm3
movapd %xmm2,%xmm5
mulsd  %xmm3,%xmm5
movsd  0xdb5(%rip),%xmm7
addsd  %xmm7,%xmm5
mulsd  %xmm2,%xmm5
mulsd  %xmm2,%xmm5
movsd  0xda9(%rip),%xmm2
addsd  %xmm2,%xmm5
mulsd  %xmm6,%xmm3
addsd  %xmm7,%xmm3
mulsd  %xmm6,%xmm3
mulsd  %xmm6,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm4,%xmm0
subsd  %xmm5,%xmm0
subsd  %xmm3,%xmm0
jne    12ec <spline+0x1ec>
jp     12ec <spline+0x1ec>
xorps  %xmm1,%xmm1
cvtsi2sdl 0x10(%rdi),%xmm1
xorps  %xmm2,%xmm2
cvtsi2sdl 0x14(%rdi),%xmm2
mulsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm4
addsd  %xmm5,%xmm4
xorps  %xmm1,%xmm1
cvtsi2sdl 0x18(%rdi),%xmm1
mulsd  %xmm1,%xmm3
addsd  %xmm4,%xmm3
xorps  %xmm1,%xmm1
cvtsi2sdl 0x1c(%rdi),%xmm1
mulsd  %xmm1,%xmm0
addsd  %xmm3,%xmm0
ret
movss  0x20(%rdi),%xmm2
movss  0x30(%rdi),%xmm6
unpcklps %xmm2,%xmm6
cvtdq2pd %xmm6,%xmm8
movss  (%rdi),%xmm2
movss  0x10(%rdi),%xmm7
unpcklps %xmm2,%xmm7
cvtdq2pd %xmm7,%xmm2
movss  0x24(%rdi),%xmm7
movss  0x34(%rdi),%xmm6
unpcklps %xmm7,%xmm6
movss  0x4(%rdi),%xmm9
movss  0x14(%rdi),%xmm7
unpcklps %xmm9,%xmm7
cvtdq2pd %xmm7,%xmm7
cvtdq2pd %xmm6,%xmm6
unpcklpd %xmm5,%xmm5
mulpd  %xmm5,%xmm6
mulpd  %xmm7,%xmm5
unpcklpd %xmm4,%xmm4
mulpd  %xmm4,%xmm2
addpd  %xmm5,%xmm2
mulpd  %xmm8,%xmm4
addpd  %xmm6,%xmm4
movss  0x28(%rdi),%xmm5
movss  0x38(%rdi),%xmm6
unpcklps %xmm5,%xmm6
movss  0x8(%rdi),%xmm5
movss  0x18(%rdi),%xmm7
unpcklps %xmm5,%xmm7
cvtdq2pd %xmm7,%xmm5
cvtdq2pd %xmm6,%xmm6
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm6
addpd  %xmm4,%xmm6
mulpd  %xmm5,%xmm3
addpd  %xmm2,%xmm3
movss  0x2c(%rdi),%xmm2
movss  0x3c(%rdi),%xmm4
unpcklps %xmm2,%xmm4
cvtdq2pd %xmm4,%xmm2
movss  0xc(%rdi),%xmm4
movss  0x1c(%rdi),%xmm5
unpcklps %xmm4,%xmm5
cvtdq2pd %xmm5,%xmm4
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm4
addpd  %xmm3,%xmm4
mulpd  %xmm2,%xmm0
addpd  %xmm6,%xmm0
jmp    1153 <spline+0x53>

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

LLVM IR (-O2):
define double @spline([4 x i32]* nocapture %0, double %1, double %2) {
%4 = fcmp oeq double %1, 0.000000e+00
%5 = fcmp oeq double %2, 0.000000e+00
%6 = and i1 %4, %5
br i1 %6, label %7, label %11
7: ; preds = %3
%8 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%9 = load i32, i32* %8
%10 = sitofp i32 %9 to double
br label %147
11: ; preds = %3
br i1 %4, label %12, label %26
12: ; preds = %11
%13 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 1
%14 = load i32, i32* %13
%15 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%16 = load i32, i32* %15
%17 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%18 = load i32, i32* %17
%19 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 1
%20 = load i32, i32* %19
%21 = insertelement <4 x i32> poison, i32 %20, i64 0
%22 = insertelement <4 x i32> %21, i32 %18, i64 1
%23 = insertelement <4 x i32> %22, i32 %16, i64 2
%24 = insertelement <4 x i32> %23, i32 %14, i64 3
%25 = sitofp <4 x i32> %24 to <4 x double>
br label %123
26: ; preds = %11
%27 = fadd double %1, 1.000000e+00
%28 = fsub double 1.000000e+00, %1
%29 = tail call double @llvm.fmuladd.f64(double %27, double 0xBFC5555547044B69, double 1.000000e+00)
%30 = tail call double @llvm.fmuladd.f64(double %29, double %27, double -2.000000e+00)
%31 = tail call double @llvm.fmuladd.f64(double %30, double %27, double 1.333330e+00)
%32 = tail call double @llvm.fmuladd.f64(double %1, double 5.000000e-01, double -1.000000e+00)
%33 = fmul double %32, %1
%34 = tail call double @llvm.fmuladd.f64(double %33, double %1, double 0x3FE55555571F7693)
%35 = tail call double @llvm.fmuladd.f64(double %28, double 5.000000e-01, double -1.000000e+00)
%36 = fmul double %28, %35
%37 = tail call double @llvm.fmuladd.f64(double %36, double %28, double 0x3FE55555571F7693)
%38 = fsub double 1.000000e+00, %31
%39 = fsub double %38, %34
%40 = fsub double %39, %37
br i1 %5, label %106, label %41
41: ; preds = %26
%42 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 0
%43 = load i32, i32* %42
%44 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 1
%45 = load i32, i32* %44
%46 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 2
%47 = load i32, i32* %46
%48 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 3
%49 = load i32, i32* %48
%50 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 0
%51 = load i32, i32* %50
%52 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%53 = load i32, i32* %52
%54 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%55 = load i32, i32* %54
%56 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 3
%57 = load i32, i32* %56
%58 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 0
%59 = load i32, i32* %58
%60 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%61 = load i32, i32* %60
%62 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 2
%63 = load i32, i32* %62
%64 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 3
%65 = load i32, i32* %64
%66 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 0
%67 = load i32, i32* %66
%68 = insertelement <4 x i32> poison, i32 %67, i64 0
%69 = insertelement <4 x i32> %68, i32 %59, i64 1
%70 = insertelement <4 x i32> %69, i32 %51, i64 2
%71 = insertelement <4 x i32> %70, i32 %43, i64 3
%72 = sitofp <4 x i32> %71 to <4 x double>
%73 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 1
%74 = load i32, i32* %73
%75 = insertelement <4 x i32> poison, i32 %74, i64 0
%76 = insertelement <4 x i32> %75, i32 %61, i64 1
%77 = insertelement <4 x i32> %76, i32 %53, i64 2
%78 = insertelement <4 x i32> %77, i32 %45, i64 3
%79 = sitofp <4 x i32> %78 to <4 x double>
%80 = insertelement <4 x double> poison, double %34, i64 0
%81 = shufflevector <4 x double> %80, <4 x double> poison, <4 x i32> zeroinitializer
%82 = fmul <4 x double> %81, %79
%83 = insertelement <4 x double> poison, double %31, i64 0
%84 = shufflevector <4 x double> %83, <4 x double> poison, <4 x i32> zeroinitializer
%85 = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> %84, <4 x double> %72, <4 x double> %82)
%86 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 2
%87 = load i32, i32* %86
%88 = insertelement <4 x i32> poison, i32 %87, i64 0
%89 = insertelement <4 x i32> %88, i32 %63, i64 1
%90 = insertelement <4 x i32> %89, i32 %55, i64 2
%91 = insertelement <4 x i32> %90, i32 %47, i64 3
%92 = sitofp <4 x i32> %91 to <4 x double>
%93 = insertelement <4 x double> poison, double %37, i64 0
%94 = shufflevector <4 x double> %93, <4 x double> poison, <4 x i32> zeroinitializer
%95 = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> %94, <4 x double> %92, <4 x double> %85)
%96 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 3
%97 = load i32, i32* %96
%98 = insertelement <4 x i32> poison, i32 %97, i64 0
%99 = insertelement <4 x i32> %98, i32 %65, i64 1
%100 = insertelement <4 x i32> %99, i32 %57, i64 2
%101 = insertelement <4 x i32> %100, i32 %49, i64 3
%102 = sitofp <4 x i32> %101 to <4 x double>
%103 = insertelement <4 x double> poison, double %40, i64 0
%104 = shufflevector <4 x double> %103, <4 x double> poison, <4 x i32> zeroinitializer
%105 = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> %104, <4 x double> %102, <4 x double> %95)
br label %123
106: ; preds = %26
%107 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 0
%108 = load i32, i32* %107
%109 = sitofp i32 %108 to double
%110 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%111 = load i32, i32* %110
%112 = sitofp i32 %111 to double
%113 = fmul double %34, %112
%114 = tail call double @llvm.fmuladd.f64(double %31, double %109, double %113)
%115 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%116 = load i32, i32* %115
%117 = sitofp i32 %116 to double
%118 = tail call double @llvm.fmuladd.f64(double %37, double %117, double %114)
%119 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 3
%120 = load i32, i32* %119
%121 = sitofp i32 %120 to double
%122 = tail call double @llvm.fmuladd.f64(double %40, double %121, double %118)
br label %147
123: ; preds = %41, %12
%124 = phi <4 x double> [ %25, %12 ], [ %105, %41 ]
%125 = fadd double %2, 1.000000e+00
%126 = fsub double 1.000000e+00, %2
%127 = tail call double @llvm.fmuladd.f64(double %125, double 0xBFC5555547044B69, double 1.000000e+00)
%128 = tail call double @llvm.fmuladd.f64(double %127, double %125, double -2.000000e+00)
%129 = tail call double @llvm.fmuladd.f64(double %128, double %125, double 1.333330e+00)
%130 = tail call double @llvm.fmuladd.f64(double %2, double 5.000000e-01, double -1.000000e+00)
%131 = fmul double %130, %2
%132 = tail call double @llvm.fmuladd.f64(double %131, double %2, double 0x3FE55555571F7693)
%133 = tail call double @llvm.fmuladd.f64(double %126, double 5.000000e-01, double -1.000000e+00)
%134 = fmul double %126, %133
%135 = tail call double @llvm.fmuladd.f64(double %134, double %126, double 0x3FE55555571F7693)
%136 = fsub double 1.000000e+00, %129
%137 = fsub double %136, %132
%138 = fsub double %137, %135
%139 = extractelement <4 x double> %124, i64 2
%140 = fmul double %132, %139
%141 = extractelement <4 x double> %124, i64 3
%142 = tail call double @llvm.fmuladd.f64(double %141, double %129, double %140)
%143 = extractelement <4 x double> %124, i64 1
%144 = tail call double @llvm.fmuladd.f64(double %143, double %135, double %142)
%145 = extractelement <4 x double> %124, i64 0
%146 = tail call double @llvm.fmuladd.f64(double %145, double %138, double %144)
br label %147
147: ; preds = %123, %106, %7
%148 = phi double [ %10, %7 ], [ %146, %123 ], [ %122, %106 ]
ret double %148
}