void ludcmp(double **a, int n, int *indx, double *d) {
  char *func = {"ludcmp(): "};
  int i, imax, j, k;
  double big, dum, sum, temp, *vv;
  vv = (double *)mem_alloc((n) * sizeof(double), func, "vv[]");
  *d = 1.0;
  for (i = 0; i < n; i++) {
    big = 1.0E-10;
    for (j = 0; j < n; j++) {
      if ((temp = fabs(a[i][j])) > big)
        big = temp;
    }
    if (big == 1.0E-10) {
      printf("\n\nSingular matrix in routine ludcmp()\n");
      exit(1);
    }
    vv[i] = 1.0 / big;
  }
  for (j = 0; j < n; j++) {
    for (i = 0; i < j; i++) {
      sum = a[i][j];
      for (k = 0; k < i; k++)
        sum -= a[i][k] * a[k][j];
      a[i][j] = sum;
    }
    big = 1.0E-10;
    for (i = j; i < n; i++) {
      sum = a[i][j];
      for (k = 0; k < j; k++)
        sum -= a[i][k] * a[k][j];
      a[i][j] = sum;
      if ((dum = vv[i] * fabs(sum)) >= big) {
        big = dum;
        imax = i;
      }
    }
    if (j != imax) {
      for (k = 0; k < n; k++) {
        dum = a[imax][k];
        a[imax][k] = a[j][k];
        a[j][k] = dum;
      }
      (*d) *= -1;
      vv[imax] = vv[j];
    }
    indx[j] = imax;
    if (fabs(a[j][j]) < 1.0E-10)
      a[j][j] = 1.0E-10;
    if (j < (n - 1)) {
      dum = 1.0 / a[j][j];
      for (i = j + 1; i < n; i++)
        a[i][j] *= dum;
    }
  }
  free(vv);
}


x86 assembly (clang, -O0):
<ludcmp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
lea    0xed2(%rip),%rax
mov    %rax,-0x28(%rbp)
movslq -0xc(%rbp),%rdi
shl    $0x3,%rdi
mov    -0x28(%rbp),%rsi
lea    0xec6(%rip),%rdx
mov    $0x0,%al
call   1050 <mem_alloc@plt>
cltq
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0xe72(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    126f <ludcmp+0x12f>
movsd  0xe5b(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1212 <ludcmp+0xd2>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xe3f(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
ucomisd -0x40(%rbp),%xmm0
jbe    11ff <ludcmp+0xbf>
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1204 <ludcmp+0xc4>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11b9 <ludcmp+0x79>
movsd  -0x40(%rbp),%xmm0
movsd  0xde9(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1247 <ludcmp+0x107>
jp     1247 <ludcmp+0x107>
lea    0xe0a(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    $0x1,%edi
call   1060 <exit@plt>
movsd  0xdb1(%rip),%xmm0
divsd  -0x40(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1199 <ludcmp+0x59>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1609 <ludcmp+0x4c9>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    134b <ludcmp+0x20b>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1323 <ludcmp+0x1e3>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    12b6 <ludcmp+0x176>
movsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1289 <ludcmp+0x149>
movsd  0xcb5(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1466 <ludcmp+0x326>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    13f8 <ludcmp+0x2b8>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    138b <ludcmp+0x24b>
movsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x60(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x50(%rbp),%xmm1
movaps 0xbf5(%rip),%xmm2
pand   %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
ucomisd -0x40(%rbp),%xmm0
jb     1453 <ludcmp+0x313>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1458 <ludcmp+0x318>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    135e <ludcmp+0x21e>
mov    -0x34(%rbp),%eax
cmp    -0x30(%rbp),%eax
je     151f <ludcmp+0x3df>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14f1 <ludcmp+0x3b1>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1479 <ludcmp+0x339>
mov    -0x20(%rbp),%rax
movsd  0xb13(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x60(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x60(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movaps 0xad7(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  0xab3(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    157c <ludcmp+0x43c>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  0xa91(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    15f6 <ludcmp+0x4b6>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
movsd  0xa5b(%rip),%xmm0
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    15f1 <ludcmp+0x4b1>
movsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    15b8 <ludcmp+0x478>
jmp    15f6 <ludcmp+0x4b6>
jmp    15fb <ludcmp+0x4bb>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1276 <ludcmp+0x136>
mov    -0x60(%rbp),%rdi
call   1030 <free@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ludcmp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %rcx,%rbx
mov    %rdx,0x40(%rsp)
mov    %rdi,%r12
mov    %rsi,(%rsp)
movslq %esi,%rbp
lea    0x0(,%rbp,8),%rdi
lea    0xec1(%rip),%rsi
lea    0xec5(%rip),%rdx
xor    %eax,%eax
call   1050 <mem_alloc@plt>
movslq %eax,%rdi
movabs $0x3ff0000000000000,%rax
mov    %rbx,0x38(%rsp)
mov    %rax,(%rbx)
mov    %rbp,0x30(%rsp)
test   %ebp,%ebp
jle    16d4 <ludcmp+0x594>
mov    (%rsp),%r15d
lea    -0x1(%r15),%r8
mov    %r15d,%edx
and    $0x3,%edx
mov    %r15d,%esi
and    $0xfffffffc,%esi
xor    %ebp,%ebp
movsd  0xe43(%rip),%xmm2
movsd  0xe42(%rip),%xmm8
movapd 0xe42(%rip),%xmm1
movapd 0xe3a(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
mov    (%r12,%rbp,8),%rcx
xor    %eax,%eax
cmp    $0x3,%r8
jae    1200 <ludcmp+0xc0>
movapd %xmm2,%xmm4
jmp    1254 <ludcmp+0x114>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movapd %xmm2,%xmm5
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rcx,%rax,8),%xmm6
movsd  0x8(%rcx,%rax,8),%xmm7
movsd  0x10(%rcx,%rax,8),%xmm0
movsd  0x18(%rcx,%rax,8),%xmm4
andpd  %xmm3,%xmm6
maxsd  %xmm5,%xmm6
andpd  %xmm3,%xmm7
maxsd  %xmm6,%xmm7
andpd  %xmm3,%xmm0
maxsd  %xmm7,%xmm0
andpd  %xmm3,%xmm4
maxsd  %xmm0,%xmm4
add    $0x4,%rax
movapd %xmm4,%xmm5
cmp    %rax,%rsi
jne    1210 <ludcmp+0xd0>
movapd %xmm4,%xmm5
test   %rdx,%rdx
je     128a <ludcmp+0x14a>
lea    (%rcx,%rax,8),%rax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rax,%rcx,8),%xmm5
andpd  %xmm1,%xmm5
maxsd  %xmm4,%xmm5
add    $0x1,%rcx
movapd %xmm5,%xmm4
cmp    %rcx,%rdx
jne    1270 <ludcmp+0x130>
ucomisd %xmm2,%xmm5
jne    1296 <ludcmp+0x156>
jnp    16e7 <ludcmp+0x5a7>
movapd %xmm8,%xmm0
divsd  %xmm5,%xmm0
movsd  %xmm0,(%rdi,%rbp,8)
add    $0x1,%rbp
cmp    %r15,%rbp
jne    11e0 <ludcmp+0xa0>
cmpl   $0x0,(%rsp)
jle    16d4 <ludcmp+0x594>
mov    (%rsp),%rax
lea    -0x1(%rax),%r13d
mov    %r15d,%eax
and    $0xfffffffc,%eax
mov    %rax,0x20(%rsp)
add    $0xfffffffffffffffc,%rax
mov    %rax,0x18(%rsp)
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %rcx,%rax
mov    %rcx,0x10(%rsp)
and    $0xfffffffffffffffe,%rcx
mov    %rcx,0x8(%rsp)
mov    %r15,%rax
neg    %rax
mov    %rax,0x28(%rsp)
xor    %r11d,%r11d
movsd  0xcf7(%rip),%xmm2
movapd 0xd0f(%rip),%xmm3
mov    %r15,%r14
mov    %r12,%r9
jmp    133b <ludcmp+0x1fb>
nopl   0x0(%rax)
add    $0x1,%r11
mov    %r11,%rax
add    $0x8,%r9
add    $0xffffffffffffffff,%r14
mov    %rax,%r11
cmp    %r15,%rax
je     16d4 <ludcmp+0x594>
test   %r11,%r11
je     13e0 <ludcmp+0x2a0>
xor    %edx,%edx
jmp    1363 <ludcmp+0x223>
nopl   0x0(%rax,%rax,1)
movsd  %xmm4,(%rsi,%r11,8)
add    $0x1,%rdx
cmp    %r11,%rdx
je     13e0 <ludcmp+0x2a0>
mov    (%r12,%rdx,8),%rsi
movsd  (%rsi,%r11,8),%xmm4
test   %rdx,%rdx
je     1350 <ludcmp+0x210>
cmp    $0x1,%rdx
jne    1380 <ludcmp+0x240>
xor    %eax,%eax
jmp    13c2 <ludcmp+0x282>
nopl   0x0(%rax)
mov    %rdx,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %eax,%eax
nopl   0x0(%rax)
movsd  (%rsi,%rax,8),%xmm0
movsd  0x8(%rsi,%rax,8),%xmm5
mov    (%r12,%rax,8),%rbp
mov    0x8(%r12,%rax,8),%rbx
mulsd  0x0(%rbp,%r11,8),%xmm0
mulsd  (%rbx,%r11,8),%xmm5
subsd  %xmm0,%xmm4
subsd  %xmm5,%xmm4
add    $0x2,%rax
cmp    %rax,%rcx
jne    1390 <ludcmp+0x250>
test   $0x1,%dl
je     1350 <ludcmp+0x210>
movsd  (%rsi,%rax,8),%xmm0
mov    (%r12,%rax,8),%rax
mulsd  (%rax,%r11,8),%xmm0
subsd  %xmm0,%xmm4
jmp    1350 <ludcmp+0x210>
nop
mov    %r11,%rdx
and    $0xfffffffffffffffe,%rdx
mov    %r11,%rsi
movapd %xmm2,%xmm4
jmp    1431 <ludcmp+0x2f1>
movsd  %xmm5,(%rcx,%r11,8)
andpd  %xmm1,%xmm5
mulsd  (%rdi,%rsi,8),%xmm5
ucomisd %xmm4,%xmm5
movapd %xmm4,%xmm0
cmpnlesd %xmm5,%xmm0
movapd %xmm0,%xmm6
andnpd %xmm5,%xmm6
andpd  %xmm4,%xmm0
orpd   %xmm6,%xmm0
cmovae %esi,%r8d
add    $0x1,%rsi
movapd %xmm0,%xmm4
cmp    %r15,%rsi
je     14b0 <ludcmp+0x370>
mov    (%r12,%rsi,8),%rcx
movsd  (%rcx,%r11,8),%xmm5
test   %r11,%r11
je     13f0 <ludcmp+0x2b0>
xor    %eax,%eax
cmp    $0x1,%r11
je     1482 <ludcmp+0x342>
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%rax,8),%xmm0
movsd  0x8(%rcx,%rax,8),%xmm6
mov    (%r12,%rax,8),%rbp
mov    0x8(%r12,%rax,8),%rbx
mulsd  0x0(%rbp,%r11,8),%xmm0
mulsd  (%rbx,%r11,8),%xmm6
subsd  %xmm0,%xmm5
subsd  %xmm6,%xmm5
add    $0x2,%rax
cmp    %rax,%rdx
jne    1450 <ludcmp+0x310>
test   $0x1,%r11b
je     13f0 <ludcmp+0x2b0>
movsd  (%rcx,%rax,8),%xmm0
mov    (%r12,%rax,8),%rax
mulsd  (%rax,%r11,8),%xmm0
subsd  %xmm0,%xmm5
jmp    13f0 <ludcmp+0x2b0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r8d,%eax
cmp    %rax,%r11
je     163d <ludcmp+0x4fd>
movslq %r8d,%r10
mov    (%r12,%r10,8),%rdx
mov    (%r12,%r11,8),%rsi
cmpl   $0x4,(%rsp)
jb     14e3 <ludcmp+0x3a3>
lea    (%rsi,%r15,8),%rax
cmp    %rax,%rdx
jae    155a <ludcmp+0x41a>
lea    (%rdx,%r15,8),%rax
cmp    %rax,%rsi
jae    155a <ludcmp+0x41a>
xor    %ecx,%ecx
mov    %rcx,%rax
test   $0x1,%r15b
je     1509 <ludcmp+0x3c9>
movsd  (%rdx,%rcx,8),%xmm0
movsd  (%rsi,%rcx,8),%xmm4
movsd  %xmm4,(%rdx,%rcx,8)
movsd  %xmm0,(%rsi,%rcx,8)
mov    %rcx,%rax
or     $0x1,%rax
not    %rcx
cmp    0x28(%rsp),%rcx
je     1620 <ludcmp+0x4e0>
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rax,8),%xmm0
movsd  (%rsi,%rax,8),%xmm4
movsd  %xmm4,(%rdx,%rax,8)
movsd  %xmm0,(%rsi,%rax,8)
movsd  0x8(%rdx,%rax,8),%xmm0
movsd  0x8(%rsi,%rax,8),%xmm4
movsd  %xmm4,0x8(%rdx,%rax,8)
movsd  %xmm0,0x8(%rsi,%rax,8)
add    $0x2,%rax
cmp    %rax,%r15
jne    1520 <ludcmp+0x3e0>
jmp    1620 <ludcmp+0x4e0>
cmpq   $0x0,0x18(%rsp)
je     16c2 <ludcmp+0x582>
mov    0x8(%rsp),%rcx
xor    %eax,%eax
nopl   (%rax)
movups (%rdx,%rax,8),%xmm0
movups 0x10(%rdx,%rax,8),%xmm4
movups (%rsi,%rax,8),%xmm5
movups 0x10(%rsi,%rax,8),%xmm6
movups %xmm5,(%rdx,%rax,8)
movups %xmm6,0x10(%rdx,%rax,8)
movups %xmm0,(%rsi,%rax,8)
movups %xmm4,0x10(%rsi,%rax,8)
movupd 0x20(%rdx,%rax,8),%xmm0
movupd 0x30(%rdx,%rax,8),%xmm4
movupd 0x20(%rsi,%rax,8),%xmm5
movupd 0x30(%rsi,%rax,8),%xmm6
movupd %xmm5,0x20(%rdx,%rax,8)
movupd %xmm6,0x30(%rdx,%rax,8)
movupd %xmm0,0x20(%rsi,%rax,8)
movupd %xmm4,0x30(%rsi,%rax,8)
add    $0x8,%rax
add    $0xfffffffffffffffe,%rcx
jne    1570 <ludcmp+0x430>
testb  $0x1,0x10(%rsp)
je     1601 <ludcmp+0x4c1>
movupd (%rdx,%rax,8),%xmm0
movupd 0x10(%rdx,%rax,8),%xmm4
movupd (%rsi,%rax,8),%xmm5
movupd 0x10(%rsi,%rax,8),%xmm6
movupd %xmm5,(%rdx,%rax,8)
movupd %xmm6,0x10(%rdx,%rax,8)
movupd %xmm0,(%rsi,%rax,8)
movupd %xmm4,0x10(%rsi,%rax,8)
mov    0x20(%rsp),%rax
mov    %rax,%rcx
cmp    %r15,%rax
jne    14e5 <ludcmp+0x3a5>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x38(%rsp),%rax
movsd  (%rax),%xmm0
xorpd  %xmm3,%xmm0
movlpd %xmm0,(%rax)
movsd  (%rdi,%r11,8),%xmm0
movsd  %xmm0,(%rdi,%r10,8)
mov    0x40(%rsp),%rax
mov    %r8d,(%rax,%r11,4)
mov    (%r12,%r11,8),%rax
movsd  (%rax,%r11,8),%xmm4
movapd %xmm4,%xmm0
andpd  %xmm1,%xmm0
ucomisd %xmm0,%xmm2
jbe    1670 <ludcmp+0x530>
movabs $0x3ddb7cdfd9d7bdbb,%rcx
7c db 3d
mov    %rcx,(%rax,%r11,8)
movapd %xmm2,%xmm4
cmp    %r13,%r11
jge    1320 <ludcmp+0x1e0>
lea    0x1(%r11),%rax
cmp    0x30(%rsp),%rax
jge    1327 <ludcmp+0x1e7>
movapd %xmm8,%xmm5
divsd  %xmm4,%xmm5
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
mov    (%r9,%rcx,8),%rdx
movsd  (%rdx,%r11,8),%xmm0
mulsd  %xmm5,%xmm0
movsd  %xmm0,(%rdx,%r11,8)
add    $0x1,%rcx
cmp    %rcx,%r14
jne    16a0 <ludcmp+0x560>
jmp    1327 <ludcmp+0x1e7>
xor    %eax,%eax
testb  $0x1,0x10(%rsp)
jne    15d5 <ludcmp+0x495>
jmp    1601 <ludcmp+0x4c1>
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>
lea    0x952(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%edi
call   1060 <exit@plt>

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

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