void SphereFrom4Points(double *PA, double *PB, double *PC, double *PD,
                       double *Cx, double *Cy, double *Cz, double *L) {
  double x1, x2, x3, x4;
  double **a;
  double m11, m12, m13, m14, m15;
  int i;
  a = malloc(4 * sizeof(double *));
  for (i = 0; i < 4; i++) {
    a[i] = malloc(4 * sizeof(double));
  }
  x1 = PA[0] * PA[0] + PA[1] * PA[1] + PA[2] * PA[2];
  x2 = PB[0] * PB[0] + PB[1] * PB[1] + PB[2] * PB[2];
  x3 = PC[0] * PC[0] + PC[1] * PC[1] + PC[2] * PC[2];
  x4 = PD[0] * PD[0] + PD[1] * PD[1] + PD[2] * PD[2];
  a[0][0] = PA[0];
  a[0][1] = PA[1];
  a[0][2] = PA[2];
  a[0][3] = 1;
  a[1][0] = PB[0];
  a[1][1] = PB[1];
  a[1][2] = PB[2];
  a[1][3] = 1;
  a[2][0] = PC[0];
  a[2][1] = PC[1];
  a[2][2] = PC[2];
  a[2][3] = 1;
  a[3][0] = PD[0];
  a[3][1] = PD[1];
  a[3][2] = PD[2];
  a[3][3] = 1;
  m11 = det(a);
  a[0][0] = x1;
  a[0][1] = PA[1];
  a[0][2] = PA[2];
  a[0][3] = 1;
  a[1][0] = x2;
  a[1][1] = PB[1];
  a[1][2] = PB[2];
  a[1][3] = 1;
  a[2][0] = x3;
  a[2][1] = PC[1];
  a[2][2] = PC[2];
  a[2][3] = 1;
  a[3][0] = x4;
  a[3][1] = PD[1];
  a[3][2] = PD[2];
  a[3][3] = 1;
  m12 = det(a);
  a[0][0] = PA[0];
  a[0][1] = x1;
  a[0][2] = PA[2];
  a[0][3] = 1;
  a[1][0] = PB[0];
  a[1][1] = x2;
  a[1][2] = PB[2];
  a[1][3] = 1;
  a[2][0] = PC[0];
  a[2][1] = x3;
  a[2][2] = PC[2];
  a[2][3] = 1;
  a[3][0] = PD[0];
  a[3][1] = x4;
  a[3][2] = PD[2];
  a[3][3] = 1;
  m13 = det(a);
  a[0][0] = PA[0];
  a[0][1] = PA[1];
  a[0][2] = x1;
  a[0][3] = 1;
  a[1][0] = PB[0];
  a[1][1] = PB[1];
  a[1][2] = x2;
  a[1][3] = 1;
  a[2][0] = PC[0];
  a[2][1] = PC[1];
  a[2][2] = x3;
  a[2][3] = 1;
  a[3][0] = PD[0];
  a[3][1] = PD[1];
  a[3][2] = x4;
  a[3][3] = 1;
  m14 = det(a);
  a[0][0] = x1;
  a[0][1] = PA[0];
  a[0][2] = PA[1];
  a[0][3] = PA[2];
  a[1][0] = x2;
  a[1][1] = PB[0];
  a[1][2] = PB[1];
  a[1][3] = PB[2];
  a[2][0] = x3;
  a[2][1] = PC[0];
  a[2][2] = PC[1];
  a[2][3] = PC[2];
  a[3][0] = x4;
  a[3][1] = PD[0];
  a[3][2] = PD[1];
  a[3][3] = PD[2];
  m15 = det(a);
  if (m11 == 0) {
    printf("Points define no sphere \n");
  }
  Cx[0] = 0.5 * m12 / m11;
  Cy[0] = 0.5 * m13 / m11;
  Cz[0] = 0.5 * m14 / m11;
  L[0] = sqrt(Cx[0] * Cx[0] + Cy[0] * Cy[0] + Cz[0] * Cz[0] - m15 / m11);
  for (i = 0; i < 4; i++) {
    free(a[i]);
  }
  free(a);
}


x86 assembly (clang, -O0):
<SphereFrom4Points>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x84(%rbp)
cmpl   $0x4,-0x84(%rbp)
jge    11d0 <SphereFrom4Points+0x80>
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,%rdx
mov    -0x58(%rbp),%rax
movslq -0x84(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1193 <SphereFrom4Points+0x43>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  0xcc0(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0xc6b(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0xc16(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0xbc1(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x0,%al
call   1060 <det@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  0xb5f(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
movsd  -0x40(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0xb0d(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0xabb(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
movsd  -0x50(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0xa69(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x0,%al
call   1060 <det@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
movsd  -0x38(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  0xa08(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x9b7(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x966(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,(%rax)
movsd  -0x50(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0x915(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x0,%al
call   1060 <det@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x38(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  0x8b4(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x40(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x863(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x812(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x50(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0x7c1(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x0,%al
call   1060 <det@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x40(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x8(%rax),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x10(%rax),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x50(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
mov    0x18(%rax),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x0,%al
call   1060 <det@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    19d6 <SphereFrom4Points+0x886>
jp     19d6 <SphereFrom4Points+0x886>
lea    0x641(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movsd  0x62a(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0x610(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  0x5f6(%rip),%xmm0
mulsd  -0x78(%rbp),%xmm0
divsd  -0x60(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
mulsd  (%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
divsd  -0x60(%rbp),%xmm1
subsd  %xmm1,%xmm0
call   1070 <sqrt@plt>
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x84(%rbp)
cmpl   $0x4,-0x84(%rbp)
jge    1abe <SphereFrom4Points+0x96e>
mov    -0x58(%rbp),%rax
movslq -0x84(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1a89 <SphereFrom4Points+0x939>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<SphereFrom4Points>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r9,0x50(%rsp)
mov    %r8,0x48(%rsp)
mov    %rcx,%r12
mov    %rdx,%r13
mov    %rsi,%rbp
mov    %rdi,%r14
mov    0x98(%rsp),%rax
mov    %rax,0x38(%rsp)
mov    0x90(%rsp),%rax
mov    %rax,0x40(%rsp)
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,%rbx
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,%r15
mov    %rax,(%rbx)
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,0x20(%rsp)
mov    %rax,0x8(%rbx)
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,0x28(%rsp)
mov    %rax,0x10(%rbx)
mov    $0x20,%edi
call   1050 <malloc@plt>
mov    %rax,0x18(%rbx)
movupd (%r14),%xmm0
movapd %xmm0,%xmm1
movsd  0x10(%r14),%xmm8
movupd 0x0(%rbp),%xmm3
movsd  0x10(%rbp),%xmm4
movupd 0x0(%r13),%xmm5
movsd  0x10(%r13),%xmm6
movupd (%r12),%xmm7
movsd  0x10(%r12),%xmm2
movupd %xmm0,(%r15)
mulpd  %xmm0,%xmm0
unpckhpd %xmm0,%xmm0
mulsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm8,0x10(%r15)
mov    %r15,%rcx
mulsd  %xmm8,%xmm8
addsd  %xmm1,%xmm8
movsd  %xmm8,(%rsp)
movapd %xmm3,%xmm0
mov    0x20(%rsp),%rdx
movupd %xmm3,(%rdx)
mulpd  %xmm3,%xmm3
unpckhpd %xmm3,%xmm3
mulsd  %xmm0,%xmm0
addsd  %xmm3,%xmm0
movsd  %xmm4,0x10(%rdx)
mulsd  %xmm4,%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x8(%rsp)
movapd %xmm5,%xmm0
mov    0x28(%rsp),%rsi
movupd %xmm5,(%rsi)
mulpd  %xmm5,%xmm5
unpckhpd %xmm5,%xmm5
mulsd  %xmm0,%xmm0
addsd  %xmm5,%xmm0
movsd  %xmm6,0x10(%rsi)
mulsd  %xmm6,%xmm6
addsd  %xmm0,%xmm6
movsd  %xmm6,0x10(%rsp)
movapd %xmm7,%xmm0
movupd %xmm7,(%rax)
mulpd  %xmm7,%xmm7
unpckhpd %xmm7,%xmm7
mulsd  %xmm0,%xmm0
addsd  %xmm7,%xmm0
movsd  %xmm2,0x10(%rax)
mulsd  %xmm2,%xmm2
addsd  %xmm0,%xmm2
movsd  %xmm2,0x18(%rsp)
movabs $0x3ff0000000000000,%r15
mov    %r15,0x18(%rcx)
mov    %r15,0x18(%rdx)
mov    %r15,0x18(%rsi)
mov    %r15,0x18(%rax)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <det@plt>
mov    %eax,0x20(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x28(%rsp)
mov    (%rbx),%rax
movsd  (%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r14),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r14),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    0x8(%rbx),%rax
movsd  0x8(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%rbp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%rbp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    0x10(%rbx),%rax
movsd  0x10(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r13),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r13),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    0x18(%rbx),%rax
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r12),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r12),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <det@plt>
mov    %eax,0x34(%rsp)
movsd  (%r14),%xmm0
mov    (%rbx),%rax
movsd  %xmm0,(%rax)
movsd  (%rsp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r14),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  0x0(%rbp),%xmm0
mov    0x8(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%rbp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  0x0(%r13),%xmm0
mov    0x10(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r13),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  (%r12),%xmm0
mov    0x18(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r12),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <det@plt>
mov    %eax,0x30(%rsp)
movsd  (%r14),%xmm0
mov    (%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%r14),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  (%rsp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  0x0(%rbp),%xmm0
mov    0x8(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%rbp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  0x0(%r13),%xmm0
mov    0x10(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%r13),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
movsd  (%r12),%xmm0
mov    0x18(%rbx),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%r12),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x10(%rax)
mov    %r15,0x18(%rax)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <det@plt>
mov    %eax,%r15d
mov    (%rbx),%rax
movsd  (%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  (%r14),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x8(%r14),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  0x10(%r14),%xmm0
movsd  %xmm0,0x18(%rax)
mov    0x8(%rbx),%rax
movsd  0x8(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x0(%rbp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x8(%rbp),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  0x10(%rbp),%xmm0
movsd  %xmm0,0x18(%rax)
mov    0x10(%rbx),%rax
movsd  0x10(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  0x0(%r13),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x8(%r13),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  0x10(%r13),%xmm0
movsd  %xmm0,0x18(%rax)
mov    0x18(%rbx),%rax
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,(%rax)
movsd  (%r12),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x8(%r12),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  0x10(%r12),%xmm0
movsd  %xmm0,0x18(%rax)
mov    %rbx,%rdi
xor    %eax,%eax
call   1060 <det@plt>
mov    %eax,%ebp
cmpl   $0x0,0x20(%rsp)
jne    15d5 <SphereFrom4Points+0x485>
lea    0xa38(%rip),%rdi
call   1040 <puts@plt>
cvtsi2sd %ebp,%xmm1
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
cvtsi2sdl 0x30(%rsp),%xmm2
cvtsi2sdl 0x34(%rsp),%xmm3
movsd  0xa0b(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0x28(%rsp),%xmm5
divsd  %xmm5,%xmm3
mov    0x48(%rsp),%rcx
movsd  %xmm3,(%rcx)
mulsd  %xmm4,%xmm2
divsd  %xmm5,%xmm2
mov    0x50(%rsp),%rax
movsd  %xmm2,(%rax)
mulsd  %xmm4,%xmm0
divsd  %xmm5,%xmm0
mov    0x40(%rsp),%rdx
movsd  %xmm0,(%rdx)
movsd  (%rcx),%xmm2
movsd  (%rax),%xmm3
mulsd  %xmm3,%xmm3
mulsd  %xmm2,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm0,%xmm0
addsd  %xmm2,%xmm0
divsd  %xmm5,%xmm1
subsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1662 <SphereFrom4Points+0x512>
sqrtsd %xmm0,%xmm0
jmp    1667 <SphereFrom4Points+0x517>
call   1070 <sqrt@plt>
mov    0x38(%rsp),%rax
movsd  %xmm0,(%rax)
mov    (%rbx),%rdi
call   1030 <free@plt>
mov    0x8(%rbx),%rdi
call   1030 <free@plt>
mov    0x10(%rbx),%rdi
call   1030 <free@plt>
mov    0x18(%rbx),%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

LLVM IR (-O0):
@.str = [26 x i8] c"Points define no sphere \0A\00"
define void @SphereFrom4Points(double* %0, double* %1, double* %2, double* %3, double* %4, double* %5, double* %6, double* %7) {
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double*
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double**
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca i32
store double* %0, double** %9
store double* %1, double** %10
store double* %2, double** %11
store double* %3, double** %12
store double* %4, double** %13
store double* %5, double** %14
store double* %6, double** %15
store double* %7, double** %16
%28 = call i8* @malloc(i64 32)
%29 = bitcast i8* %28 to double**
store double** %29, double*** %21
store i32 0, i32* %27
br label %30
30: ; preds = %40, %8
%31 = load i32, i32* %27
%32 = icmp slt i32 %31, 4
br i1 %32, label %33, label %43
33: ; preds = %30
%34 = call i8* @malloc(i64 32)
%35 = bitcast i8* %34 to double*
%36 = load double**, double*** %21
%37 = load i32, i32* %27
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double*, double** %36, i64 %38
store double* %35, double** %39
br label %40
40: ; preds = %33
%41 = load i32, i32* %27
%42 = add nsw i32 %41, 1
store i32 %42, i32* %27
br label %30
43: ; preds = %30
%44 = load double*, double** %9
%45 = getelementptr inbounds double, double* %44, i64 0
%46 = load double, double* %45
%47 = load double*, double** %9
%48 = getelementptr inbounds double, double* %47, i64 0
%49 = load double, double* %48
%50 = load double*, double** %9
%51 = getelementptr inbounds double, double* %50, i64 1
%52 = load double, double* %51
%53 = load double*, double** %9
%54 = getelementptr inbounds double, double* %53, i64 1
%55 = load double, double* %54
%56 = fmul double %52, %55
%57 = call double @llvm.fmuladd.f64(double %46, double %49, double %56)
%58 = load double*, double** %9
%59 = getelementptr inbounds double, double* %58, i64 2
%60 = load double, double* %59
%61 = load double*, double** %9
%62 = getelementptr inbounds double, double* %61, i64 2
%63 = load double, double* %62
%64 = call double @llvm.fmuladd.f64(double %60, double %63, double %57)
store double %64, double* %17
%65 = load double*, double** %10
%66 = getelementptr inbounds double, double* %65, i64 0
%67 = load double, double* %66
%68 = load double*, double** %10
%69 = getelementptr inbounds double, double* %68, i64 0
%70 = load double, double* %69
%71 = load double*, double** %10
%72 = getelementptr inbounds double, double* %71, i64 1
%73 = load double, double* %72
%74 = load double*, double** %10
%75 = getelementptr inbounds double, double* %74, i64 1
%76 = load double, double* %75
%77 = fmul double %73, %76
%78 = call double @llvm.fmuladd.f64(double %67, double %70, double %77)
%79 = load double*, double** %10
%80 = getelementptr inbounds double, double* %79, i64 2
%81 = load double, double* %80
%82 = load double*, double** %10
%83 = getelementptr inbounds double, double* %82, i64 2
%84 = load double, double* %83
%85 = call double @llvm.fmuladd.f64(double %81, double %84, double %78)
store double %85, double* %18
%86 = load double*, double** %11
%87 = getelementptr inbounds double, double* %86, i64 0
%88 = load double, double* %87
%89 = load double*, double** %11
%90 = getelementptr inbounds double, double* %89, i64 0
%91 = load double, double* %90
%92 = load double*, double** %11
%93 = getelementptr inbounds double, double* %92, i64 1
%94 = load double, double* %93
%95 = load double*, double** %11
%96 = getelementptr inbounds double, double* %95, i64 1
%97 = load double, double* %96
%98 = fmul double %94, %97
%99 = call double @llvm.fmuladd.f64(double %88, double %91, double %98)
%100 = load double*, double** %11
%101 = getelementptr inbounds double, double* %100, i64 2
%102 = load double, double* %101
%103 = load double*, double** %11
%104 = getelementptr inbounds double, double* %103, i64 2
%105 = load double, double* %104
%106 = call double @llvm.fmuladd.f64(double %102, double %105, double %99)
store double %106, double* %19
%107 = load double*, double** %12
%108 = getelementptr inbounds double, double* %107, i64 0
%109 = load double, double* %108
%110 = load double*, double** %12
%111 = getelementptr inbounds double, double* %110, i64 0
%112 = load double, double* %111
%113 = load double*, double** %12
%114 = getelementptr inbounds double, double* %113, i64 1
%115 = load double, double* %114
%116 = load double*, double** %12
%117 = getelementptr inbounds double, double* %116, i64 1
%118 = load double, double* %117
%119 = fmul double %115, %118
%120 = call double @llvm.fmuladd.f64(double %109, double %112, double %119)
%121 = load double*, double** %12
%122 = getelementptr inbounds double, double* %121, i64 2
%123 = load double, double* %122
%124 = load double*, double** %12
%125 = getelementptr inbounds double, double* %124, i64 2
%126 = load double, double* %125
%127 = call double @llvm.fmuladd.f64(double %123, double %126, double %120)
store double %127, double* %20
%128 = load double*, double** %9
%129 = getelementptr inbounds double, double* %128, i64 0
%130 = load double, double* %129
%131 = load double**, double*** %21
%132 = getelementptr inbounds double*, double** %131, i64 0
%133 = load double*, double** %132
%134 = getelementptr inbounds double, double* %133, i64 0
store double %130, double* %134
%135 = load double*, double** %9
%136 = getelementptr inbounds double, double* %135, i64 1
%137 = load double, double* %136
%138 = load double**, double*** %21
%139 = getelementptr inbounds double*, double** %138, i64 0
%140 = load double*, double** %139
%141 = getelementptr inbounds double, double* %140, i64 1
store double %137, double* %141
%142 = load double*, double** %9
%143 = getelementptr inbounds double, double* %142, i64 2
%144 = load double, double* %143
%145 = load double**, double*** %21
%146 = getelementptr inbounds double*, double** %145, i64 0
%147 = load double*, double** %146
%148 = getelementptr inbounds double, double* %147, i64 2
store double %144, double* %148
%149 = load double**, double*** %21
%150 = getelementptr inbounds double*, double** %149, i64 0
%151 = load double*, double** %150
%152 = getelementptr inbounds double, double* %151, i64 3
store double 1.000000e+00, double* %152
%153 = load double*, double** %10
%154 = getelementptr inbounds double, double* %153, i64 0
%155 = load double, double* %154
%156 = load double**, double*** %21
%157 = getelementptr inbounds double*, double** %156, i64 1
%158 = load double*, double** %157
%159 = getelementptr inbounds double, double* %158, i64 0
store double %155, double* %159
%160 = load double*, double** %10
%161 = getelementptr inbounds double, double* %160, i64 1
%162 = load double, double* %161
%163 = load double**, double*** %21
%164 = getelementptr inbounds double*, double** %163, i64 1
%165 = load double*, double** %164
%166 = getelementptr inbounds double, double* %165, i64 1
store double %162, double* %166
%167 = load double*, double** %10
%168 = getelementptr inbounds double, double* %167, i64 2
%169 = load double, double* %168
%170 = load double**, double*** %21
%171 = getelementptr inbounds double*, double** %170, i64 1
%172 = load double*, double** %171
%173 = getelementptr inbounds double, double* %172, i64 2
store double %169, double* %173
%174 = load double**, double*** %21
%175 = getelementptr inbounds double*, double** %174, i64 1
%176 = load double*, double** %175
%177 = getelementptr inbounds double, double* %176, i64 3
store double 1.000000e+00, double* %177
%178 = load double*, double** %11
%179 = getelementptr inbounds double, double* %178, i64 0
%180 = load double, double* %179
%181 = load double**, double*** %21
%182 = getelementptr inbounds double*, double** %181, i64 2
%183 = load double*, double** %182
%184 = getelementptr inbounds double, double* %183, i64 0
store double %180, double* %184
%185 = load double*, double** %11
%186 = getelementptr inbounds double, double* %185, i64 1
%187 = load double, double* %186
%188 = load double**, double*** %21
%189 = getelementptr inbounds double*, double** %188, i64 2
%190 = load double*, double** %189
%191 = getelementptr inbounds double, double* %190, i64 1
store double %187, double* %191
%192 = load double*, double** %11
%193 = getelementptr inbounds double, double* %192, i64 2
%194 = load double, double* %193
%195 = load double**, double*** %21
%196 = getelementptr inbounds double*, double** %195, i64 2
%197 = load double*, double** %196
%198 = getelementptr inbounds double, double* %197, i64 2
store double %194, double* %198
%199 = load double**, double*** %21
%200 = getelementptr inbounds double*, double** %199, i64 2
%201 = load double*, double** %200
%202 = getelementptr inbounds double, double* %201, i64 3
store double 1.000000e+00, double* %202
%203 = load double*, double** %12
%204 = getelementptr inbounds double, double* %203, i64 0
%205 = load double, double* %204
%206 = load double**, double*** %21
%207 = getelementptr inbounds double*, double** %206, i64 3
%208 = load double*, double** %207
%209 = getelementptr inbounds double, double* %208, i64 0
store double %205, double* %209
%210 = load double*, double** %12
%211 = getelementptr inbounds double, double* %210, i64 1
%212 = load double, double* %211
%213 = load double**, double*** %21
%214 = getelementptr inbounds double*, double** %213, i64 3
%215 = load double*, double** %214
%216 = getelementptr inbounds double, double* %215, i64 1
store double %212, double* %216
%217 = load double*, double** %12
%218 = getelementptr inbounds double, double* %217, i64 2
%219 = load double, double* %218
%220 = load double**, double*** %21
%221 = getelementptr inbounds double*, double** %220, i64 3
%222 = load double*, double** %221
%223 = getelementptr inbounds double, double* %222, i64 2
store double %219, double* %223
%224 = load double**, double*** %21
%225 = getelementptr inbounds double*, double** %224, i64 3
%226 = load double*, double** %225
%227 = getelementptr inbounds double, double* %226, i64 3
store double 1.000000e+00, double* %227
%228 = load double**, double*** %21
%229 = call i32 (double**, ...) bitcast (i32 (...)* @det to i32 (double**, ...)*)(double** %228)
%230 = sitofp i32 %229 to double
store double %230, double* %22
%231 = load double, double* %17
%232 = load double**, double*** %21
%233 = getelementptr inbounds double*, double** %232, i64 0
%234 = load double*, double** %233
%235 = getelementptr inbounds double, double* %234, i64 0
store double %231, double* %235
%236 = load double*, double** %9
%237 = getelementptr inbounds double, double* %236, i64 1
%238 = load double, double* %237
%239 = load double**, double*** %21
%240 = getelementptr inbounds double*, double** %239, i64 0
%241 = load double*, double** %240
%242 = getelementptr inbounds double, double* %241, i64 1
store double %238, double* %242
%243 = load double*, double** %9
%244 = getelementptr inbounds double, double* %243, i64 2
%245 = load double, double* %244
%246 = load double**, double*** %21
%247 = getelementptr inbounds double*, double** %246, i64 0
%248 = load double*, double** %247
%249 = getelementptr inbounds double, double* %248, i64 2
store double %245, double* %249
%250 = load double**, double*** %21
%251 = getelementptr inbounds double*, double** %250, i64 0
%252 = load double*, double** %251
%253 = getelementptr inbounds double, double* %252, i64 3
store double 1.000000e+00, double* %253
%254 = load double, double* %18
%255 = load double**, double*** %21
%256 = getelementptr inbounds double*, double** %255, i64 1
%257 = load double*, double** %256
%258 = getelementptr inbounds double, double* %257, i64 0
store double %254, double* %258
%259 = load double*, double** %10
%260 = getelementptr inbounds double, double* %259, i64 1
%261 = load double, double* %260
%262 = load double**, double*** %21
%263 = getelementptr inbounds double*, double** %262, i64 1
%264 = load double*, double** %263
%265 = getelementptr inbounds double, double* %264, i64 1
store double %261, double* %265
%266 = load double*, double** %10
%267 = getelementptr inbounds double, double* %266, i64 2
%268 = load double, double* %267
%269 = load double**, double*** %21
%270 = getelementptr inbounds double*, double** %269, i64 1
%271 = load double*, double** %270
%272 = getelementptr inbounds double, double* %271, i64 2
store double %268, double* %272
%273 = load double**, double*** %21
%274 = getelementptr inbounds double*, double** %273, i64 1
%275 = load double*, double** %274
%276 = getelementptr inbounds double, double* %275, i64 3
store double 1.000000e+00, double* %276
%277 = load double, double* %19
%278 = load double**, double*** %21
%279 = getelementptr inbounds double*, double** %278, i64 2
%280 = load double*, double** %279
%281 = getelementptr inbounds double, double* %280, i64 0
store double %277, double* %281
%282 = load double*, double** %11
%283 = getelementptr inbounds double, double* %282, i64 1
%284 = load double, double* %283
%285 = load double**, double*** %21
%286 = getelementptr inbounds double*, double** %285, i64 2
%287 = load double*, double** %286
%288 = getelementptr inbounds double, double* %287, i64 1
store double %284, double* %288
%289 = load double*, double** %11
%290 = getelementptr inbounds double, double* %289, i64 2
%291 = load double, double* %290
%292 = load double**, double*** %21
%293 = getelementptr inbounds double*, double** %292, i64 2
%294 = load double*, double** %293
%295 = getelementptr inbounds double, double* %294, i64 2
store double %291, double* %295
%296 = load double**, double*** %21
%297 = getelementptr inbounds double*, double** %296, i64 2
%298 = load double*, double** %297
%299 = getelementptr inbounds double, double* %298, i64 3
store double 1.000000e+00, double* %299
%300 = load double, double* %20
%301 = load double**, double*** %21
%302 = getelementptr inbounds double*, double** %301, i64 3
%303 = load double*, double** %302
%304 = getelementptr inbounds double, double* %303, i64 0
store double %300, double* %304
%305 = load double*, double** %12
%306 = getelementptr inbounds double, double* %305, i64 1
%307 = load double, double* %306
%308 = load double**, double*** %21
%309 = getelementptr inbounds double*, double** %308, i64 3
%310 = load double*, double** %309
%311 = getelementptr inbounds double, double* %310, i64 1
store double %307, double* %311
%312 = load double*, double** %12
%313 = getelementptr inbounds double, double* %312, i64 2
%314 = load double, double* %313
%315 = load double**, double*** %21
%316 = getelementptr inbounds double*, double** %315, i64 3
%317 = load double*, double** %316
%318 = getelementptr inbounds double, double* %317, i64 2
store double %314, double* %318
%319 = load double**, double*** %21
%320 = getelementptr inbounds double*, double** %319, i64 3
%321 = load double*, double** %320
%322 = getelementptr inbounds double, double* %321, i64 3
store double 1.000000e+00, double* %322
%323 = load double**, double*** %21
%324 = call i32 (double**, ...) bitcast (i32 (...)* @det to i32 (double**, ...)*)(double** %323)
%325 = sitofp i32 %324 to double
store double %325, double* %23
%326 = load double*, double** %9
%327 = getelementptr inbounds double, double* %326, i64 0
%328 = load double, double* %327
%329 = load double**, double*** %21
%330 = getelementptr inbounds double*, double** %329, i64 0
%331 = load double*, double** %330
%332 = getelementptr inbounds double, double* %331, i64 0
store double %328, double* %332
%333 = load double, double* %17
%334 = load double**, double*** %21
%335 = getelementptr inbounds double*, double** %334, i64 0
%336 = load double*, double** %335
%337 = getelementptr inbounds double, double* %336, i64 1
store double %333, double* %337
%338 = load double*, double** %9
%339 = getelementptr inbounds double, double* %338, i64 2
%340 = load double, double* %339
%341 = load double**, double*** %21
%342 = getelementptr inbounds double*, double** %341, i64 0
%343 = load double*, double** %342
%344 = getelementptr inbounds double, double* %343, i64 2
store double %340, double* %344
%345 = load double**, double*** %21
%346 = getelementptr inbounds double*, double** %345, i64 0
%347 = load double*, double** %346
%348 = getelementptr inbounds double, double* %347, i64 3
store double 1.000000e+00, double* %348
%349 = load double*, double** %10
%350 = getelementptr inbounds double, double* %349, i64 0
%351 = load double, double* %350
%352 = load double**, double*** %21
%353 = getelementptr inbounds double*, double** %352, i64 1
%354 = load double*, double** %353
%355 = getelementptr inbounds double, double* %354, i64 0
store double %351, double* %355
%356 = load double, double* %18
%357 = load double**, double*** %21
%358 = getelementptr inbounds double*, double** %357, i64 1
%359 = load double*, double** %358
%360 = getelementptr inbounds double, double* %359, i64 1
store double %356, double* %360
%361 = load double*, double** %10
%362 = getelementptr inbounds double, double* %361, i64 2
%363 = load double, double* %362
%364 = load double**, double*** %21
%365 = getelementptr inbounds double*, double** %364, i64 1
%366 = load double*, double** %365
%367 = getelementptr inbounds double, double* %366, i64 2
store double %363, double* %367
%368 = load double**, double*** %21
%369 = getelementptr inbounds double*, double** %368, i64 1
%370 = load double*, double** %369
%371 = getelementptr inbounds double, double* %370, i64 3
store double 1.000000e+00, double* %371
%372 = load double*, double** %11
%373 = getelementptr inbounds double, double* %372, i64 0
%374 = load double, double* %373
%375 = load double**, double*** %21
%376 = getelementptr inbounds double*, double** %375, i64 2
%377 = load double*, double** %376
%378 = getelementptr inbounds double, double* %377, i64 0
store double %374, double* %378
%379 = load double, double* %19
%380 = load double**, double*** %21
%381 = getelementptr inbounds double*, double** %380, i64 2
%382 = load double*, double** %381
%383 = getelementptr inbounds double, double* %382, i64 1
store double %379, double* %383
%384 = load double*, double** %11
%385 = getelementptr inbounds double, double* %384, i64 2
%386 = load double, double* %385
%387 = load double**, double*** %21
%388 = getelementptr inbounds double*, double** %387, i64 2
%389 = load double*, double** %388
%390 = getelementptr inbounds double, double* %389, i64 2
store double %386, double* %390
%391 = load double**, double*** %21
%392 = getelementptr inbounds double*, double** %391, i64 2
%393 = load double*, double** %392
%394 = getelementptr inbounds double, double* %393, i64 3
store double 1.000000e+00, double* %394
%395 = load double*, double** %12
%396 = getelementptr inbounds double, double* %395, i64 0
%397 = load double, double* %396
%398 = load double**, double*** %21
%399 = getelementptr inbounds double*, double** %398, i64 3
%400 = load double*, double** %399
%401 = getelementptr inbounds double, double* %400, i64 0
store double %397, double* %401
%402 = load double, double* %20
%403 = load double**, double*** %21
%404 = getelementptr inbounds double*, double** %403, i64 3
%405 = load double*, double** %404
%406 = getelementptr inbounds double, double* %405, i64 1
store double %402, double* %406
%407 = load double*, double** %12
%408 = getelementptr inbounds double, double* %407, i64 2
%409 = load double, double* %408
%410 = load double**, double*** %21
%411 = getelementptr inbounds double*, double** %410, i64 3
%412 = load double*, double** %411
%413 = getelementptr inbounds double, double* %412, i64 2
store double %409, double* %413
%414 = load double**, double*** %21
%415 = getelementptr inbounds double*, double** %414, i64 3
%416 = load double*, double** %415
%417 = getelementptr inbounds double, double* %416, i64 3
store double 1.000000e+00, double* %417
%418 = load double**, double*** %21
%419 = call i32 (double**, ...) bitcast (i32 (...)* @det to i32 (double**, ...)*)(double** %418)
%420 = sitofp i32 %419 to double
store double %420, double* %24
%421 = load double*, double** %9
%422 = getelementptr inbounds double, double* %421, i64 0
%423 = load double, double* %422
%424 = load double**, double*** %21
%425 = getelementptr inbounds double*, double** %424, i64 0
%426 = load double*, double** %425
%427 = getelementptr inbounds double, double* %426, i64 0
store double %423, double* %427
%428 = load double*, double** %9
%429 = getelementptr inbounds double, double* %428, i64 1
%430 = load double, double* %429
%431 = load double**, double*** %21
%432 = getelementptr inbounds double*, double** %431, i64 0
%433 = load double*, double** %432
%434 = getelementptr inbounds double, double* %433, i64 1
store double %430, double* %434
%435 = load double, double* %17
%436 = load double**, double*** %21
%437 = getelementptr inbounds double*, double** %436, i64 0
%438 = load double*, double** %437
%439 = getelementptr inbounds double, double* %438, i64 2
store double %435, double* %439
%440 = load double**, double*** %21
%441 = getelementptr inbounds double*, double** %440, i64 0
%442 = load double*, double** %441
%443 = getelementptr inbounds double, double* %442, i64 3
store double 1.000000e+00, double* %443
%444 = load double*, double** %10
%445 = getelementptr inbounds double, double* %444, i64 0
%446 = load double, double* %445
%447 = load double**, double*** %21
%448 = getelementptr inbounds double*, double** %447, i64 1
%449 = load double*, double** %448
%450 = getelementptr inbounds double, double* %449, i64 0
store double %446, double* %450
%451 = load double*, double** %10
%452 = getelementptr inbounds double, double* %451, i64 1
%453 = load double, double* %452
%454 = load double**, double*** %21
%455 = getelementptr inbounds double*, double** %454, i64 1
%456 = load double*, double** %455
%457 = getelementptr inbounds double, double* %456, i64 1
store double %453, double* %457
%458 = load double, double* %18
%459 = load double**, double*** %21
%460 = getelementptr inbounds double*, double** %459, i64 1
%461 = load double*, double** %460
%462 = getelementptr inbounds double, double* %461, i64 2
store double %458, double* %462
%463 = load double**, double*** %21
%464 = getelementptr inbounds double*, double** %463, i64 1
%465 = load double*, double** %464
%466 = getelementptr inbounds double, double* %465, i64 3
store double 1.000000e+00, double* %466
%467 = load double*, double** %11
%468 = getelementptr inbounds double, double* %467, i64 0
%469 = load double, double* %468
%470 = load double**, double*** %21
%471 = getelementptr inbounds double*, double** %470, i64 2
%472 = load double*, double** %471
%473 = getelementptr inbounds double, double* %472, i64 0
store double %469, double* %473
%474 = load double*, double** %11
%475 = getelementptr inbounds double, double* %474, i64 1
%476 = load double, double* %475
%477 = load double**, double*** %21
%478 = getelementptr inbounds double*, double** %477, i64 2
%479 = load double*, double** %478
%480 = getelementptr inbounds double, double* %479, i64 1
store double %476, double* %480
%481 = load double, double* %19
%482 = load double**, double*** %21
%483 = getelementptr inbounds double*, double** %482, i64 2
%484 = load double*, double** %483
%485 = getelementptr inbounds double, double* %484, i64 2
store double %481, double* %485
%486 = load double**, double*** %21
%487 = getelementptr inbounds double*, double** %486, i64 2
%488 = load double*, double** %487
%489 = getelementptr inbounds double, double* %488, i64 3
store double 1.000000e+00, double* %489
%490 = load double*, double** %12
%491 = getelementptr inbounds double, double* %490, i64 0
%492 = load double, double* %491
%493 = load double**, double*** %21
%494 = getelementptr inbounds double*, double** %493, i64 3
%495 = load double*, double** %494
%496 = getelementptr inbounds double, double* %495, i64 0
store double %492, double* %496
%497 = load double*, double** %12
%498 = getelementptr inbounds double, double* %497, i64 1
%499 = load double, double* %498
%500 = load double**, double*** %21
%501 = getelementptr inbounds double*, double** %500, i64 3
%502 = load double*, double** %501
%503 = getelementptr inbounds double, double* %502, i64 1
store double %499, double* %503
%504 = load double, double* %20
%505 = load double**, double*** %21
%506 = getelementptr inbounds double*, double** %505, i64 3
%507 = load double*, double** %506
%508 = getelementptr inbounds double, double* %507, i64 2
store double %504, double* %508
%509 = load double**, double*** %21
%510 = getelementptr inbounds double*, double** %509, i64 3
%511 = load double*, double** %510
%512 = getelementptr inbounds double, double* %511, i64 3
store double 1.000000e+00, double* %512
%513 = load double**, double*** %21
%514 = call i32 (double**, ...) bitcast (i32 (...)* @det to i32 (double**, ...)*)(double** %513)
%515 = sitofp i32 %514 to double
store double %515, double* %25
%516 = load double, double* %17
%517 = load double**, double*** %21
%518 = getelementptr inbounds double*, double** %517, i64 0
%519 = load double*, double** %518
%520 = getelementptr inbounds double, double* %519, i64 0
store double %516, double* %520
%521 = load double*, double** %9
%522 = getelementptr inbounds double, double* %521, i64 0
%523 = load double, double* %522
%524 = load double**, double*** %21
%525 = getelementptr inbounds double*, double** %524, i64 0
%526 = load double*, double** %525
%527 = getelementptr inbounds double, double* %526, i64 1
store double %523, double* %527
%528 = load double*, double** %9
%529 = getelementptr inbounds double, double* %528, i64 1
%530 = load double, double* %529
%531 = load double**, double*** %21
%532 = getelementptr inbounds double*, double** %531, i64 0
%533 = load double*, double** %532
%534 = getelementptr inbounds double, double* %533, i64 2
store double %530, double* %534
%535 = load double*, double** %9
%536 = getelementptr inbounds double, double* %535, i64 2
%537 = load double, double* %536
%538 = load double**, double*** %21
%539 = getelementptr inbounds double*, double** %538, i64 0
%540 = load double*, double** %539
%541 = getelementptr inbounds double, double* %540, i64 3
store double %537, double* %541
%542 = load double, double* %18
%543 = load double**, double*** %21
%544 = getelementptr inbounds double*, double** %543, i64 1
%545 = load double*, double** %544
%546 = getelementptr inbounds double, double* %545, i64 0
store double %542, double* %546
%547 = load double*, double** %10
%548 = getelementptr inbounds double, double* %547, i64 0
%549 = load double, double* %548
%550 = load double**, double*** %21
%551 = getelementptr inbounds double*, double** %550, i64 1
%552 = load double*, double** %551
%553 = getelementptr inbounds double, double* %552, i64 1
store double %549, double* %553
%554 = load double*, double** %10
%555 = getelementptr inbounds double, double* %554, i64 1
%556 = load double, double* %555
%557 = load double**, double*** %21
%558 = getelementptr inbounds double*, double** %557, i64 1
%559 = load double*, double** %558
%560 = getelementptr inbounds double, double* %559, i64 2
store double %556, double* %560
%561 = load double*, double** %10
%562 = getelementptr inbounds double, double* %561, i64 2
%563 = load double, double* %562
%564 = load double**, double*** %21
%565 = getelementptr inbounds double*, double** %564, i64 1
%566 = load double*, double** %565
%567 = getelementptr inbounds double, double* %566, i64 3
store double %563, double* %567
%568 = load double, double* %19
%569 = load double**, double*** %21
%570 = getelementptr inbounds double*, double** %569, i64 2
%571 = load double*, double** %570
%572 = getelementptr inbounds double, double* %571, i64 0
store double %568, double* %572
%573 = load double*, double** %11
%574 = getelementptr inbounds double, double* %573, i64 0
%575 = load double, double* %574
%576 = load double**, double*** %21
%577 = getelementptr inbounds double*, double** %576, i64 2
%578 = load double*, double** %577
%579 = getelementptr inbounds double, double* %578, i64 1
store double %575, double* %579
%580 = load double*, double** %11
%581 = getelementptr inbounds double, double* %580, i64 1
%582 = load double, double* %581
%583 = load double**, double*** %21
%584 = getelementptr inbounds double*, double** %583, i64 2
%585 = load double*, double** %584
%586 = getelementptr inbounds double, double* %585, i64 2
store double %582, double* %586
%587 = load double*, double** %11
%588 = getelementptr inbounds double, double* %587, i64 2
%589 = load double, double* %588
%590 = load double**, double*** %21
%591 = getelementptr inbounds double*, double** %590, i64 2
%592 = load double*, double** %591
%593 = getelementptr inbounds double, double* %592, i64 3
store double %589, double* %593
%594 = load double, double* %20
%595 = load double**, double*** %21
%596 = getelementptr inbounds double*, double** %595, i64 3
%597 = load double*, double** %596
%598 = getelementptr inbounds double, double* %597, i64 0
store double %594, double* %598
%599 = load double*, double** %12
%600 = getelementptr inbounds double, double* %599, i64 0
%601 = load double, double* %600
%602 = load double**, double*** %21
%603 = getelementptr inbounds double*, double** %602, i64 3
%604 = load double*, double** %603
%605 = getelementptr inbounds double, double* %604, i64 1
store double %601, double* %605
%606 = load double*, double** %12
%607 = getelementptr inbounds double, double* %606, i64 1
%608 = load double, double* %607
%609 = load double**, double*** %21
%610 = getelementptr inbounds double*, double** %609, i64 3
%611 = load double*, double** %610
%612 = getelementptr inbounds double, double* %611, i64 2
store double %608, double* %612
%613 = load double*, double** %12
%614 = getelementptr inbounds double, double* %613, i64 2
%615 = load double, double* %614
%616 = load double**, double*** %21
%617 = getelementptr inbounds double*, double** %616, i64 3
%618 = load double*, double** %617
%619 = getelementptr inbounds double, double* %618, i64 3
store double %615, double* %619
%620 = load double**, double*** %21
%621 = call i32 (double**, ...) bitcast (i32 (...)* @det to i32 (double**, ...)*)(double** %620)
%622 = sitofp i32 %621 to double
store double %622, double* %26
%623 = load double, double* %22
%624 = fcmp oeq double %623, 0.000000e+00
br i1 %624, label %625, label %627
625: ; preds = %43
%626 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0))
br label %627
627: ; preds = %625, %43
%628 = load double, double* %23
%629 = fmul double 5.000000e-01, %628
%630 = load double, double* %22
%631 = fdiv double %629, %630
%632 = load double*, double** %13
%633 = getelementptr inbounds double, double* %632, i64 0
store double %631, double* %633
%634 = load double, double* %24
%635 = fmul double 5.000000e-01, %634
%636 = load double, double* %22
%637 = fdiv double %635, %636
%638 = load double*, double** %14
%639 = getelementptr inbounds double, double* %638, i64 0
store double %637, double* %639
%640 = load double, double* %25
%641 = fmul double 5.000000e-01, %640
%642 = load double, double* %22
%643 = fdiv double %641, %642
%644 = load double*, double** %15
%645 = getelementptr inbounds double, double* %644, i64 0
store double %643, double* %645
%646 = load double*, double** %13
%647 = getelementptr inbounds double, double* %646, i64 0
%648 = load double, double* %647
%649 = load double*, double** %13
%650 = getelementptr inbounds double, double* %649, i64 0
%651 = load double, double* %650
%652 = load double*, double** %14
%653 = getelementptr inbounds double, double* %652, i64 0
%654 = load double, double* %653
%655 = load double*, double** %14
%656 = getelementptr inbounds double, double* %655, i64 0
%657 = load double, double* %656
%658 = fmul double %654, %657
%659 = call double @llvm.fmuladd.f64(double %648, double %651, double %658)
%660 = load double*, double** %15
%661 = getelementptr inbounds double, double* %660, i64 0
%662 = load double, double* %661
%663 = load double*, double** %15
%664 = getelementptr inbounds double, double* %663, i64 0
%665 = load double, double* %664
%666 = call double @llvm.fmuladd.f64(double %662, double %665, double %659)
%667 = load double, double* %26
%668 = load double, double* %22
%669 = fdiv double %667, %668
%670 = fsub double %666, %669
%671 = call double @sqrt(double %670)
%672 = load double*, double** %16
%673 = getelementptr inbounds double, double* %672, i64 0
store double %671, double* %673
store i32 0, i32* %27
br label %674
674: ; preds = %684, %627
%675 = load i32, i32* %27
%676 = icmp slt i32 %675, 4
br i1 %676, label %677, label %687
677: ; preds = %674
%678 = load double**, double*** %21
%679 = load i32, i32* %27
%680 = sext i32 %679 to i64
%681 = getelementptr inbounds double*, double** %678, i64 %680
%682 = load double*, double** %681
%683 = bitcast double* %682 to i8*
br label %684
684: ; preds = %677
%685 = load i32, i32* %27
%686 = add nsw i32 %685, 1
store i32 %686, i32* %27
br label %674
687: ; preds = %674
%688 = load double**, double*** %21
%689 = bitcast double** %688 to i8*
ret void
}

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