void spline(x, y, n, yp1, ypn, y2) float x[], y[], yp1, ypn, y2[];
int n;
{
  int i, k;
  float p, qn, sig, un, *u, *vector();
  void free_vector();
  u = vector(1, n - 1);
  if (yp1 > 0.99e30)
    y2[1] = u[1] = 0.0;
  else {
    y2[1] = -0.5;
    u[1] = (3.0 / (x[2] - x[1])) * ((y[2] - y[1]) / (x[2] - x[1]) - yp1);
  }
  for (i = 2; i <= n - 1; i++) {
    sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]);
    p = sig * y2[i - 1] + 2.0;
    y2[i] = (sig - 1.0) / p;
    u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) -
           (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
    u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
  }
  if (ypn > 0.99e30)
    qn = un = 0.0;
  else {
    qn = 0.5;
    un = (3.0 / (x[n] - x[n - 1])) *
         (ypn - (y[n] - y[n - 1]) / (x[n] - x[n - 1]));
  }
  y2[n] = (un - qn * u[n - 1]) / (qn * y2[n - 1] + 1.0);
  for (k = n - 1; k >= 1; k--)
    y2[k] = y2[k] * y2[k + 1] + u[k];
  free_vector(u, 1, n - 1);
}


x86 assembly (clang, -O0):
<spline>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm1,-0x50(%rbp)
movaps %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x14(%rbp),%esi
sub    $0x1,%esi
mov    $0x1,%edi
mov    $0x0,%al
call   1040 <vector@plt>
mov    %rax,-0x48(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe83(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11a4 <spline+0x84>
mov    -0x48(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,0x4(%rax)
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,0x4(%rax)
jmp    1219 <spline+0xf9>
mov    -0x28(%rbp),%rax
movss  0xe78(%rip),%xmm0
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe35(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
subss  0x4(%rax),%xmm1
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm2
mov    -0x8(%rbp),%rax
subss  0x4(%rax),%xmm2
divss  %xmm2,%xmm1
subss  -0x18(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x48(%rbp),%rax
movss  %xmm0,0x4(%rax)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1409 <spline+0x2e9>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mulss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd80(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd52(%rip),%xmm1
subsd  %xmm1,%xmm0
movss  -0x34(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm2
divss  %xmm2,%xmm1
subss  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc8a(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
movss  -0x3c(%rbp),%xmm1
mov    -0x48(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mulss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
movss  -0x34(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1220 <spline+0x100>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbe6(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1439 <spline+0x319>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
jmp    14d1 <spline+0x3b1>
movss  0xbeb(%rip),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb97(%rip),%xmm0
divsd  %xmm1,%xmm0
movss  -0x1c(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm3
divss  %xmm3,%xmm2
subss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm1
movss  -0x38(%rbp),%xmm0
mov    -0x48(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x38(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mulss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xae7(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x1,-0x30(%rbp)
jl     15a4 <spline+0x484>
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x48(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
jmp    154b <spline+0x42b>
mov    -0x48(%rbp),%rdi
mov    -0x14(%rbp),%edx
sub    $0x1,%edx
mov    $0x1,%esi
mov    $0x0,%al
call   1030 <free_vector@plt>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<spline>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rcx,%rbx
movsd  %xmm1,0x8(%rsp)
mov    %edx,%r15d
mov    %rsi,%r12
mov    %rdi,%rbp
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%rsp)
lea    -0x1(%r15),%r14d
mov    $0x1,%edi
mov    %r14d,%esi
xor    %eax,%eax
call   1040 <vector@plt>
movss  0x4(%rsp),%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm3,%xmm0
ucomisd 0xe90(%rip),%xmm0
jbe    1181 <spline+0x61>
movl   $0x0,0x4(%rax)
xorps  %xmm1,%xmm1
mov    %rbx,%rcx
jmp    11d0 <spline+0xb0>
movl   $0xbf000000,0x4(%rbx)
movss  0x8(%rbp),%xmm0
subss  0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
movsd  0xe67(%rip),%xmm2
divsd  %xmm1,%xmm2
movss  0x8(%r12),%xmm1
subss  0x4(%r12),%xmm1
divss  %xmm0,%xmm1
subss  %xmm3,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
mulsd  %xmm2,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
mov    %rax,%rcx
movsd  0x8(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm8
movss  %xmm1,0x4(%rcx)
cmp    $0x3,%r15d
jl     142b <spline+0x30b>
mov    %r15d,%ecx
lea    0x4(%rbx),%rdx
lea    (%rax,%rcx,4),%rsi
cmp    %rsi,%rdx
jae    1317 <spline+0x1f7>
lea    (%rbx,%rcx,4),%rdx
mov    %rax,%rsi
add    $0x4,%rsi
cmp    %rdx,%rsi
jae    1317 <spline+0x1f7>
shl    $0x2,%rcx
mov    $0x8,%edx
movss  0xe04(%rip),%xmm9
movsd  0xde4(%rip),%xmm2
movsd  0xde4(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  -0x4(%rbp,%rdx,1),%xmm5
movss  0x0(%rbp,%rdx,1),%xmm4
subss  %xmm5,%xmm4
movss  0x4(%rbp,%rdx,1),%xmm6
subss  %xmm5,%xmm6
divss  %xmm6,%xmm4
movss  -0x4(%rbx,%rdx,1),%xmm5
mulss  %xmm4,%xmm5
addss  %xmm9,%xmm5
xorps  %xmm6,%xmm6
cvtss2sd %xmm4,%xmm6
addsd  %xmm2,%xmm6
cvtss2sd %xmm5,%xmm5
divsd  %xmm5,%xmm6
cvtsd2ss %xmm6,%xmm6
movss  %xmm6,(%rbx,%rdx,1)
movss  (%r12,%rdx,1),%xmm6
movss  0x4(%r12,%rdx,1),%xmm7
subss  %xmm6,%xmm7
movss  0x0(%rbp,%rdx,1),%xmm0
movss  0x4(%rbp,%rdx,1),%xmm1
subss  %xmm0,%xmm1
subss  -0x4(%r12,%rdx,1),%xmm6
divss  %xmm1,%xmm7
subss  -0x4(%rbp,%rdx,1),%xmm0
divss  %xmm0,%xmm6
subss  %xmm6,%xmm7
movss  %xmm7,(%rax,%rdx,1)
xorps  %xmm0,%xmm0
cvtss2sd %xmm7,%xmm0
mulsd  %xmm3,%xmm0
movss  0x4(%rbp,%rdx,1),%xmm1
subss  -0x4(%rbp,%rdx,1),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
mulss  -0x4(%rax,%rdx,1),%xmm4
xorps  %xmm1,%xmm1
cvtss2sd %xmm4,%xmm1
subsd  %xmm1,%xmm0
divsd  %xmm5,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax,%rdx,1)
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1240 <spline+0x120>
jmp    142b <spline+0x30b>
movss  0x4(%rbx),%xmm1
movss  0x4(%rax),%xmm5
shl    $0x2,%rcx
mov    $0x8,%edx
movss  0xcf5(%rip),%xmm9
movsd  0xcd4(%rip),%xmm10
movsd  0xcd3(%rip),%xmm11
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x0(%rbp,%rdx,1),%xmm6
movss  -0x4(%rbp,%rdx,1),%xmm0
shufps $0x0,%xmm0,%xmm0
subps  %xmm0,%xmm6
movaps %xmm6,%xmm0
shufps $0x55,%xmm6,%xmm0
divss  %xmm0,%xmm6
mulss  %xmm6,%xmm1
addss  %xmm9,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm6,%xmm0
addsd  %xmm10,%xmm0
xorps  %xmm7,%xmm7
cvtss2sd %xmm1,%xmm7
divsd  %xmm7,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movss  %xmm1,(%rbx,%rdx,1)
movsd  (%r12,%rdx,1),%xmm0
movss  -0x4(%r12,%rdx,1),%xmm2
movlhps %xmm0,%xmm2
shufps $0xe2,%xmm0,%xmm2
shufps $0xe1,%xmm0,%xmm0
movsd  0x0(%rbp,%rdx,1),%xmm3
movss  -0x4(%rbp,%rdx,1),%xmm4
movlhps %xmm3,%xmm4
shufps $0xe2,%xmm3,%xmm4
shufps $0xe1,%xmm3,%xmm3
subps  %xmm2,%xmm0
subps  %xmm4,%xmm3
divps  %xmm3,%xmm0
movaps %xmm0,%xmm2
shufps $0x55,%xmm0,%xmm2
subss  %xmm2,%xmm0
movss  %xmm0,(%rax,%rdx,1)
cvtss2sd %xmm0,%xmm0
mulsd  %xmm11,%xmm0
movss  0x4(%rbp,%rdx,1),%xmm2
subss  -0x4(%rbp,%rdx,1),%xmm2
cvtss2sd %xmm2,%xmm2
divsd  %xmm2,%xmm0
mulss  %xmm5,%xmm6
xorps  %xmm2,%xmm2
cvtss2sd %xmm6,%xmm2
subsd  %xmm2,%xmm0
divsd  %xmm7,%xmm0
xorps  %xmm5,%xmm5
cvtsd2ss %xmm0,%xmm5
movss  %xmm5,(%rax,%rdx,1)
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1350 <spline+0x230>
xorps  %xmm0,%xmm0
cvtss2sd %xmm8,%xmm0
ucomisd 0xbc5(%rip),%xmm0
jbe    144b <spline+0x32b>
movslq %r14d,%rdx
movslq %r15d,%rcx
xorps  %xmm0,%xmm0
xorps  %xmm1,%xmm1
jmp    14a0 <spline+0x380>
movslq %r15d,%rcx
movss  0x0(%rbp,%rcx,4),%xmm0
movslq %r14d,%rdx
subss  0x0(%rbp,%rdx,4),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
movsd  0xb9c(%rip),%xmm2
movss  (%r12,%rcx,4),%xmm3
subss  (%r12,%rdx,4),%xmm3
divsd  %xmm1,%xmm2
divss  %xmm0,%xmm3
subss  %xmm3,%xmm8
xorps  %xmm0,%xmm0
cvtss2sd %xmm8,%xmm0
mulsd  %xmm2,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movss  0xb8c(%rip),%xmm0
movss  (%rax,%rdx,4),%xmm2
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulss  (%rbx,%rdx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xb5e(%rip),%xmm0
divsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,(%rbx,%rcx,4)
cmp    $0x2,%r15d
jl     1501 <spline+0x3e1>
mov    %r14d,%ecx
add    $0x1,%rcx
nop
movss  -0x4(%rbx,%rcx,4),%xmm0
mulss  (%rbx,%rcx,4),%xmm0
addss  -0x4(%rax,%rcx,4),%xmm0
movss  %xmm0,-0x4(%rbx,%rcx,4)
add    $0xffffffffffffffff,%rcx
cmp    $0x1,%rcx
ja     14e0 <spline+0x3c0>
mov    %rax,%rdi
mov    $0x1,%esi
mov    %r14d,%edx
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free_vector@plt>

LLVM IR (-O0):
define void @spline(float* %0, float* %1, i32 %2, double %3, double %4, float* %5) {
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
%10 = alloca float
%11 = alloca float
%12 = alloca float*
%13 = alloca i32
%14 = alloca i32
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float*
%20 = fptrunc double %3 to float
%21 = fptrunc double %4 to float
store float* %0, float** %7
store float* %1, float** %8
store i32 %2, i32* %9
store float %20, float* %10
store float %21, float* %11
store float* %5, float** %12
%22 = load i32, i32* %9
%23 = sub nsw i32 %22, 1
%24 = call float* (i32, i32, ...) bitcast (float* (...)* @vector to float* (i32, i32, ...)*)(i32 1, i32 %23)
store float* %24, float** %19
%25 = load float, float* %10
%26 = fpext float %25 to double
%27 = fcmp ogt double %26, 9.900000e+29
br i1 %27, label %28, label %33
28: ; preds = %6
%29 = load float*, float** %19
%30 = getelementptr inbounds float, float* %29, i64 1
store float 0.000000e+00, float* %30
%31 = load float*, float** %12
%32 = getelementptr inbounds float, float* %31, i64 1
store float 0.000000e+00, float* %32
br label %67
33: ; preds = %6
%34 = load float*, float** %12
%35 = getelementptr inbounds float, float* %34, i64 1
store float -5.000000e-01, float* %35
%36 = load float*, float** %7
%37 = getelementptr inbounds float, float* %36, i64 2
%38 = load float, float* %37
%39 = load float*, float** %7
%40 = getelementptr inbounds float, float* %39, i64 1
%41 = load float, float* %40
%42 = fsub float %38, %41
%43 = fpext float %42 to double
%44 = fdiv double 3.000000e+00, %43
%45 = load float*, float** %8
%46 = getelementptr inbounds float, float* %45, i64 2
%47 = load float, float* %46
%48 = load float*, float** %8
%49 = getelementptr inbounds float, float* %48, i64 1
%50 = load float, float* %49
%51 = fsub float %47, %50
%52 = load float*, float** %7
%53 = getelementptr inbounds float, float* %52, i64 2
%54 = load float, float* %53
%55 = load float*, float** %7
%56 = getelementptr inbounds float, float* %55, i64 1
%57 = load float, float* %56
%58 = fsub float %54, %57
%59 = fdiv float %51, %58
%60 = load float, float* %10
%61 = fsub float %59, %60
%62 = fpext float %61 to double
%63 = fmul double %44, %62
%64 = fptrunc double %63 to float
%65 = load float*, float** %19
%66 = getelementptr inbounds float, float* %65, i64 1
store float %64, float* %66
br label %67
67: ; preds = %33, %28
store i32 2, i32* %13
br label %68
68: ; preds = %217, %67
%69 = load i32, i32* %13
%70 = load i32, i32* %9
%71 = sub nsw i32 %70, 1
%72 = icmp sle i32 %69, %71
br i1 %72, label %73, label %220
73: ; preds = %68
%74 = load float*, float** %7
%75 = load i32, i32* %13
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds float, float* %74, i64 %76
%78 = load float, float* %77
%79 = load float*, float** %7
%80 = load i32, i32* %13
%81 = sub nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds float, float* %79, i64 %82
%84 = load float, float* %83
%85 = fsub float %78, %84
%86 = load float*, float** %7
%87 = load i32, i32* %13
%88 = add nsw i32 %87, 1
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds float, float* %86, i64 %89
%91 = load float, float* %90
%92 = load float*, float** %7
%93 = load i32, i32* %13
%94 = sub nsw i32 %93, 1
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds float, float* %92, i64 %95
%97 = load float, float* %96
%98 = fsub float %91, %97
%99 = fdiv float %85, %98
store float %99, float* %17
%100 = load float, float* %17
%101 = load float*, float** %12
%102 = load i32, i32* %13
%103 = sub nsw i32 %102, 1
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds float, float* %101, i64 %104
%106 = load float, float* %105
%107 = fmul float %100, %106
%108 = fpext float %107 to double
%109 = fadd double %108, 2.000000e+00
%110 = fptrunc double %109 to float
store float %110, float* %15
%111 = load float, float* %17
%112 = fpext float %111 to double
%113 = fsub double %112, 1.000000e+00
%114 = load float, float* %15
%115 = fpext float %114 to double
%116 = fdiv double %113, %115
%117 = fptrunc double %116 to float
%118 = load float*, float** %12
%119 = load i32, i32* %13
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds float, float* %118, i64 %120
store float %117, float* %121
%122 = load float*, float** %8
%123 = load i32, i32* %13
%124 = add nsw i32 %123, 1
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds float, float* %122, i64 %125
%127 = load float, float* %126
%128 = load float*, float** %8
%129 = load i32, i32* %13
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds float, float* %128, i64 %130
%132 = load float, float* %131
%133 = fsub float %127, %132
%134 = load float*, float** %7
%135 = load i32, i32* %13
%136 = add nsw i32 %135, 1
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds float, float* %134, i64 %137
%139 = load float, float* %138
%140 = load float*, float** %7
%141 = load i32, i32* %13
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds float, float* %140, i64 %142
%144 = load float, float* %143
%145 = fsub float %139, %144
%146 = fdiv float %133, %145
%147 = load float*, float** %8
%148 = load i32, i32* %13
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds float, float* %147, i64 %149
%151 = load float, float* %150
%152 = load float*, float** %8
%153 = load i32, i32* %13
%154 = sub nsw i32 %153, 1
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds float, float* %152, i64 %155
%157 = load float, float* %156
%158 = fsub float %151, %157
%159 = load float*, float** %7
%160 = load i32, i32* %13
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds float, float* %159, i64 %161
%163 = load float, float* %162
%164 = load float*, float** %7
%165 = load i32, i32* %13
%166 = sub nsw i32 %165, 1
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds float, float* %164, i64 %167
%169 = load float, float* %168
%170 = fsub float %163, %169
%171 = fdiv float %158, %170
%172 = fsub float %146, %171
%173 = load float*, float** %19
%174 = load i32, i32* %13
%175 = sext i32 %174 to i64
%176 = getelementptr inbounds float, float* %173, i64 %175
store float %172, float* %176
%177 = load float*, float** %19
%178 = load i32, i32* %13
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds float, float* %177, i64 %179
%181 = load float, float* %180
%182 = fpext float %181 to double
%183 = fmul double 6.000000e+00, %182
%184 = load float*, float** %7
%185 = load i32, i32* %13
%186 = add nsw i32 %185, 1
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds float, float* %184, i64 %187
%189 = load float, float* %188
%190 = load float*, float** %7
%191 = load i32, i32* %13
%192 = sub nsw i32 %191, 1
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds float, float* %190, i64 %193
%195 = load float, float* %194
%196 = fsub float %189, %195
%197 = fpext float %196 to double
%198 = fdiv double %183, %197
%199 = load float, float* %17
%200 = load float*, float** %19
%201 = load i32, i32* %13
%202 = sub nsw i32 %201, 1
%203 = sext i32 %202 to i64
%204 = getelementptr inbounds float, float* %200, i64 %203
%205 = load float, float* %204
%206 = fmul float %199, %205
%207 = fpext float %206 to double
%208 = fsub double %198, %207
%209 = load float, float* %15
%210 = fpext float %209 to double
%211 = fdiv double %208, %210
%212 = fptrunc double %211 to float
%213 = load float*, float** %19
%214 = load i32, i32* %13
%215 = sext i32 %214 to i64
%216 = getelementptr inbounds float, float* %213, i64 %215
store float %212, float* %216
br label %217
217: ; preds = %73
%218 = load i32, i32* %13
%219 = add nsw i32 %218, 1
store i32 %219, i32* %13
br label %68
220: ; preds = %68
%221 = load float, float* %11
%222 = fpext float %221 to double
%223 = fcmp ogt double %222, 9.900000e+29
br i1 %223, label %224, label %225
224: ; preds = %220
store float 0.000000e+00, float* %18
store float 0.000000e+00, float* %16
br label %270
225: ; preds = %220
store float 5.000000e-01, float* %16
%226 = load float*, float** %7
%227 = load i32, i32* %9
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds float, float* %226, i64 %228
%230 = load float, float* %229
%231 = load float*, float** %7
%232 = load i32, i32* %9
%233 = sub nsw i32 %232, 1
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds float, float* %231, i64 %234
%236 = load float, float* %235
%237 = fsub float %230, %236
%238 = fpext float %237 to double
%239 = fdiv double 3.000000e+00, %238
%240 = load float, float* %11
%241 = load float*, float** %8
%242 = load i32, i32* %9
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds float, float* %241, i64 %243
%245 = load float, float* %244
%246 = load float*, float** %8
%247 = load i32, i32* %9
%248 = sub nsw i32 %247, 1
%249 = sext i32 %248 to i64
%250 = getelementptr inbounds float, float* %246, i64 %249
%251 = load float, float* %250
%252 = fsub float %245, %251
%253 = load float*, float** %7
%254 = load i32, i32* %9
%255 = sext i32 %254 to i64
%256 = getelementptr inbounds float, float* %253, i64 %255
%257 = load float, float* %256
%258 = load float*, float** %7
%259 = load i32, i32* %9
%260 = sub nsw i32 %259, 1
%261 = sext i32 %260 to i64
%262 = getelementptr inbounds float, float* %258, i64 %261
%263 = load float, float* %262
%264 = fsub float %257, %263
%265 = fdiv float %252, %264
%266 = fsub float %240, %265
%267 = fpext float %266 to double
%268 = fmul double %239, %267
%269 = fptrunc double %268 to float
store float %269, float* %18
br label %270
270: ; preds = %225, %224
%271 = load float, float* %18
%272 = load float, float* %16
%273 = load float*, float** %19
%274 = load i32, i32* %9
%275 = sub nsw i32 %274, 1
%276 = sext i32 %275 to i64
%277 = getelementptr inbounds float, float* %273, i64 %276
%278 = load float, float* %277
%279 = fneg float %272
%280 = call float @llvm.fmuladd.f32(float %279, float %278, float %271)
%281 = fpext float %280 to double
%282 = load float, float* %16
%283 = load float*, float** %12
%284 = load i32, i32* %9
%285 = sub nsw i32 %284, 1
%286 = sext i32 %285 to i64
%287 = getelementptr inbounds float, float* %283, i64 %286
%288 = load float, float* %287
%289 = fmul float %282, %288
%290 = fpext float %289 to double
%291 = fadd double %290, 1.000000e+00
%292 = fdiv double %281, %291
%293 = fptrunc double %292 to float
%294 = load float*, float** %12
%295 = load i32, i32* %9
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds float, float* %294, i64 %296
store float %293, float* %297
%298 = load i32, i32* %9
%299 = sub nsw i32 %298, 1
store i32 %299, i32* %14
br label %300
300: ; preds = %325, %270
%301 = load i32, i32* %14
%302 = icmp sge i32 %301, 1
br i1 %302, label %303, label %328
303: ; preds = %300
%304 = load float*, float** %12
%305 = load i32, i32* %14
%306 = sext i32 %305 to i64
%307 = getelementptr inbounds float, float* %304, i64 %306
%308 = load float, float* %307
%309 = load float*, float** %12
%310 = load i32, i32* %14
%311 = add nsw i32 %310, 1
%312 = sext i32 %311 to i64
%313 = getelementptr inbounds float, float* %309, i64 %312
%314 = load float, float* %313
%315 = load float*, float** %19
%316 = load i32, i32* %14
%317 = sext i32 %316 to i64
%318 = getelementptr inbounds float, float* %315, i64 %317
%319 = load float, float* %318
%320 = call float @llvm.fmuladd.f32(float %308, float %314, float %319)
%321 = load float*, float** %12
%322 = load i32, i32* %14
%323 = sext i32 %322 to i64
%324 = getelementptr inbounds float, float* %321, i64 %323
store float %320, float* %324
br label %325
325: ; preds = %303
%326 = load i32, i32* %14
%327 = add nsw i32 %326, -1
store i32 %327, i32* %14
br label %300
328: ; preds = %300
%329 = load float*, float** %19
%330 = load i32, i32* %9
%331 = sub nsw i32 %330, 1
ret void
}

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