#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 */
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *);
int /*<<< orphan*/ stderr;
double det(double **X, int n) {
  if (n == 1)
    return X[0][0];
  else if (n == 2)
    return X[0][0] * X[1][1] - X[0][1] * X[1][0];
  else if (n == 3) {
    double a = X[0][0];
    double b = X[0][1];
    double c = X[0][2];
    double d = X[1][0];
    double e = X[1][1];
    double f = X[1][2];
    double g = X[2][0];
    double h = X[2][1];
    double i = X[2][2];
    return a * e * i - a * f * h + b * f * g - b * d * i + c * d * h -
           c * e * g;
  } else if (n == 4) {
    double a00 = X[0][0];
    double a01 = X[0][1];
    double a02 = X[0][2];
    double a03 = X[0][3];
    double a10 = X[1][0];
    double a11 = X[1][1];
    double a12 = X[1][2];
    double a13 = X[1][3];
    double a20 = X[2][0];
    double a21 = X[2][1];
    double a22 = X[2][2];
    double a23 = X[2][3];
    double a30 = X[3][0];
    double a31 = X[3][1];
    double a32 = X[3][2];
    double a33 = X[3][3];
    return a00 * a11 * a22 * a33 - a00 * a11 * a23 * a32 -
           a00 * a12 * a21 * a33 + a00 * a12 * a23 * a31 +
           a00 * a13 * a21 * a32 - a00 * a13 * a22 * a31 -
           a01 * a10 * a22 * a33 + a01 * a10 * a23 * a32 +
           a01 * a12 * a20 * a33 - a01 * a12 * a23 * a30 -
           a01 * a13 * a20 * a32 + a01 * a13 * a22 * a30 +
           a02 * a10 * a21 * a33 - a02 * a10 * a23 * a31 -
           a02 * a11 * a20 * a33 + a02 * a11 * a23 * a30 +
           a02 * a13 * a20 * a31 - a02 * a13 * a21 * a30 -
           a03 * a10 * a21 * a32 + a03 * a10 * a22 * a31 +
           a03 * a11 * a20 * a32 - a03 * a11 * a22 * a30 -
           a03 * a12 * a20 * a31 + a03 * a12 * a21 * a30;
  } else {
    fprintf(stderr, "Error: det() not supported for > 4x4 matrices\n");
    exit(1);
  }
  return 0;
}


x86 assembly (clang, -O0):
<det>:
push   %rbp
mov    %rsp,%rbp
sub    $0xe0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x1,-0x14(%rbp)
jne    1151 <det+0x31>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    191e <det+0x7fe>
cmpl   $0x2,-0x14(%rbp)
jne    11b4 <det+0x94>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x8(%rax),%xmm2
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mulsd  (%rax),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    191e <det+0x7fe>
cmpl   $0x3,-0x14(%rbp)
jne    132b <det+0x20b>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm1
mulsd  -0x48(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
mulsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    191e <det+0x7fe>
cmpl   $0x4,-0x14(%rbp)
jne    18ff <det+0x7df>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xe0(%rbp),%xmm2
ff
movsd  -0x68(%rbp),%xmm1
mulsd  -0x90(%rbp),%xmm1
ff
mulsd  -0xc0(%rbp),%xmm1
ff
mulsd  -0xd8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  -0x98(%rbp),%xmm1
ff
mulsd  -0xb0(%rbp),%xmm1
ff
movsd  -0xe0(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0xd0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
mulsd  -0xb0(%rbp),%xmm1
ff
movsd  -0xd8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xd0(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  -0x88(%rbp),%xmm1
ff
mulsd  -0xb8(%rbp),%xmm1
ff
movsd  -0xe0(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0xd8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  -0x98(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xe0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xd8(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x78(%rbp),%xmm1
mulsd  -0x88(%rbp),%xmm1
ff
mulsd  -0xb0(%rbp),%xmm1
ff
movsd  -0xe0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0xd0(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x78(%rbp),%xmm1
mulsd  -0x90(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xe0(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x78(%rbp),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xd0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0xb0(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
mulsd  -0x88(%rbp),%xmm1
ff
mulsd  -0xb0(%rbp),%xmm1
ff
movsd  -0xd8(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x80(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xd0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
mulsd  -0x90(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xd8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x80(%rbp),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
mulsd  -0x98(%rbp),%xmm1
ff
mulsd  -0xa8(%rbp),%xmm1
ff
movsd  -0xd0(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x80(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mulsd  -0xb0(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    191e <det+0x7fe>
mov    0x26da(%rip),%rax
mov    (%rax),%edi
lea    0x6f1(%rip),%rsi
call   1030 <fprintf@plt>
mov    $0x1,%edi
call   1040 <exit@plt>
movsd  -0x8(%rbp),%xmm0
add    $0xe0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<det>:
sub    $0x18,%rsp
add    $0xffffffff,%esi
cmp    $0x3,%esi
ja     142c <det+0x30c>
lea    0xec9(%rip),%rax
movslq (%rax,%rsi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    (%rdi),%rax
movsd  (%rax),%xmm0
add    $0x18,%rsp
ret
mov    (%rdi),%rax
mov    0x8(%rdi),%rcx
movsd  (%rax),%xmm5
movsd  0x8(%rax),%xmm3
movsd  0x10(%rax),%xmm8
movsd  (%rcx),%xmm6
movsd  0x8(%rcx),%xmm1
movsd  0x10(%rcx),%xmm7
mov    0x10(%rdi),%rax
movsd  (%rax),%xmm9
movsd  0x8(%rax),%xmm2
movsd  0x10(%rax),%xmm4
movapd %xmm8,%xmm0
mulsd  %xmm6,%xmm0
mulsd  %xmm3,%xmm6
mulsd  %xmm7,%xmm3
mulsd  %xmm5,%xmm7
mulsd  %xmm1,%xmm5
mulsd  %xmm2,%xmm7
mulsd  %xmm4,%xmm5
subsd  %xmm7,%xmm5
mulsd  %xmm9,%xmm3
addsd  %xmm5,%xmm3
mulsd  %xmm4,%xmm6
subsd  %xmm6,%xmm3
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
mulsd  %xmm8,%xmm1
mulsd  %xmm9,%xmm1
jmp    11e6 <det+0xc6>
mov    (%rdi),%rax
mov    0x8(%rdi),%rcx
movsd  (%rcx),%xmm1
mulsd  0x8(%rax),%xmm1
movsd  (%rax),%xmm0
mulsd  0x8(%rcx),%xmm0
subsd  %xmm1,%xmm0
add    $0x18,%rsp
ret
mov    (%rdi),%rax
mov    0x8(%rdi),%rsi
movsd  (%rax),%xmm3
movsd  0x8(%rax),%xmm1
movsd  (%rsi),%xmm15
movsd  0x8(%rsi),%xmm9
movsd  0x10(%rsi),%xmm5
mov    0x10(%rdi),%rdx
movsd  0x8(%rdx),%xmm4
movsd  0x10(%rdx),%xmm14
movsd  0x18(%rdx),%xmm8
mov    0x18(%rdi),%rcx
movsd  0x10(%rcx),%xmm10
movsd  0x18(%rcx),%xmm11
movapd %xmm3,%xmm6
mulsd  %xmm9,%xmm6
movapd %xmm3,%xmm7
mulsd  %xmm5,%xmm7
movsd  %xmm5,0x10(%rsp)
movapd %xmm4,%xmm2
movapd %xmm4,%xmm12
movsd  %xmm4,0x8(%rsp)
mulsd  %xmm7,%xmm2
mulsd  %xmm8,%xmm7
movapd %xmm1,%xmm0
mulsd  %xmm15,%xmm0
movapd %xmm14,%xmm4
mulsd  %xmm0,%xmm4
mulsd  %xmm8,%xmm0
movapd %xmm8,%xmm13
mulsd  %xmm6,%xmm13
mulsd  %xmm14,%xmm6
mulsd  %xmm10,%xmm13
mulsd  %xmm11,%xmm6
subsd  %xmm13,%xmm6
movsd  0x18(%rsi),%xmm13
mulsd  %xmm11,%xmm2
subsd  %xmm2,%xmm6
movsd  0x8(%rcx),%xmm2
mulsd  %xmm2,%xmm7
addsd  %xmm6,%xmm7
mulsd  %xmm13,%xmm3
movapd %xmm14,%xmm6
mulsd  %xmm3,%xmm6
mulsd  %xmm12,%xmm3
mulsd  %xmm10,%xmm3
addsd  %xmm7,%xmm3
movapd %xmm8,%xmm12
mulsd  %xmm2,%xmm6
subsd  %xmm6,%xmm3
movsd  0x10(%rax),%xmm7
mulsd  %xmm11,%xmm4
subsd  %xmm4,%xmm3
movsd  (%rdx),%xmm6
mulsd  %xmm10,%xmm0
addsd  %xmm3,%xmm0
movapd %xmm1,%xmm4
mulsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm12
mulsd  %xmm6,%xmm4
mulsd  %xmm11,%xmm4
addsd  %xmm0,%xmm4
movsd  (%rcx),%xmm3
mulsd  %xmm3,%xmm12
subsd  %xmm12,%xmm4
mulsd  %xmm13,%xmm1
movapd %xmm6,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm10,%xmm0
subsd  %xmm0,%xmm4
mulsd  %xmm14,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm4,%xmm1
movapd %xmm7,%xmm0
mulsd  %xmm9,%xmm0
movapd %xmm6,%xmm12
mulsd  %xmm0,%xmm12
mulsd  %xmm8,%xmm0
movapd %xmm7,%xmm4
mulsd  %xmm15,%xmm4
mulsd  %xmm4,%xmm8
movsd  0x8(%rsp),%xmm5
mulsd  %xmm5,%xmm4
mulsd  %xmm11,%xmm4
addsd  %xmm1,%xmm4
mulsd  %xmm2,%xmm8
subsd  %xmm8,%xmm4
mulsd  %xmm11,%xmm12
subsd  %xmm12,%xmm4
mulsd  %xmm3,%xmm0
addsd  %xmm4,%xmm0
mulsd  %xmm13,%xmm7
movapd %xmm5,%xmm4
mulsd  %xmm7,%xmm4
mulsd  %xmm6,%xmm7
mulsd  %xmm2,%xmm7
addsd  %xmm0,%xmm7
movsd  0x18(%rax),%xmm0
mulsd  %xmm3,%xmm4
subsd  %xmm4,%xmm7
mulsd  %xmm0,%xmm15
movapd %xmm5,%xmm4
mulsd  %xmm15,%xmm4
mulsd  %xmm10,%xmm4
subsd  %xmm4,%xmm7
mulsd  %xmm14,%xmm15
mulsd  %xmm2,%xmm15
addsd  %xmm7,%xmm15
mulsd  %xmm0,%xmm9
mulsd  %xmm9,%xmm14
mulsd  %xmm6,%xmm9
mulsd  %xmm10,%xmm9
addsd  %xmm15,%xmm9
mulsd  %xmm3,%xmm14
subsd  %xmm14,%xmm9
mulsd  0x10(%rsp),%xmm0
mulsd  %xmm0,%xmm6
mulsd  %xmm2,%xmm6
subsd  %xmm6,%xmm9
mulsd  %xmm5,%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm9,%xmm0
add    $0x18,%rsp
ret
mov    0x2bad(%rip),%rax
mov    (%rax),%edi
lea    0xbd4(%rip),%rsi
call   1030 <fprintf@plt>
mov    $0x1,%edi
call   1040 <exit@plt>

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

LLVM IR (-O2):
@stderr = global i32 0
@.str = [47 x i8] c"Error: det() not supported for > 4x4 matrices\0A\00"
define double @det(double** nocapture %0, i32 %1) {
switch i32 %1, label %163 [
i32 1, label %3
i32 2, label %6
i32 3, label %19
i32 4, label %55
]
3: ; preds = %2
%4 = load double*, double** %0
%5 = load double, double* %4
br label %167
6: ; preds = %2
%7 = load double*, double** %0
%8 = load double, double* %7
%9 = getelementptr inbounds double*, double** %0, i64 1
%10 = load double*, double** %9
%11 = getelementptr inbounds double, double* %10, i64 1
%12 = load double, double* %11
%13 = getelementptr inbounds double, double* %7, i64 1
%14 = load double, double* %13
%15 = load double, double* %10
%16 = fneg double %14
%17 = fmul double %15, %16
%18 = tail call double @llvm.fmuladd.f64(double %8, double %12, double %17)
br label %167
19: ; preds = %2
%20 = load double*, double** %0
%21 = load double, double* %20
%22 = getelementptr inbounds double, double* %20, i64 1
%23 = load double, double* %22
%24 = getelementptr inbounds double, double* %20, i64 2
%25 = load double, double* %24
%26 = getelementptr inbounds double*, double** %0, i64 1
%27 = load double*, double** %26
%28 = load double, double* %27
%29 = getelementptr inbounds double, double* %27, i64 1
%30 = load double, double* %29
%31 = getelementptr inbounds double, double* %27, i64 2
%32 = load double, double* %31
%33 = getelementptr inbounds double*, double** %0, i64 2
%34 = load double*, double** %33
%35 = load double, double* %34
%36 = getelementptr inbounds double, double* %34, i64 1
%37 = load double, double* %36
%38 = getelementptr inbounds double, double* %34, i64 2
%39 = load double, double* %38
%40 = fmul double %21, %30
%41 = fneg double %21
%42 = fmul double %32, %41
%43 = fmul double %42, %37
%44 = tail call double @llvm.fmuladd.f64(double %40, double %39, double %43)
%45 = fmul double %23, %32
%46 = tail call double @llvm.fmuladd.f64(double %45, double %35, double %44)
%47 = fneg double %23
%48 = fmul double %28, %47
%49 = tail call double @llvm.fmuladd.f64(double %48, double %39, double %46)
%50 = fmul double %25, %28
%51 = tail call double @llvm.fmuladd.f64(double %50, double %37, double %49)
%52 = fneg double %25
%53 = fmul double %30, %52
%54 = tail call double @llvm.fmuladd.f64(double %53, double %35, double %51)
br label %167
55: ; preds = %2
%56 = load double*, double** %0
%57 = load double, double* %56
%58 = getelementptr inbounds double, double* %56, i64 1
%59 = load double, double* %58
%60 = getelementptr inbounds double, double* %56, i64 2
%61 = load double, double* %60
%62 = getelementptr inbounds double, double* %56, i64 3
%63 = load double, double* %62
%64 = getelementptr inbounds double*, double** %0, i64 1
%65 = load double*, double** %64
%66 = load double, double* %65
%67 = getelementptr inbounds double, double* %65, i64 1
%68 = load double, double* %67
%69 = getelementptr inbounds double, double* %65, i64 2
%70 = load double, double* %69
%71 = getelementptr inbounds double, double* %65, i64 3
%72 = load double, double* %71
%73 = getelementptr inbounds double*, double** %0, i64 2
%74 = load double*, double** %73
%75 = load double, double* %74
%76 = getelementptr inbounds double, double* %74, i64 1
%77 = load double, double* %76
%78 = getelementptr inbounds double, double* %74, i64 2
%79 = load double, double* %78
%80 = getelementptr inbounds double, double* %74, i64 3
%81 = load double, double* %80
%82 = getelementptr inbounds double*, double** %0, i64 3
%83 = load double*, double** %82
%84 = load double, double* %83
%85 = getelementptr inbounds double, double* %83, i64 1
%86 = load double, double* %85
%87 = getelementptr inbounds double, double* %83, i64 2
%88 = load double, double* %87
%89 = getelementptr inbounds double, double* %83, i64 3
%90 = load double, double* %89
%91 = fmul double %57, %68
%92 = fmul double %91, %79
%93 = fneg double %91
%94 = fmul double %81, %93
%95 = fmul double %94, %88
%96 = tail call double @llvm.fmuladd.f64(double %92, double %90, double %95)
%97 = fmul double %57, %70
%98 = fneg double %97
%99 = fmul double %77, %98
%100 = tail call double @llvm.fmuladd.f64(double %99, double %90, double %96)
%101 = fmul double %97, %81
%102 = tail call double @llvm.fmuladd.f64(double %101, double %86, double %100)
%103 = fmul double %57, %72
%104 = fmul double %103, %77
%105 = tail call double @llvm.fmuladd.f64(double %104, double %88, double %102)
%106 = fneg double %103
%107 = fmul double %79, %106
%108 = tail call double @llvm.fmuladd.f64(double %107, double %86, double %105)
%109 = fmul double %59, %66
%110 = fneg double %109
%111 = fmul double %79, %110
%112 = tail call double @llvm.fmuladd.f64(double %111, double %90, double %108)
%113 = fmul double %109, %81
%114 = tail call double @llvm.fmuladd.f64(double %113, double %88, double %112)
%115 = fmul double %59, %70
%116 = fmul double %115, %75
%117 = tail call double @llvm.fmuladd.f64(double %116, double %90, double %114)
%118 = fneg double %115
%119 = fmul double %81, %118
%120 = tail call double @llvm.fmuladd.f64(double %119, double %84, double %117)
%121 = fmul double %59, %72
%122 = fneg double %121
%123 = fmul double %75, %122
%124 = tail call double @llvm.fmuladd.f64(double %123, double %88, double %120)
%125 = fmul double %121, %79
%126 = tail call double @llvm.fmuladd.f64(double %125, double %84, double %124)
%127 = fmul double %61, %66
%128 = fmul double %127, %77
%129 = tail call double @llvm.fmuladd.f64(double %128, double %90, double %126)
%130 = fneg double %127
%131 = fmul double %81, %130
%132 = tail call double @llvm.fmuladd.f64(double %131, double %86, double %129)
%133 = fmul double %61, %68
%134 = fneg double %133
%135 = fmul double %75, %134
%136 = tail call double @llvm.fmuladd.f64(double %135, double %90, double %132)
%137 = fmul double %133, %81
%138 = tail call double @llvm.fmuladd.f64(double %137, double %84, double %136)
%139 = fmul double %61, %72
%140 = fmul double %139, %75
%141 = tail call double @llvm.fmuladd.f64(double %140, double %86, double %138)
%142 = fneg double %139
%143 = fmul double %77, %142
%144 = tail call double @llvm.fmuladd.f64(double %143, double %84, double %141)
%145 = fmul double %63, %66
%146 = fneg double %145
%147 = fmul double %77, %146
%148 = tail call double @llvm.fmuladd.f64(double %147, double %88, double %144)
%149 = fmul double %145, %79
%150 = tail call double @llvm.fmuladd.f64(double %149, double %86, double %148)
%151 = fmul double %63, %68
%152 = fmul double %151, %75
%153 = tail call double @llvm.fmuladd.f64(double %152, double %88, double %150)
%154 = fneg double %151
%155 = fmul double %79, %154
%156 = tail call double @llvm.fmuladd.f64(double %155, double %84, double %153)
%157 = fmul double %63, %70
%158 = fneg double %157
%159 = fmul double %75, %158
%160 = tail call double @llvm.fmuladd.f64(double %159, double %86, double %156)
%161 = fmul double %157, %77
%162 = tail call double @llvm.fmuladd.f64(double %161, double %84, double %160)
br label %167
163: ; preds = %2
%164 = load i32, i32* @stderr
%165 = tail call i32 @fprintf(i32 %164, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @.str, i64 0, i64 0))
%166 = tail call i32 @exit(i32 1)
unreachable
167: ; preds = %55, %19, %6, %3
%168 = phi double [ %5, %3 ], [ %18, %6 ], [ %54, %19 ], [ %162, %55 ]
ret double %168
}