void spline3(float x1, float x2, float z1, float z2, float dzdx1, float dzdx2,
             float *a, float *b, float *c, float *d) {
  if (x1 == x2) {
    if ((z1 == z2) && (dzdx1 == dzdx2)) {
      *a = 0.0;
      *b = 0.0;
      *c = dzdx1;
      *d = (z1 - *c * x1);
    } else {
      return;
    }
    return;
  }
  *a = (dzdx1 + dzdx2 - 2.0 * (z1 - z2) / (x1 - x2)) / ((x1 - x2) * (x1 - x2));
  *b = 0.5 * (dzdx1 - dzdx2) / (x1 - x2) - 1.5 * *a * (x1 + x2);
  *c = (z1 - z2 - *a * (x1 * x1 * x1 - x2 * x2 * x2) -
        *b * (x1 * x1 - x2 * x2)) /
       (x1 - x2);
  *d = z1 - *a * x1 * x1 * x1 - *b * x1 * x1 - *c * x1;
  return;
}


x86 assembly (clang, -O0):
<spline3>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
movss  %xmm4,-0x14(%rbp)
movss  %xmm5,-0x18(%rbp)
mov    %rdi,-0x20(%rbp)
mov    %rsi,-0x28(%rbp)
mov    %rdx,-0x30(%rbp)
mov    %rcx,-0x38(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jne    11d2 <spline3+0xd2>
jp     11d2 <spline3+0xd2>
movss  -0xc(%rbp),%xmm0
ucomiss -0x10(%rbp),%xmm0
jne    11c8 <spline3+0xc8>
jp     11c8 <spline3+0xc8>
movss  -0x14(%rbp),%xmm0
ucomiss -0x18(%rbp),%xmm0
jne    11c8 <spline3+0xc8>
jp     11c8 <spline3+0xc8>
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movss  -0x14(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm1
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x4(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
jmp    11cd <spline3+0xcd>
jmp    13f1 <spline3+0x2f1>
jmp    13f1 <spline3+0x2f1>
movss  -0x14(%rbp),%xmm0
addss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
subss  -0x10(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe1a(%rip),%xmm1
mulsd  %xmm2,%xmm1
movss  -0x4(%rbp),%xmm2
subss  -0x8(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movss  -0x4(%rbp),%xmm1
subss  -0x8(%rbp),%xmm1
movss  -0x4(%rbp),%xmm2
subss  -0x8(%rbp),%xmm2
mulss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x14(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdb6(%rip),%xmm1
mulsd  %xmm0,%xmm1
movss  -0x4(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm0,%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xd84(%rip),%xmm0
mulsd  %xmm2,%xmm0
movss  -0x4(%rbp),%xmm2
addss  -0x8(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
subss  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm1
movss  -0x4(%rbp),%xmm2
mulss  -0x4(%rbp),%xmm2
movss  -0x4(%rbp),%xmm4
movss  -0x8(%rbp),%xmm3
mulss  -0x8(%rbp),%xmm3
mulss  -0x8(%rbp),%xmm3
movd   %xmm3,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm3
mulss  %xmm4,%xmm2
addss  %xmm3,%xmm2
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x4(%rbp),%xmm2
movss  -0x4(%rbp),%xmm4
movss  -0x8(%rbp),%xmm3
mulss  -0x8(%rbp),%xmm3
movd   %xmm3,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm3
mulss  %xmm4,%xmm2
addss  %xmm3,%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x4(%rbp),%xmm1
subss  -0x8(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  -0x4(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm1
mulss  -0x4(%rbp),%xmm1
movss  -0x4(%rbp),%xmm2
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x4(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<spline3>:
ucomiss %xmm1,%xmm0
jne    113a <spline3+0x3a>
jp     113a <spline3+0x3a>
ucomiss %xmm3,%xmm2
jne    1237 <spline3+0x137>
jp     1237 <spline3+0x137>
ucomiss %xmm5,%xmm4
jne    1237 <spline3+0x137>
jp     1237 <spline3+0x137>
movl   $0x0,(%rdi)
movl   $0x0,(%rsi)
movss  %xmm4,(%rdx)
jmp    122b <spline3+0x12b>
movaps %xmm4,%xmm6
addss  %xmm5,%xmm6
cvtss2sd %xmm6,%xmm7
movaps %xmm2,%xmm6
subss  %xmm3,%xmm6
xorps  %xmm3,%xmm3
cvtss2sd %xmm6,%xmm3
addsd  %xmm3,%xmm3
movaps %xmm0,%xmm8
subss  %xmm1,%xmm8
cvtss2sd %xmm8,%xmm9
divsd  %xmm9,%xmm3
subsd  %xmm3,%xmm7
movaps %xmm8,%xmm3
mulss  %xmm8,%xmm3
cvtss2sd %xmm3,%xmm3
divsd  %xmm3,%xmm7
xorps  %xmm3,%xmm3
cvtsd2ss %xmm7,%xmm3
subss  %xmm5,%xmm4
cvtss2sd %xmm4,%xmm4
mulsd  0xe6a(%rip),%xmm4
movss  %xmm3,(%rdi)
divsd  %xmm9,%xmm4
cvtss2sd %xmm3,%xmm3
movaps %xmm0,%xmm5
addss  %xmm1,%xmm5
cvtss2sd %xmm5,%xmm5
mulsd  0xe52(%rip),%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
cvtsd2ss %xmm3,%xmm3
movss  %xmm3,(%rsi)
movaps %xmm0,%xmm4
mulss  %xmm0,%xmm4
movaps 0xe3c(%rip),%xmm5
xorps  %xmm1,%xmm5
mulss  %xmm1,%xmm5
mulss  %xmm5,%xmm1
addss  %xmm4,%xmm5
mulss  %xmm0,%xmm4
addss  %xmm1,%xmm4
mulss  (%rdi),%xmm4
subss  %xmm4,%xmm6
mulss  %xmm3,%xmm5
subss  %xmm5,%xmm6
divss  %xmm8,%xmm6
movss  %xmm6,(%rdx)
movss  (%rdi),%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
subss  %xmm1,%xmm2
movss  (%rsi),%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
subss  %xmm1,%xmm2
movaps %xmm6,%xmm4
mulss  %xmm0,%xmm4
subss  %xmm4,%xmm2
movss  %xmm2,(%rcx)
ret

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

LLVM IR (-O2):
define void @spline3(float %0, float %1, float %2, float %3, float %4, float %5, float* nocapture %6, float* nocapture %7, float* nocapture writeonly %8, float* nocapture writeonly %9) {
%11 = fcmp oeq float %0, %1
br i1 %11, label %12, label %17
12: ; preds = %10
%13 = fcmp oeq float %2, %3
%14 = fcmp oeq float %4, %5
%15 = and i1 %13, %14
br i1 %15, label %16, label %67
16: ; preds = %12
store float 0.000000e+00, float* %6
store float 0.000000e+00, float* %7
store float %4, float* %8
br label %62
17: ; preds = %10
%18 = fadd float %4, %5
%19 = fpext float %18 to double
%20 = fsub float %2, %3
%21 = fpext float %20 to double
%22 = fmul double %21, 2.000000e+00
%23 = fsub float %0, %1
%24 = fpext float %23 to double
%25 = fdiv double %22, %24
%26 = fsub double %19, %25
%27 = fmul float %23, %23
%28 = fpext float %27 to double
%29 = fdiv double %26, %28
%30 = fptrunc double %29 to float
store float %30, float* %6
%31 = fsub float %4, %5
%32 = fpext float %31 to double
%33 = fmul double %32, 5.000000e-01
%34 = fdiv double %33, %24
%35 = fpext float %30 to double
%36 = fadd float %0, %1
%37 = fpext float %36 to double
%38 = fmul double %35, -1.500000e+00
%39 = tail call double @llvm.fmuladd.f64(double %38, double %37, double %34)
%40 = fptrunc double %39 to float
store float %40, float* %7
%41 = load float, float* %6
%42 = fmul float %0, %0
%43 = fneg float %1
%44 = fmul float %43, %1
%45 = fmul float %44, %1
%46 = tail call float @llvm.fmuladd.f32(float %42, float %0, float %45)
%47 = fneg float %41
%48 = tail call float @llvm.fmuladd.f32(float %47, float %46, float %20)
%49 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %44)
%50 = fneg float %40
%51 = tail call float @llvm.fmuladd.f32(float %50, float %49, float %48)
%52 = fdiv float %51, %23
store float %52, float* %8
%53 = load float, float* %6
%54 = fneg float %53
%55 = fmul float %54, %0
%56 = fmul float %55, %0
%57 = tail call float @llvm.fmuladd.f32(float %56, float %0, float %2)
%58 = load float, float* %7
%59 = fneg float %58
%60 = fmul float %59, %0
%61 = tail call float @llvm.fmuladd.f32(float %60, float %0, float %57)
br label %62
62: ; preds = %16, %17
%63 = phi float [ %52, %17 ], [ %4, %16 ]
%64 = phi float [ %61, %17 ], [ %2, %16 ]
%65 = fneg float %63
%66 = tail call float @llvm.fmuladd.f32(float %65, float %0, float %64)
store float %66, float* %9
br label %67
67: ; preds = %62, %12
ret void
}