double det4x4(double M[4 * 4]) {
  return M[0] * (M[5] * M[10] * M[15] + M[7] * M[9] * M[14] +
                 M[13] * M[6] * M[11] - M[7] * M[10] * M[13] -
                 M[5] * M[11] * M[14] - M[15] * M[6] * M[9]) -
         M[1] * (M[4] * M[10] * M[15] + M[7] * M[8] * M[14] +
                 M[12] * M[6] * M[11] - M[7] * M[10] * M[12] -
                 M[4] * M[11] * M[14] - M[15] * M[6] * M[8]) +
         M[2] * (M[4] * M[9] * M[15] + M[7] * M[8] * M[13] +
                 M[12] * M[5] * M[11] - M[7] * M[9] * M[12] -
                 M[4] * M[11] * M[13] - M[15] * M[5] * M[8]) -
         M[3] *
             (M[4] * M[9] * M[14] + M[6] * M[8] * M[13] + M[12] * M[5] * M[10] -
              M[6] * M[9] * M[12] - M[4] * M[10] * M[13] - M[14] * M[5] * M[8]);
}


x86 assembly (clang, -O0):
<det4x4>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x50(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm1
mov    -0x8(%rbp),%rax
mulsd  0x48(%rax),%xmm1
mov    -0x8(%rbp),%rax
mulsd  0x70(%rax),%xmm1
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x68(%rax),%xmm1
mov    -0x8(%rbp),%rax
mulsd  0x30(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x58(%rax),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x50(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x68(%rax),%xmm3
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm1
mov    -0x8(%rbp),%rax
mulsd  0x58(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x70(%rax),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x30(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x48(%rax),%xmm3
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x50(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm5
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm4
mov    -0x8(%rbp),%rax
mulsd  0x40(%rax),%xmm4
mov    -0x8(%rbp),%rax
mulsd  0x70(%rax),%xmm4
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm4
mov    -0x8(%rbp),%rax
mulsd  0x30(%rax),%xmm4
mov    -0x8(%rbp),%rax
movsd  0x58(%rax),%xmm5
mulsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x50(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm5
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm4
mov    -0x8(%rbp),%rax
mulsd  0x58(%rax),%xmm4
mov    -0x8(%rbp),%rax
movsd  0x70(%rax),%xmm5
movq   %xmm4,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm4
mulsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x30(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x40(%rax),%xmm5
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x48(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm4
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x40(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x68(%rax),%xmm3
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x28(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x58(%rax),%xmm4
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x48(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm4
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x58(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x68(%rax),%xmm4
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x28(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x40(%rax),%xmm4
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x48(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x70(%rax),%xmm4
mov    -0x8(%rbp),%rax
movsd  0x30(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x40(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x68(%rax),%xmm3
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x28(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x50(%rax),%xmm4
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x30(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x48(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm4
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulsd  0x50(%rax),%xmm3
mov    -0x8(%rbp),%rax
movsd  0x68(%rax),%xmm4
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm4,%xmm3
addsd  %xmm2,%xmm3
mov    -0x8(%rbp),%rax
movsd  0x70(%rax),%xmm2
mov    -0x8(%rbp),%rax
mulsd  0x28(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x40(%rax),%xmm4
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<det4x4>:
movsd  0x28(%rdi),%xmm14
movsd  0x50(%rdi),%xmm6
movapd %xmm14,%xmm0
mulsd  %xmm6,%xmm0
movsd  0x78(%rdi),%xmm4
movsd  0x38(%rdi),%xmm13
movsd  0x48(%rdi),%xmm1
movapd %xmm13,%xmm3
movapd %xmm13,-0x68(%rsp)
mulsd  %xmm1,%xmm3
movapd %xmm3,-0x18(%rsp)
movapd %xmm1,%xmm10
movsd  %xmm1,-0x70(%rsp)
movsd  0x70(%rdi),%xmm5
movapd %xmm3,%xmm1
mulsd  %xmm5,%xmm1
movapd %xmm5,%xmm2
movsd  %xmm5,-0x38(%rsp)
mulsd  %xmm4,%xmm0
movapd %xmm4,%xmm12
addsd  %xmm1,%xmm0
movsd  0x68(%rdi),%xmm3
movsd  0x30(%rdi),%xmm4
movapd %xmm3,%xmm1
movapd %xmm3,%xmm5
movsd  %xmm3,-0x30(%rsp)
mulsd  %xmm4,%xmm1
movapd %xmm4,%xmm3
movsd  0x58(%rdi),%xmm11
mulsd  %xmm11,%xmm1
addsd  %xmm0,%xmm1
movapd 0xe60(%rip),%xmm4
xorpd  %xmm4,%xmm13
mulsd  %xmm6,%xmm13
movapd %xmm13,%xmm7
mulsd  %xmm5,%xmm7
addsd  %xmm1,%xmm7
movapd %xmm11,%xmm1
mulsd  %xmm14,%xmm1
mulsd  %xmm2,%xmm1
subsd  %xmm1,%xmm7
movapd %xmm12,%xmm9
movapd %xmm12,%xmm1
xorpd  %xmm4,%xmm9
movsd  %xmm3,-0x40(%rsp)
mulsd  %xmm3,%xmm9
movapd %xmm9,%xmm12
mulsd  %xmm10,%xmm12
addsd  %xmm7,%xmm12
movsd  0x60(%rdi),%xmm0
mulsd  %xmm0,%xmm3
movsd  %xmm0,-0x50(%rsp)
mulsd  %xmm11,%xmm3
movsd  %xmm3,-0x48(%rsp)
movsd  0x20(%rdi),%xmm10
xorpd  %xmm10,%xmm4
mulsd  %xmm11,%xmm4
movapd %xmm14,%xmm15
mulsd  %xmm0,%xmm15
mulsd  %xmm15,%xmm11
mulsd  %xmm6,%xmm15
movapd %xmm6,%xmm3
mulsd  %xmm10,%xmm3
movsd  0x40(%rdi),%xmm5
movapd -0x68(%rsp),%xmm8
mulsd  %xmm5,%xmm8
movapd %xmm3,%xmm0
movapd %xmm1,%xmm6
mulsd  %xmm1,%xmm0
movapd %xmm4,%xmm2
movsd  -0x38(%rsp),%xmm1
mulsd  %xmm1,%xmm2
mulsd  -0x70(%rsp),%xmm10
movapd %xmm10,%xmm7
mulsd  %xmm6,%xmm7
mulsd  %xmm14,%xmm6
movapd %xmm6,-0x28(%rsp)
mulsd  %xmm1,%xmm10
mulsd  %xmm1,%xmm14
movsd  %xmm14,-0x68(%rsp)
mulsd  %xmm8,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x48(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x50(%rsp),%xmm6
mulsd  %xmm6,%xmm13
addsd  %xmm1,%xmm13
addsd  %xmm13,%xmm2
mulsd  %xmm5,%xmm9
addsd  %xmm2,%xmm9
movsd  -0x30(%rsp),%xmm2
mulsd  %xmm2,%xmm8
addsd  %xmm8,%xmm7
addsd  %xmm7,%xmm11
movapd -0x18(%rsp),%xmm0
mulsd  %xmm6,%xmm0
subsd  %xmm0,%xmm11
mulsd  %xmm2,%xmm4
addsd  %xmm11,%xmm4
movapd -0x28(%rsp),%xmm0
mulsd  %xmm5,%xmm0
subsd  %xmm0,%xmm4
mulsd  0x8(%rdi),%xmm9
mulsd  (%rdi),%xmm12
mulsd  0x10(%rdi),%xmm4
subsd  %xmm9,%xmm12
addsd  %xmm12,%xmm4
movsd  -0x70(%rsp),%xmm0
movsd  -0x40(%rsp),%xmm1
mulsd  %xmm1,%xmm0
mulsd  %xmm5,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm1,%xmm10
addsd  %xmm10,%xmm15
mulsd  %xmm6,%xmm0
subsd  %xmm0,%xmm15
mulsd  %xmm2,%xmm3
subsd  %xmm3,%xmm15
movsd  -0x68(%rsp),%xmm0
mulsd  %xmm5,%xmm0
subsd  %xmm0,%xmm15
mulsd  0x18(%rdi),%xmm15
subsd  %xmm15,%xmm4
movapd %xmm4,%xmm0
ret

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

LLVM IR (-O2):
define double @det4x4(double* nocapture %0) {
%2 = load double, double* %0
%3 = getelementptr inbounds double, double* %0, i64 5
%4 = load double, double* %3
%5 = getelementptr inbounds double, double* %0, i64 10
%6 = load double, double* %5
%7 = fmul double %4, %6
%8 = getelementptr inbounds double, double* %0, i64 15
%9 = load double, double* %8
%10 = getelementptr inbounds double, double* %0, i64 7
%11 = load double, double* %10
%12 = getelementptr inbounds double, double* %0, i64 9
%13 = load double, double* %12
%14 = fmul double %11, %13
%15 = getelementptr inbounds double, double* %0, i64 14
%16 = load double, double* %15
%17 = fmul double %14, %16
%18 = tail call double @llvm.fmuladd.f64(double %7, double %9, double %17)
%19 = getelementptr inbounds double, double* %0, i64 13
%20 = load double, double* %19
%21 = getelementptr inbounds double, double* %0, i64 6
%22 = load double, double* %21
%23 = fmul double %20, %22
%24 = getelementptr inbounds double, double* %0, i64 11
%25 = load double, double* %24
%26 = tail call double @llvm.fmuladd.f64(double %23, double %25, double %18)
%27 = fneg double %11
%28 = fmul double %6, %27
%29 = tail call double @llvm.fmuladd.f64(double %28, double %20, double %26)
%30 = fneg double %4
%31 = fmul double %25, %30
%32 = tail call double @llvm.fmuladd.f64(double %31, double %16, double %29)
%33 = fneg double %9
%34 = fmul double %22, %33
%35 = tail call double @llvm.fmuladd.f64(double %34, double %13, double %32)
%36 = getelementptr inbounds double, double* %0, i64 1
%37 = load double, double* %36
%38 = getelementptr inbounds double, double* %0, i64 4
%39 = load double, double* %38
%40 = fmul double %6, %39
%41 = getelementptr inbounds double, double* %0, i64 8
%42 = load double, double* %41
%43 = fmul double %11, %42
%44 = fmul double %16, %43
%45 = tail call double @llvm.fmuladd.f64(double %40, double %9, double %44)
%46 = getelementptr inbounds double, double* %0, i64 12
%47 = load double, double* %46
%48 = fmul double %22, %47
%49 = tail call double @llvm.fmuladd.f64(double %48, double %25, double %45)
%50 = tail call double @llvm.fmuladd.f64(double %28, double %47, double %49)
%51 = fneg double %39
%52 = fmul double %25, %51
%53 = tail call double @llvm.fmuladd.f64(double %52, double %16, double %50)
%54 = tail call double @llvm.fmuladd.f64(double %34, double %42, double %53)
%55 = fneg double %37
%56 = fmul double %54, %55
%57 = tail call double @llvm.fmuladd.f64(double %2, double %35, double %56)
%58 = getelementptr inbounds double, double* %0, i64 2
%59 = load double, double* %58
%60 = fmul double %13, %39
%61 = fmul double %20, %43
%62 = tail call double @llvm.fmuladd.f64(double %60, double %9, double %61)
%63 = fmul double %4, %47
%64 = tail call double @llvm.fmuladd.f64(double %63, double %25, double %62)
%65 = fneg double %14
%66 = tail call double @llvm.fmuladd.f64(double %65, double %47, double %64)
%67 = tail call double @llvm.fmuladd.f64(double %52, double %20, double %66)
%68 = fmul double %4, %33
%69 = tail call double @llvm.fmuladd.f64(double %68, double %42, double %67)
%70 = tail call double @llvm.fmuladd.f64(double %59, double %69, double %57)
%71 = getelementptr inbounds double, double* %0, i64 3
%72 = load double, double* %71
%73 = fmul double %22, %42
%74 = fmul double %20, %73
%75 = tail call double @llvm.fmuladd.f64(double %60, double %16, double %74)
%76 = tail call double @llvm.fmuladd.f64(double %63, double %6, double %75)
%77 = fneg double %22
%78 = fmul double %13, %77
%79 = tail call double @llvm.fmuladd.f64(double %78, double %47, double %76)
%80 = fneg double %40
%81 = tail call double @llvm.fmuladd.f64(double %80, double %20, double %79)
%82 = fneg double %16
%83 = fmul double %4, %82
%84 = tail call double @llvm.fmuladd.f64(double %83, double %42, double %81)
%85 = fneg double %72
%86 = tail call double @llvm.fmuladd.f64(double %85, double %84, double %70)
ret double %86
}