#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ calloc(int, int);
float *d3_np_fs(int, float *, float *);
int /*<<< orphan*/ free(float *);
float *spline_cubic_set_internal(int n, float t[], float y[], int ibcbeg,
                                 float ybcbeg, int ibcend, float ybcend) {
  float *a;
  float *b;
  int i;
  float *ypp;
  if (n <= 1) {
    return NULL;
  }
  for (i = 0; i < n - 1; i++) {
    if (t[i + 1] <= t[i]) {
      return NULL;
    }
  }
  a = (float *)calloc(3 * n, sizeof(float));
  b = (float *)calloc(n, sizeof(float));
  if (ibcbeg == 0) {
    b[0] = 0.0E+00;
    a[1 + 0 * 3] = 1.0E+00;
    a[0 + 1 * 3] = -1.0E+00;
  } else if (ibcbeg == 1) {
    b[0] = (y[1] - y[0]) / (t[1] - t[0]) - ybcbeg;
    a[1 + 0 * 3] = (t[1] - t[0]) / 3.0E+00;
    a[0 + 1 * 3] = (t[1] - t[0]) / 6.0E+00;
  } else if (ibcbeg == 2) {
    b[0] = ybcbeg;
    a[1 + 0 * 3] = 1.0E+00;
    a[0 + 1 * 3] = 0.0E+00;
  } else {
    free(a);
    free(b);
    return NULL;
  }
  for (i = 1; i < n - 1; i++) {
    b[i] = (y[i + 1] - y[i]) / (t[i + 1] - t[i]) -
           (y[i] - y[i - 1]) / (t[i] - t[i - 1]);
    a[2 + (i - 1) * 3] = (t[i] - t[i - 1]) / 6.0E+00;
    a[1 + i * 3] = (t[i + 1] - t[i - 1]) / 3.0E+00;
    a[0 + (i + 1) * 3] = (t[i + 1] - t[i]) / 6.0E+00;
  }
  if (ibcend == 0) {
    b[n - 1] = 0.0E+00;
    a[2 + (n - 2) * 3] = -1.0E+00;
    a[1 + (n - 1) * 3] = 1.0E+00;
  } else if (ibcend == 1) {
    b[n - 1] = ybcend - (y[n - 1] - y[n - 2]) / (t[n - 1] - t[n - 2]);
    a[2 + (n - 2) * 3] = (t[n - 1] - t[n - 2]) / 6.0E+00;
    a[1 + (n - 1) * 3] = (t[n - 1] - t[n - 2]) / 3.0E+00;
  } else if (ibcend == 2) {
    b[n - 1] = ybcend;
    a[2 + (n - 2) * 3] = 0.0E+00;
    a[1 + (n - 1) * 3] = 1.0E+00;
  } else {
    free(a);
    free(b);
    return NULL;
  }
  if (n == 2 && ibcbeg == 0 && ibcend == 0) {
    ypp = (float *)calloc(2, sizeof(float));
    ypp[0] = 0.0E+00;
    ypp[1] = 0.0E+00;
  } else {
    ypp = d3_np_fs(n, a, b);
    if (!ypp) {
      free(a);
      free(b);
      return NULL;
    }
  }
  free(a);
  free(b);
  return ypp;
}


x86 assembly (clang, -O0):
<spline_cubic_set_internal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movss  %xmm0,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
movss  %xmm1,-0x30(%rbp)
cmpl   $0x1,-0xc(%rbp)
jg     116b <spline_cubic_set_internal+0x3b>
movq   $0x0,-0x8(%rbp)
jmp    1774 <spline_cubic_set_internal+0x644>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11cb <spline_cubic_set_internal+0x9b>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jb     11b8 <spline_cubic_set_internal+0x88>
movq   $0x0,-0x8(%rbp)
jmp    1774 <spline_cubic_set_internal+0x644>
jmp    11bd <spline_cubic_set_internal+0x8d>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1172 <spline_cubic_set_internal+0x42>
imul   $0x3,-0xc(%rbp),%edi
mov    $0x4,%esi
call   1040 <calloc@plt>
mov    %rax,-0x38(%rbp)
mov    -0xc(%rbp),%edi
mov    $0x4,%esi
call   1040 <calloc@plt>
mov    %rax,-0x40(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    122a <spline_cubic_set_internal+0xfa>
mov    -0x40(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movss  0xdf1(%rip),%xmm0
movss  %xmm0,0x4(%rax)
mov    -0x38(%rbp),%rax
movss  0xde4(%rip),%xmm0
movss  %xmm0,0xc(%rax)
jmp    132a <spline_cubic_set_internal+0x1fa>
cmpl   $0x1,-0x24(%rbp)
jne    12c8 <spline_cubic_set_internal+0x198>
mov    -0x20(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x20(%rbp),%rax
subss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm1
mov    -0x18(%rbp),%rax
subss  (%rax),%xmm1
divss  %xmm1,%xmm0
subss  -0x28(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
subss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd8c(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
subss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd56(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1325 <spline_cubic_set_internal+0x1f5>
cmpl   $0x2,-0x24(%rbp)
jne    1301 <spline_cubic_set_internal+0x1d1>
movss  -0x28(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movss  0xd15(%rip),%xmm0
movss  %xmm0,0x4(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,0xc(%rax)
jmp    1320 <spline_cubic_set_internal+0x1f0>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    1774 <spline_cubic_set_internal+0x644>
jmp    1325 <spline_cubic_set_internal+0x1f5>
jmp    132a <spline_cubic_set_internal+0x1fa>
movl   $0x1,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    14c6 <spline_cubic_set_internal+0x396>
mov    -0x20(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm2
divss  %xmm2,%xmm1
subss  %xmm1,%xmm0
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xc06(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbbe(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
imul   $0x3,-0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb70(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1331 <spline_cubic_set_internal+0x201>
cmpl   $0x0,-0x2c(%rbp)
jne    152a <spline_cubic_set_internal+0x3fa>
mov    -0x40(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
imul   $0x3,%ecx,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  0xb04(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  0xae0(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    16ca <spline_cubic_set_internal+0x59a>
cmpl   $0x1,-0x2c(%rbp)
jne    1640 <spline_cubic_set_internal+0x510>
movss  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x20(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm1
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm2
divss  %xmm2,%xmm1
subss  %xmm1,%xmm0
mov    -0x40(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xa3d(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
imul   $0x3,%ecx,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0x9f5(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    16c5 <spline_cubic_set_internal+0x595>
cmpl   $0x2,-0x2c(%rbp)
jne    16a1 <spline_cubic_set_internal+0x571>
movss  -0x30(%rbp),%xmm0
mov    -0x40(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
imul   $0x3,%ecx,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  0x969(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    16c0 <spline_cubic_set_internal+0x590>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    1774 <spline_cubic_set_internal+0x644>
jmp    16c5 <spline_cubic_set_internal+0x595>
jmp    16ca <spline_cubic_set_internal+0x59a>
cmpl   $0x2,-0xc(%rbp)
jne    1717 <spline_cubic_set_internal+0x5e7>
cmpl   $0x0,-0x24(%rbp)
jne    1717 <spline_cubic_set_internal+0x5e7>
cmpl   $0x0,-0x2c(%rbp)
jne    1717 <spline_cubic_set_internal+0x5e7>
mov    $0x2,%edi
mov    $0x4,%esi
call   1040 <calloc@plt>
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x50(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,0x4(%rax)
jmp    175a <spline_cubic_set_internal+0x62a>
mov    -0xc(%rbp),%edi
mov    -0x38(%rbp),%rsi
mov    -0x40(%rbp),%rdx
call   1050 <d3_np_fs@plt>
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    1755 <spline_cubic_set_internal+0x625>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    1774 <spline_cubic_set_internal+0x644>
jmp    175a <spline_cubic_set_internal+0x62a>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
mov    -0x50(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<spline_cubic_set_internal>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
cmp    $0x2,%edi
jl     1747 <spline_cubic_set_internal+0x617>
mov    %r8d,%ebx
mov    %rsi,%rbp
mov    %edi,%r13d
lea    -0x1(%r13),%r12d
xor    %r15d,%r15d
xor    %eax,%eax
nopl   0x0(%rax)
cmp    %rax,%r12
je     117b <spline_cubic_set_internal+0x4b>
movss  0x0(%rbp,%rax,4),%xmm2
ucomiss 0x4(%rbp,%rax,4),%xmm2
lea    0x1(%rax),%rax
jb     1160 <spline_cubic_set_internal+0x30>
jmp    174a <spline_cubic_set_internal+0x61a>
movss  %xmm0,0x20(%rsp)
mov    %rdx,0x28(%rsp)
movss  %xmm1,0x34(%rsp)
lea    0x0(%r13,%r13,2),%edi
mov    %edi,0x30(%rsp)
mov    $0x4,%esi
mov    %ecx,%r15d
call   1040 <calloc@plt>
mov    %rax,%r14
mov    %r13d,%edi
mov    $0x4,%esi
call   1040 <calloc@plt>
mov    %r15d,%r11d
mov    %rax,0x10(%rsp)
cmp    $0x2,%r15d
je     11fb <spline_cubic_set_internal+0xcb>
cmp    $0x1,%r11d
mov    0x28(%rsp),%r10
movss  0x20(%rsp),%xmm2
je     1220 <spline_cubic_set_internal+0xf0>
test   %r11d,%r11d
jne    13be <spline_cubic_set_internal+0x28e>
mov    %ebx,0x1c(%rsp)
mov    0x10(%rsp),%rax
movl   $0x0,(%rax)
movl   $0x3f800000,0x4(%r14)
3f
movss  0xe0f(%rip),%xmm0
jmp    1274 <spline_cubic_set_internal+0x144>
mov    %ebx,0x1c(%rsp)
mov    0x10(%rsp),%rax
movss  0x20(%rsp),%xmm0
movss  %xmm0,(%rax)
movl   $0x3f800000,0x4(%r14)
3f
xorps  %xmm0,%xmm0
mov    0x28(%rsp),%r10
jmp    1274 <spline_cubic_set_internal+0x144>
mov    %ebx,0x1c(%rsp)
movss  0x4(%r10),%xmm0
subss  (%r10),%xmm0
movss  0x4(%rbp),%xmm1
subss  0x0(%rbp),%xmm1
divss  %xmm1,%xmm0
subss  %xmm2,%xmm0
mov    0x10(%rsp),%rax
movss  %xmm0,(%rax)
movss  0x4(%rbp),%xmm0
subss  0x0(%rbp),%xmm0
divss  0xda4(%rip),%xmm0
movss  %xmm0,0x4(%r14)
movss  0x4(%rbp),%xmm0
subss  0x0(%rbp),%xmm0
divss  0xd90(%rip),%xmm0
movss  %xmm0,0xc(%r14)
cmp    $0x3,%r13d
jl     1373 <spline_cubic_set_internal+0x243>
lea    -0x1(%r12),%rsi
mov    $0x1,%r9d
cmp    $0x4,%rsi
jae    13d0 <spline_cubic_set_internal+0x2a0>
lea    (%r9,%r9,2),%rax
add    $0x1,%rax
mov    0x10(%rsp),%rcx
lea    (%rcx,%r9,4),%r8
lea    0x0(,%r9,4),%rdx
add    %rbp,%rdx
lea    (%r10,%r9,4),%rdi
mov    %r12,%rsi
sub    %r9,%rsi
xor    %ebx,%ebx
movss  0xd3b(%rip),%xmm0
movss  0xd2f(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movss  (%rdi,%rbx,4),%xmm2
movss  0x4(%rdi,%rbx,4),%xmm3
subss  %xmm2,%xmm3
movss  (%rdx,%rbx,4),%xmm4
movss  0x4(%rdx,%rbx,4),%xmm5
subss  %xmm4,%xmm5
subss  -0x4(%rdi,%rbx,4),%xmm2
subss  -0x4(%rdx,%rbx,4),%xmm4
divss  %xmm5,%xmm3
divss  %xmm4,%xmm2
subss  %xmm2,%xmm3
movss  %xmm3,(%r8,%rbx,4)
movss  (%rdx,%rbx,4),%xmm2
subss  -0x4(%rdx,%rbx,4),%xmm2
divss  %xmm0,%xmm2
movss  %xmm2,-0x8(%r14,%rax,4)
movss  0x4(%rdx,%rbx,4),%xmm2
subss  -0x4(%rdx,%rbx,4),%xmm2
divss  %xmm1,%xmm2
mov    %eax,%ecx
movss  %xmm2,(%r14,%rcx,4)
movss  0x4(%rdx,%rbx,4),%xmm2
subss  (%rdx,%rbx,4),%xmm2
divss  %xmm0,%xmm2
lea    0x2(%rax),%ecx
movss  %xmm2,(%r14,%rcx,4)
add    $0x3,%rax
add    $0x1,%rbx
cmp    %rbx,%rsi
jne    12e0 <spline_cubic_set_internal+0x1b0>
mov    0x1c(%rsp),%esi
cmp    $0x2,%esi
je     1647 <spline_cubic_set_internal+0x517>
cmp    $0x1,%esi
mov    0x10(%rsp),%rbx
je     1675 <spline_cubic_set_internal+0x545>
test   %esi,%esi
jne    1737 <spline_cubic_set_internal+0x607>
movslq %r12d,%rax
movl   $0x0,(%rbx,%rax,4)
mov    0x30(%rsp),%eax
add    $0xfffffffc,%eax
cltq
movl   $0xbf800000,(%r14,%rax,4)
bf
movss  0xc53(%rip),%xmm0
jmp    16dc <spline_cubic_set_internal+0x5ac>
mov    %r14,%rdi
call   1030 <free@plt>
mov    0x10(%rsp),%rdi
jmp    1742 <spline_cubic_set_internal+0x612>
lea    -0x2(%r12),%rcx
mov    $0x3,%edx
mov    %ecx,%eax
mul    %edx
seto   %dl
cmp    $0xfffffffb,%eax
ja     1299 <spline_cubic_set_internal+0x169>
test   %dl,%dl
jne    1299 <spline_cubic_set_internal+0x169>
shr    $0x20,%rcx
jne    1299 <spline_cubic_set_internal+0x169>
cmp    $0xfffffff9,%eax
ja     1299 <spline_cubic_set_internal+0x169>
test   %dl,%dl
jne    1299 <spline_cubic_set_internal+0x169>
test   %rcx,%rcx
jne    1299 <spline_cubic_set_internal+0x169>
mov    %rsi,0x20(%rsp)
mov    0x10(%rsp),%rax
lea    0x4(%rax),%rcx
lea    (%rax,%r12,4),%rdx
lea    (%r12,%r12,2),%rax
lea    (%r14,%rax,4),%rdi
add    $0x4,%rdi
mov    %r14,%rbx
add    $0x8,%rbx
lea    (%r10,%r12,4),%rsi
add    $0x4,%rsi
lea    0x4(,%r12,4),%rax
add    %rbp,%rax
cmp    %rdi,%rcx
setb   0xf(%rsp)
cmp    %rdx,%rbx
setb   %r8b
cmp    %rsi,%rcx
setb   %r11b
cmp    %r10,%rdx
seta   0xe(%rsp)
cmp    %rax,%rcx
setb   %cl
cmp    %rbp,%rdx
seta   0xd(%rsp)
cmp    %rsi,%rbx
setb   %dl
cmp    %r10,%rdi
seta   %sil
cmp    %rax,%rbx
setb   %bl
cmp    %rbp,%rdi
seta   %al
test   %r8b,0xf(%rsp)
jne    1764 <spline_cubic_set_internal+0x634>
and    0xe(%rsp),%r11b
mov    0x28(%rsp),%r10
jne    175c <spline_cubic_set_internal+0x62c>
and    0xd(%rsp),%cl
jne    175c <spline_cubic_set_internal+0x62c>
and    %sil,%dl
mov    %r15d,%r11d
jne    1299 <spline_cubic_set_internal+0x169>
and    %al,%bl
jne    1299 <spline_cubic_set_internal+0x169>
mov    0x20(%rsp),%r8
and    $0xfffffffffffffffc,%r8
lea    0x1(%r8),%r9
mov    $0xf,%ecx
xor    %edx,%edx
movaps 0xb29(%rip),%xmm0
movaps 0xb32(%rip),%xmm1
mov    0x10(%rsp),%r15
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups (%r10,%rdx,4),%xmm2
movups 0x4(%r10,%rdx,4),%xmm3
movups 0x8(%r10,%rdx,4),%xmm4
subps  %xmm3,%xmm4
movups 0x0(%rbp,%rdx,4),%xmm5
movups 0x4(%rbp,%rdx,4),%xmm6
movups 0x8(%rbp,%rdx,4),%xmm7
subps  %xmm6,%xmm7
divps  %xmm7,%xmm4
subps  %xmm2,%xmm3
subps  %xmm5,%xmm6
divps  %xmm6,%xmm3
subps  %xmm3,%xmm4
movups %xmm4,0x4(%r15,%rdx,4)
movups 0x0(%rbp,%rdx,4),%xmm2
movups 0x4(%rbp,%rdx,4),%xmm3
subps  %xmm2,%xmm3
divps  %xmm0,%xmm3
lea    -0x6(%rcx),%r10
lea    -0x18(,%rcx,4),%rsi
ff
or     $0x8,%rsi
movss  %xmm3,-0x34(%r14,%rcx,4)
movaps %xmm3,%xmm2
shufps $0x55,%xmm3,%xmm2
movss  %xmm2,-0x28(%r14,%rcx,4)
movaps %xmm3,%xmm2
unpckhpd %xmm3,%xmm2
movss  %xmm2,-0x1c(%r14,%rcx,4)
shufps $0xff,%xmm3,%xmm3
movss  %xmm3,(%r14,%rsi,1)
movups 0x0(%rbp,%rdx,4),%xmm3
movups 0x8(%rbp,%rdx,4),%xmm2
subps  %xmm3,%xmm2
divps  %xmm1,%xmm2
lea    -0x9(%rcx),%esi
lea    -0xb(%rcx),%eax
lea    -0x5(%rcx),%edi
lea    -0x2(%rcx),%ebx
and    $0xfffffffc,%eax
and    $0xfffffffe,%esi
and    $0xfffffffe,%edi
and    $0xfffffffd,%ebx
movss  %xmm2,(%r14,%rax,4)
movaps %xmm2,%xmm3
shufps $0x55,%xmm2,%xmm3
movss  %xmm3,0x4(%r14,%rsi,4)
movaps %xmm2,%xmm3
unpckhpd %xmm2,%xmm3
movss  %xmm3,(%r14,%rdi,4)
shufps $0xff,%xmm2,%xmm2
movss  %xmm2,(%r14,%rbx,4)
movups 0x4(%rbp,%rdx,4),%xmm2
movups 0x8(%rbp,%rdx,4),%xmm3
subps  %xmm2,%xmm3
divps  %xmm0,%xmm3
lea    -0x3(%rcx),%eax
and    $0xfffffffd,%r10d
and    $0xfffffffc,%eax
mov    %ecx,%edi
movss  %xmm3,(%r14,%rsi,4)
movaps %xmm3,%xmm2
shufps $0x55,%xmm3,%xmm2
movss  %xmm2,(%r14,%r10,4)
mov    0x28(%rsp),%r10
movaps %xmm3,%xmm2
unpckhpd %xmm3,%xmm2
movss  %xmm2,(%r14,%rax,4)
shufps $0xff,%xmm3,%xmm3
movss  %xmm3,(%r14,%rdi,4)
add    $0x4,%rdx
add    $0xc,%rcx
cmp    %rdx,%r8
jne    1500 <spline_cubic_set_internal+0x3d0>
cmp    %r8,0x20(%rsp)
jne    1299 <spline_cubic_set_internal+0x169>
jmp    1373 <spline_cubic_set_internal+0x243>
movslq %r12d,%rax
mov    0x10(%rsp),%rbx
movss  0x34(%rsp),%xmm0
movss  %xmm0,(%rbx,%rax,4)
mov    0x30(%rsp),%eax
add    $0xfffffffc,%eax
cltq
movl   $0x0,(%r14,%rax,4)
movss  0x999(%rip),%xmm0
jmp    16dc <spline_cubic_set_internal+0x5ac>
movslq %r12d,%rax
movss  (%r10,%rax,4),%xmm0
lea    -0x2(%r13),%ecx
subss  (%r10,%rcx,4),%xmm0
movss  0x0(%rbp,%rax,4),%xmm1
subss  0x0(%rbp,%rcx,4),%xmm1
divss  %xmm1,%xmm0
movss  0x34(%rsp),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,(%rbx,%rax,4)
movss  0x0(%rbp,%rax,4),%xmm0
subss  0x0(%rbp,%rcx,4),%xmm0
divss  0x949(%rip),%xmm0
lea    (%rcx,%rcx,2),%edx
movslq %edx,%rdx
movss  %xmm0,0x8(%r14,%rdx,4)
movss  0x0(%rbp,%rax,4),%xmm0
subss  0x0(%rbp,%rcx,4),%xmm0
divss  0x924(%rip),%xmm0
lea    (%r12,%r12,2),%eax
cltq
movss  %xmm0,0x4(%r14,%rax,4)
cmp    $0x2,%r13d
jne    170f <spline_cubic_set_internal+0x5df>
or     %r11d,%esi
jne    170f <spline_cubic_set_internal+0x5df>
mov    $0x2,%edi
mov    $0x4,%esi
call   1040 <calloc@plt>
mov    %rax,%r15
movq   $0x0,(%rax)
jmp    1725 <spline_cubic_set_internal+0x5f5>
mov    %r13d,%edi
mov    %r14,%rsi
mov    %rbx,%rdx
call   1050 <d3_np_fs@plt>
mov    %rax,%r15
test   %rax,%rax
je     1737 <spline_cubic_set_internal+0x607>
mov    %r14,%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
jmp    174a <spline_cubic_set_internal+0x61a>
mov    %r14,%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
xor    %r15d,%r15d
mov    %r15,%rax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r15d,%r11d
jmp    1299 <spline_cubic_set_internal+0x169>
mov    %r15d,%r11d
mov    0x28(%rsp),%r10
jmp    1299 <spline_cubic_set_internal+0x169>

LLVM IR (-O0):
define float* @spline_cubic_set_internal(i32 %0, float* %1, float* %2, i32 %3, float %4, i32 %5, float %6) {
%8 = alloca float*
%9 = alloca i32
%10 = alloca float*
%11 = alloca float*
%12 = alloca i32
%13 = alloca float
%14 = alloca i32
%15 = alloca float
%16 = alloca float*
%17 = alloca float*
%18 = alloca i32
%19 = alloca float*
store i32 %0, i32* %9
store float* %1, float** %10
store float* %2, float** %11
store i32 %3, i32* %12
store float %4, float* %13
store i32 %5, i32* %14
store float %6, float* %15
%20 = load i32, i32* %9
%21 = icmp sle i32 %20, 1
br i1 %21, label %22, label %23
22: ; preds = %7
store float* null, float** %8
br label %433
23: ; preds = %7
store i32 0, i32* %18
br label %24
24: ; preds = %44, %23
%25 = load i32, i32* %18
%26 = load i32, i32* %9
%27 = sub nsw i32 %26, 1
%28 = icmp slt i32 %25, %27
br i1 %28, label %29, label %47
29: ; preds = %24
%30 = load float*, float** %10
%31 = load i32, i32* %18
%32 = add nsw i32 %31, 1
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds float, float* %30, i64 %33
%35 = load float, float* %34
%36 = load float*, float** %10
%37 = load i32, i32* %18
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds float, float* %36, i64 %38
%40 = load float, float* %39
%41 = fcmp ole float %35, %40
br i1 %41, label %42, label %43
42: ; preds = %29
store float* null, float** %8
br label %433
43: ; preds = %29
br label %44
44: ; preds = %43
%45 = load i32, i32* %18
%46 = add nsw i32 %45, 1
store i32 %46, i32* %18
br label %24
47: ; preds = %24
%48 = load i32, i32* %9
%49 = mul nsw i32 3, %48
%50 = call i64 @calloc(i32 %49, i32 4)
%51 = inttoptr i64 %50 to float*
store float* %51, float** %16
%52 = load i32, i32* %9
%53 = call i64 @calloc(i32 %52, i32 4)
%54 = inttoptr i64 %53 to float*
store float* %54, float** %17
%55 = load i32, i32* %12
%56 = icmp eq i32 %55, 0
br i1 %56, label %57, label %64
57: ; preds = %47
%58 = load float*, float** %17
%59 = getelementptr inbounds float, float* %58, i64 0
store float 0.000000e+00, float* %59
%60 = load float*, float** %16
%61 = getelementptr inbounds float, float* %60, i64 1
store float 1.000000e+00, float* %61
%62 = load float*, float** %16
%63 = getelementptr inbounds float, float* %62, i64 3
store float -1.000000e+00, float* %63
br label %129
64: ; preds = %47
%65 = load i32, i32* %12
%66 = icmp eq i32 %65, 1
br i1 %66, label %67, label %111
67: ; preds = %64
%68 = load float*, float** %11
%69 = getelementptr inbounds float, float* %68, i64 1
%70 = load float, float* %69
%71 = load float*, float** %11
%72 = getelementptr inbounds float, float* %71, i64 0
%73 = load float, float* %72
%74 = fsub float %70, %73
%75 = load float*, float** %10
%76 = getelementptr inbounds float, float* %75, i64 1
%77 = load float, float* %76
%78 = load float*, float** %10
%79 = getelementptr inbounds float, float* %78, i64 0
%80 = load float, float* %79
%81 = fsub float %77, %80
%82 = fdiv float %74, %81
%83 = load float, float* %13
%84 = fsub float %82, %83
%85 = load float*, float** %17
%86 = getelementptr inbounds float, float* %85, i64 0
store float %84, float* %86
%87 = load float*, float** %10
%88 = getelementptr inbounds float, float* %87, i64 1
%89 = load float, float* %88
%90 = load float*, float** %10
%91 = getelementptr inbounds float, float* %90, i64 0
%92 = load float, float* %91
%93 = fsub float %89, %92
%94 = fpext float %93 to double
%95 = fdiv double %94, 3.000000e+00
%96 = fptrunc double %95 to float
%97 = load float*, float** %16
%98 = getelementptr inbounds float, float* %97, i64 1
store float %96, float* %98
%99 = load float*, float** %10
%100 = getelementptr inbounds float, float* %99, i64 1
%101 = load float, float* %100
%102 = load float*, float** %10
%103 = getelementptr inbounds float, float* %102, i64 0
%104 = load float, float* %103
%105 = fsub float %101, %104
%106 = fpext float %105 to double
%107 = fdiv double %106, 6.000000e+00
%108 = fptrunc double %107 to float
%109 = load float*, float** %16
%110 = getelementptr inbounds float, float* %109, i64 3
store float %108, float* %110
br label %128
111: ; preds = %64
%112 = load i32, i32* %12
%113 = icmp eq i32 %112, 2
br i1 %113, label %114, label %122
114: ; preds = %111
%115 = load float, float* %13
%116 = load float*, float** %17
%117 = getelementptr inbounds float, float* %116, i64 0
store float %115, float* %117
%118 = load float*, float** %16
%119 = getelementptr inbounds float, float* %118, i64 1
store float 1.000000e+00, float* %119
%120 = load float*, float** %16
%121 = getelementptr inbounds float, float* %120, i64 3
store float 0.000000e+00, float* %121
br label %127
122: ; preds = %111
%123 = load float*, float** %16
%124 = call i32 @free(float* %123)
%125 = load float*, float** %17
%126 = call i32 @free(float* %125)
store float* null, float** %8
br label %433
127: ; preds = %114
br label %128
128: ; preds = %127, %67
br label %129
129: ; preds = %128, %57
store i32 1, i32* %18
br label %130
130: ; preds = %257, %129
%131 = load i32, i32* %18
%132 = load i32, i32* %9
%133 = sub nsw i32 %132, 1
%134 = icmp slt i32 %131, %133
br i1 %134, label %135, label %260
135: ; preds = %130
%136 = load float*, float** %11
%137 = load i32, i32* %18
%138 = add nsw i32 %137, 1
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds float, float* %136, i64 %139
%141 = load float, float* %140
%142 = load float*, float** %11
%143 = load i32, i32* %18
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds float, float* %142, i64 %144
%146 = load float, float* %145
%147 = fsub float %141, %146
%148 = load float*, float** %10
%149 = load i32, i32* %18
%150 = add nsw i32 %149, 1
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds float, float* %148, i64 %151
%153 = load float, float* %152
%154 = load float*, float** %10
%155 = load i32, i32* %18
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds float, float* %154, i64 %156
%158 = load float, float* %157
%159 = fsub float %153, %158
%160 = fdiv float %147, %159
%161 = load float*, float** %11
%162 = load i32, i32* %18
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds float, float* %161, i64 %163
%165 = load float, float* %164
%166 = load float*, float** %11
%167 = load i32, i32* %18
%168 = sub nsw i32 %167, 1
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds float, float* %166, i64 %169
%171 = load float, float* %170
%172 = fsub float %165, %171
%173 = load float*, float** %10
%174 = load i32, i32* %18
%175 = sext i32 %174 to i64
%176 = getelementptr inbounds float, float* %173, i64 %175
%177 = load float, float* %176
%178 = load float*, float** %10
%179 = load i32, i32* %18
%180 = sub nsw i32 %179, 1
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds float, float* %178, i64 %181
%183 = load float, float* %182
%184 = fsub float %177, %183
%185 = fdiv float %172, %184
%186 = fsub float %160, %185
%187 = load float*, float** %17
%188 = load i32, i32* %18
%189 = sext i32 %188 to i64
%190 = getelementptr inbounds float, float* %187, i64 %189
store float %186, float* %190
%191 = load float*, float** %10
%192 = load i32, i32* %18
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds float, float* %191, i64 %193
%195 = load float, float* %194
%196 = load float*, float** %10
%197 = load i32, i32* %18
%198 = sub nsw i32 %197, 1
%199 = sext i32 %198 to i64
%200 = getelementptr inbounds float, float* %196, i64 %199
%201 = load float, float* %200
%202 = fsub float %195, %201
%203 = fpext float %202 to double
%204 = fdiv double %203, 6.000000e+00
%205 = fptrunc double %204 to float
%206 = load float*, float** %16
%207 = load i32, i32* %18
%208 = sub nsw i32 %207, 1
%209 = mul nsw i32 %208, 3
%210 = add nsw i32 2, %209
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds float, float* %206, i64 %211
store float %205, float* %212
%213 = load float*, float** %10
%214 = load i32, i32* %18
%215 = add nsw i32 %214, 1
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds float, float* %213, i64 %216
%218 = load float, float* %217
%219 = load float*, float** %10
%220 = load i32, i32* %18
%221 = sub nsw i32 %220, 1
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds float, float* %219, i64 %222
%224 = load float, float* %223
%225 = fsub float %218, %224
%226 = fpext float %225 to double
%227 = fdiv double %226, 3.000000e+00
%228 = fptrunc double %227 to float
%229 = load float*, float** %16
%230 = load i32, i32* %18
%231 = mul nsw i32 %230, 3
%232 = add nsw i32 1, %231
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds float, float* %229, i64 %233
store float %228, float* %234
%235 = load float*, float** %10
%236 = load i32, i32* %18
%237 = add nsw i32 %236, 1
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds float, float* %235, i64 %238
%240 = load float, float* %239
%241 = load float*, float** %10
%242 = load i32, i32* %18
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds float, float* %241, i64 %243
%245 = load float, float* %244
%246 = fsub float %240, %245
%247 = fpext float %246 to double
%248 = fdiv double %247, 6.000000e+00
%249 = fptrunc double %248 to float
%250 = load float*, float** %16
%251 = load i32, i32* %18
%252 = add nsw i32 %251, 1
%253 = mul nsw i32 %252, 3
%254 = add nsw i32 0, %253
%255 = sext i32 %254 to i64
%256 = getelementptr inbounds float, float* %250, i64 %255
store float %249, float* %256
br label %257
257: ; preds = %135
%258 = load i32, i32* %18
%259 = add nsw i32 %258, 1
store i32 %259, i32* %18
br label %130
260: ; preds = %130
%261 = load i32, i32* %14
%262 = icmp eq i32 %261, 0
br i1 %262, label %263, label %283
263: ; preds = %260
%264 = load float*, float** %17
%265 = load i32, i32* %9
%266 = sub nsw i32 %265, 1
%267 = sext i32 %266 to i64
%268 = getelementptr inbounds float, float* %264, i64 %267
store float 0.000000e+00, float* %268
%269 = load float*, float** %16
%270 = load i32, i32* %9
%271 = sub nsw i32 %270, 2
%272 = mul nsw i32 %271, 3
%273 = add nsw i32 2, %272
%274 = sext i32 %273 to i64
%275 = getelementptr inbounds float, float* %269, i64 %274
store float -1.000000e+00, float* %275
%276 = load float*, float** %16
%277 = load i32, i32* %9
%278 = sub nsw i32 %277, 1
%279 = mul nsw i32 %278, 3
%280 = add nsw i32 1, %279
%281 = sext i32 %280 to i64
%282 = getelementptr inbounds float, float* %276, i64 %281
store float 1.000000e+00, float* %282
br label %398
283: ; preds = %260
%284 = load i32, i32* %14
%285 = icmp eq i32 %284, 1
br i1 %285, label %286, label %367
286: ; preds = %283
%287 = load float, float* %15
%288 = load float*, float** %11
%289 = load i32, i32* %9
%290 = sub nsw i32 %289, 1
%291 = sext i32 %290 to i64
%292 = getelementptr inbounds float, float* %288, i64 %291
%293 = load float, float* %292
%294 = load float*, float** %11
%295 = load i32, i32* %9
%296 = sub nsw i32 %295, 2
%297 = sext i32 %296 to i64
%298 = getelementptr inbounds float, float* %294, i64 %297
%299 = load float, float* %298
%300 = fsub float %293, %299
%301 = load float*, float** %10
%302 = load i32, i32* %9
%303 = sub nsw i32 %302, 1
%304 = sext i32 %303 to i64
%305 = getelementptr inbounds float, float* %301, i64 %304
%306 = load float, float* %305
%307 = load float*, float** %10
%308 = load i32, i32* %9
%309 = sub nsw i32 %308, 2
%310 = sext i32 %309 to i64
%311 = getelementptr inbounds float, float* %307, i64 %310
%312 = load float, float* %311
%313 = fsub float %306, %312
%314 = fdiv float %300, %313
%315 = fsub float %287, %314
%316 = load float*, float** %17
%317 = load i32, i32* %9
%318 = sub nsw i32 %317, 1
%319 = sext i32 %318 to i64
%320 = getelementptr inbounds float, float* %316, i64 %319
store float %315, float* %320
%321 = load float*, float** %10
%322 = load i32, i32* %9
%323 = sub nsw i32 %322, 1
%324 = sext i32 %323 to i64
%325 = getelementptr inbounds float, float* %321, i64 %324
%326 = load float, float* %325
%327 = load float*, float** %10
%328 = load i32, i32* %9
%329 = sub nsw i32 %328, 2
%330 = sext i32 %329 to i64
%331 = getelementptr inbounds float, float* %327, i64 %330
%332 = load float, float* %331
%333 = fsub float %326, %332
%334 = fpext float %333 to double
%335 = fdiv double %334, 6.000000e+00
%336 = fptrunc double %335 to float
%337 = load float*, float** %16
%338 = load i32, i32* %9
%339 = sub nsw i32 %338, 2
%340 = mul nsw i32 %339, 3
%341 = add nsw i32 2, %340
%342 = sext i32 %341 to i64
%343 = getelementptr inbounds float, float* %337, i64 %342
store float %336, float* %343
%344 = load float*, float** %10
%345 = load i32, i32* %9
%346 = sub nsw i32 %345, 1
%347 = sext i32 %346 to i64
%348 = getelementptr inbounds float, float* %344, i64 %347
%349 = load float, float* %348
%350 = load float*, float** %10
%351 = load i32, i32* %9
%352 = sub nsw i32 %351, 2
%353 = sext i32 %352 to i64
%354 = getelementptr inbounds float, float* %350, i64 %353
%355 = load float, float* %354
%356 = fsub float %349, %355
%357 = fpext float %356 to double
%358 = fdiv double %357, 3.000000e+00
%359 = fptrunc double %358 to float
%360 = load float*, float** %16
%361 = load i32, i32* %9
%362 = sub nsw i32 %361, 1
%363 = mul nsw i32 %362, 3
%364 = add nsw i32 1, %363
%365 = sext i32 %364 to i64
%366 = getelementptr inbounds float, float* %360, i64 %365
store float %359, float* %366
br label %397
367: ; preds = %283
%368 = load i32, i32* %14
%369 = icmp eq i32 %368, 2
br i1 %369, label %370, label %391
370: ; preds = %367
%371 = load float, float* %15
%372 = load float*, float** %17
%373 = load i32, i32* %9
%374 = sub nsw i32 %373, 1
%375 = sext i32 %374 to i64
%376 = getelementptr inbounds float, float* %372, i64 %375
store float %371, float* %376
%377 = load float*, float** %16
%378 = load i32, i32* %9
%379 = sub nsw i32 %378, 2
%380 = mul nsw i32 %379, 3
%381 = add nsw i32 2, %380
%382 = sext i32 %381 to i64
%383 = getelementptr inbounds float, float* %377, i64 %382
store float 0.000000e+00, float* %383
%384 = load float*, float** %16
%385 = load i32, i32* %9
%386 = sub nsw i32 %385, 1
%387 = mul nsw i32 %386, 3
%388 = add nsw i32 1, %387
%389 = sext i32 %388 to i64
%390 = getelementptr inbounds float, float* %384, i64 %389
store float 1.000000e+00, float* %390
br label %396
391: ; preds = %367
%392 = load float*, float** %16
%393 = call i32 @free(float* %392)
%394 = load float*, float** %17
%395 = call i32 @free(float* %394)
store float* null, float** %8
br label %433
396: ; preds = %370
br label %397
397: ; preds = %396, %286
br label %398
398: ; preds = %397, %263
%399 = load i32, i32* %9
%400 = icmp eq i32 %399, 2
br i1 %400, label %401, label %414
401: ; preds = %398
%402 = load i32, i32* %12
%403 = icmp eq i32 %402, 0
br i1 %403, label %404, label %414
404: ; preds = %401
%405 = load i32, i32* %14
%406 = icmp eq i32 %405, 0
br i1 %406, label %407, label %414
407: ; preds = %404
%408 = call i64 @calloc(i32 2, i32 4)
%409 = inttoptr i64 %408 to float*
store float* %409, float** %19
%410 = load float*, float** %19
%411 = getelementptr inbounds float, float* %410, i64 0
store float 0.000000e+00, float* %411
%412 = load float*, float** %19
%413 = getelementptr inbounds float, float* %412, i64 1
store float 0.000000e+00, float* %413
br label %427
414: ; preds = %404, %401, %398
%415 = load i32, i32* %9
%416 = load float*, float** %16
%417 = load float*, float** %17
%418 = call float* @d3_np_fs(i32 %415, float* %416, float* %417)
store float* %418, float** %19
%419 = load float*, float** %19
%420 = icmp ne float* %419, null
br i1 %420, label %426, label %421
421: ; preds = %414
%422 = load float*, float** %16
%423 = call i32 @free(float* %422)
%424 = load float*, float** %17
%425 = call i32 @free(float* %424)
store float* null, float** %8
br label %433
426: ; preds = %414
br label %427
427: ; preds = %426, %407
%428 = load float*, float** %16
%429 = call i32 @free(float* %428)
%430 = load float*, float** %17
%431 = call i32 @free(float* %430)
%432 = load float*, float** %19
store float* %432, float** %8
br label %433
433: ; preds = %427, %421, %391, %122, %42, %22
%434 = load float*, float** %8
ret float* %434
}

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