#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 */
double *dvector(int);
int /*<<< orphan*/ error(char *);
double fabs(double);
int /*<<< orphan*/ free(double *);
void ludcmp2(double *a, int n, int *indx, double *d) {
  int i, imax, j, k;
  double big, dum, sum, temp;
  double *vv;
  imax = 0;
  vv = dvector(n);
  *d = 1.0;
  for (i = 0; i < n; i++) {
    big = 0.0;
    for (j = 0; j < n; j++)
      if ((temp = fabs(a[i * n + j])) > big)
        big = temp;
    if (big == 0.0)
      error("Singular matrix in routine ludcmp");
    vv[i] = 1.0 / big;
  }
  for (j = 0; j < n; j++) {
    for (i = 0; i < j; i++) {
      sum = a[i * n + j];
      for (k = 0; k < i; k++)
        sum -= a[i * n + k] * a[k * n + j];
      a[i * n + j] = sum;
    }
    big = 0.0;
    for (i = j; i < n; i++) {
      sum = a[i * n + j];
      for (k = 0; k < j; k++)
        sum -= a[i * n + k] * a[k * n + j];
      a[i * n + 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 * n + k];
        a[imax * n + k] = a[j * n + k];
        a[j * n + k] = dum;
      }
      *d = -(*d);
      vv[imax] = vv[j];
    }
    indx[j] = imax;
    if (a[j * n + j] == 0.0)
      a[j * n + j] = 1.0e-20;
    if (j != n - 1) {
      dum = 1.0 / (a[j * n + j]);
      for (i = j + 1; i < n; i++)
        a[i * n + j] *= dum;
    }
  }
  free(vv);
}


x86 assembly (clang, -O0):
<ludcmp2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0xc(%rbp),%edi
call   1040 <dvector@plt>
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0xe9a(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1232 <ludcmp2+0x102>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11e6 <ludcmp2+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xe5b(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
ucomisd -0x38(%rbp),%xmm0
jbe    11d3 <ludcmp2+0xa3>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    11d8 <ludcmp2+0xa8>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118c <ludcmp2+0x5c>
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    120a <ludcmp2+0xda>
jp     120a <ludcmp2+0xda>
lea    0xe1b(%rip),%rdi
call   1050 <error@plt>
movsd  0xdee(%rip),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x58(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1171 <ludcmp2+0x41>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    15e0 <ludcmp2+0x4b0>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1312 <ludcmp2+0x1e2>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12e9 <ludcmp2+0x1b9>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    127a <ludcmp2+0x14a>
movsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    124c <ludcmp2+0x11c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    142c <ludcmp2+0x2fc>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13bd <ludcmp2+0x28d>
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    134e <ludcmp2+0x21e>
movsd  -0x48(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x58(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x48(%rbp),%xmm1
movaps 0xc1f(%rip),%xmm2
pand   %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
ucomisd -0x38(%rbp),%xmm0
jb     1419 <ludcmp2+0x2e9>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    141e <ludcmp2+0x2ee>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1320 <ludcmp2+0x1f0>
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     14fc <ludcmp2+0x3cc>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14bb <ludcmp2+0x38b>
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    143f <ludcmp2+0x30f>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x58(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1551 <ludcmp2+0x421>
jp     1551 <ludcmp2+0x421>
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xabc(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
je     15cd <ludcmp2+0x49d>
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xa85(%rip),%xmm0
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    15c8 <ludcmp2+0x498>
movsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    158e <ludcmp2+0x45e>
jmp    15cd <ludcmp2+0x49d>
jmp    15d2 <ludcmp2+0x4a2>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1239 <ludcmp2+0x109>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ludcmp2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    %rcx,%rbx
mov    %rdx,0x78(%rsp)
mov    %esi,%ebp
mov    %rdi,%r13
mov    %esi,%edi
call   1040 <dvector@plt>
mov    %rax,0x8(%rsp)
movabs $0x3ff0000000000000,%rax
mov    %rbx,0x68(%rsp)
mov    %rax,(%rbx)
mov    %rbp,(%rsp)
test   %ebp,%ebp
jle    17ff <ludcmp2+0x6cf>
mov    (%rsp),%r14d
mov    %r14d,%r12d
and    $0xfffffffe,%r12d
lea    0x8(%r13),%rbp
lea    0x0(,%r14,8),%rbx
xor    %r15d,%r15d
movapd 0xe66(%rip),%xmm7
movapd 0xe5e(%rip),%xmm2
jmp    11d7 <ludcmp2+0xa7>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  0xe68(%rip),%xmm0
divsd  %xmm3,%xmm0
mov    0x8(%rsp),%rax
movsd  %xmm0,(%rax,%r15,8)
add    $0x1,%r15
add    %rbx,%rbp
cmp    %r14,%r15
je     128d <ludcmp2+0x15d>
cmpl   $0x1,(%rsp)
jne    11f0 <ludcmp2+0xc0>
xor    %eax,%eax
xorpd  %xmm3,%xmm3
jmp    1229 <ludcmp2+0xf9>
cs nopw 0x0(%rax,%rax,1)
nop
xorpd  %xmm0,%xmm0
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movsd  -0x8(%rbp,%rax,8),%xmm1
movsd  0x0(%rbp,%rax,8),%xmm3
andpd  %xmm2,%xmm1
maxsd  %xmm0,%xmm1
andpd  %xmm2,%xmm3
maxsd  %xmm1,%xmm3
add    $0x2,%rax
movapd %xmm3,%xmm0
cmp    %rax,%r12
jne    1200 <ludcmp2+0xd0>
test   $0x1,%r14b
je     124c <ludcmp2+0x11c>
mov    %r15,%rcx
imul   %r14,%rcx
add    %rcx,%rax
movsd  0x0(%r13,%rax,8),%xmm0
andpd  %xmm7,%xmm0
maxsd  %xmm3,%xmm0
movapd %xmm0,%xmm3
ucomisd 0xddc(%rip),%xmm3
jne    11b0 <ludcmp2+0x80>
jp     11b0 <ludcmp2+0x80>
lea    0xdd1(%rip),%rdi
movapd %xmm3,0x20(%rsp)
call   1050 <error@plt>
movapd 0x20(%rsp),%xmm3
movapd 0xd80(%rip),%xmm2
movapd 0xd78(%rip),%xmm7
jmp    11b0 <ludcmp2+0x80>
cmpl   $0x0,(%rsp)
jle    17ff <ludcmp2+0x6cf>
mov    (%rsp),%rax
add    $0xffffffff,%eax
mov    %rax,0x70(%rsp)
lea    0x0(,%r14,8),%rax
add    %r13,%rax
mov    %rax,0x58(%rsp)
mov    %r14d,%eax
and    $0xfffffffc,%eax
add    $0xfffffffffffffffc,%rax
mov    %rax,0x50(%rsp)
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %r14d,%eax
and    $0xfffffffc,%eax
mov    %rax,0x40(%rsp)
mov    %rcx,%rax
mov    %rcx,0x48(%rsp)
and    $0xfffffffffffffffe,%rcx
mov    %rcx,0x38(%rsp)
mov    %r14,%rax
neg    %rax
mov    %rax,0x60(%rsp)
lea    0x8(%r13),%rax
mov    %rax,0x10(%rsp)
lea    0x0(,%r14,8),%r9
lea    0x0(%r13,%r14,8),%rsi
lea    (%r14,%r14,1),%r8
lea    0x30(%r13),%rax
mov    %rax,0x30(%rsp)
xor    %r12d,%r12d
mov    $0x1,%edi
xorpd  %xmm0,%xmm0
movsd  0xcfd(%rip),%xmm1
movapd 0xcdd(%rip),%xmm2
mov    %r14,%rbp
xor    %r10d,%r10d
jmp    135a <ludcmp2+0x22a>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r12
mov    %r12,%rax
add    $0x1,%rdi
add    %r14,%rbp
mov    %rax,%r12
cmp    %r14,%rax
je     17ff <ludcmp2+0x6cf>
mov    %rbp,0x80(%rsp)
mov    %rdi,0x20(%rsp)
test   %r12,%r12
je     1430 <ludcmp2+0x300>
mov    0x10(%rsp),%rax
xor    %ebp,%ebp
jmp    1397 <ludcmp2+0x267>
nopl   0x0(%rax)
movsd  %xmm3,0x0(%r13,%r11,8)
add    $0x1,%rbp
add    %r9,%rax
cmp    %r12,%rbp
je     1430 <ludcmp2+0x300>
mov    %rbp,%rdi
imul   %r14,%rdi
lea    (%rdi,%r12,1),%r11
movsd  0x0(%r13,%r11,8),%xmm3
test   %rbp,%rbp
je     1380 <ludcmp2+0x250>
cmp    $0x1,%rbp
jne    13c0 <ludcmp2+0x290>
xor    %edx,%edx
jmp    13fb <ludcmp2+0x2cb>
nopl   0x0(%rax,%rax,1)
mov    %rbp,%rcx
and    $0xfffffffffffffffe,%rcx
mov    %r12,%rbx
xor    %edx,%edx
nopl   0x0(%rax)
movsd  -0x8(%rax,%rdx,8),%xmm4
mulsd  0x0(%r13,%rbx,8),%xmm4
movsd  (%rax,%rdx,8),%xmm5
subsd  %xmm4,%xmm3
mulsd  (%rsi,%rbx,8),%xmm5
subsd  %xmm5,%xmm3
add    $0x2,%rdx
add    %r8,%rbx
cmp    %rdx,%rcx
jne    13d0 <ludcmp2+0x2a0>
test   $0x1,%bpl
je     1380 <ludcmp2+0x250>
add    %rdx,%rdi
movsd  0x0(%r13,%rdi,8),%xmm4
imul   %r14,%rdx
add    %r12,%rdx
mulsd  0x0(%r13,%rdx,8),%xmm4
subsd  %xmm4,%xmm3
jmp    1380 <ludcmp2+0x250>
cs nopw 0x0(%rax,%rax,1)
mov    %r12,%rdi
and    $0xfffffffffffffffe,%rdi
mov    %r14,%rcx
imul   %r12,%rcx
mov    0x10(%rsp),%rax
mov    %rcx,0x18(%rsp)
lea    (%rax,%rcx,8),%rcx
xorpd  %xmm3,%xmm3
mov    %rcx,%rbp
mov    %r12,%rax
jmp    14aa <ludcmp2+0x37a>
nopl   0x0(%rax,%rax,1)
movsd  %xmm4,0x0(%r13,%r11,8)
andpd  %xmm7,%xmm4
mov    0x8(%rsp),%rdx
mulsd  (%rdx,%rax,8),%xmm4
ucomisd %xmm3,%xmm4
movapd %xmm3,%xmm5
cmpnlesd %xmm4,%xmm5
movapd %xmm5,%xmm6
andnpd %xmm4,%xmm6
andpd  %xmm3,%xmm5
cmovae %eax,%r10d
orpd   %xmm6,%xmm5
add    $0x1,%rax
add    %r9,%rbp
movapd %xmm5,%xmm3
cmp    %r14,%rax
je     1540 <ludcmp2+0x410>
mov    %rax,%r15
imul   %r14,%r15
lea    (%r15,%r12,1),%r11
movsd  0x0(%r13,%r11,8),%xmm4
test   %r12,%r12
je     1460 <ludcmp2+0x330>
cmp    $0x1,%r12
jne    14d0 <ludcmp2+0x3a0>
xor    %edx,%edx
jmp    150c <ludcmp2+0x3dc>
nopl   0x0(%rax,%rax,1)
mov    %r12,%rbx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nop
movsd  -0x8(%rbp,%rdx,8),%xmm5
mulsd  0x0(%r13,%rbx,8),%xmm5
movsd  0x0(%rbp,%rdx,8),%xmm6
subsd  %xmm5,%xmm4
mulsd  (%rsi,%rbx,8),%xmm6
subsd  %xmm6,%xmm4
add    $0x2,%rdx
add    %r8,%rbx
cmp    %rdx,%rdi
jne    14e0 <ludcmp2+0x3b0>
test   $0x1,%r12b
je     1460 <ludcmp2+0x330>
add    %rdx,%r15
movsd  0x0(%r13,%r15,8),%xmm5
imul   %r14,%rdx
add    %r12,%rdx
mulsd  0x0(%r13,%rdx,8),%xmm5
subsd  %xmm5,%xmm4
jmp    1460 <ludcmp2+0x330>
nopw   0x0(%rax,%rax,1)
mov    %r10d,%eax
cmp    %rax,%r12
je     1749 <ludcmp2+0x619>
mov    %r10d,%eax
mov    (%rsp),%rdx
imul   %edx,%eax
movslq %eax,%r11
cmp    $0x4,%edx
jae    1570 <ludcmp2+0x440>
xor    %edx,%edx
mov    0x18(%rsp),%rdi
jmp    16a0 <ludcmp2+0x570>
nopw   0x0(%rax,%rax,1)
lea    0x0(,%r11,8),%rax
add    %r13,%rax
lea    0x8(,%r12,8),%rdx
imul   %r14,%rdx
add    %r13,%rdx
cmp    %rax,%rdx
mov    0x18(%rsp),%rdi
jbe    15b4 <ludcmp2+0x484>
mov    0x58(%rsp),%rax
lea    (%rax,%r11,8),%rax
lea    0x0(,%rdi,8),%rdx
add    %r13,%rdx
cmp    %rax,%rdx
jae    15b4 <ludcmp2+0x484>
xor    %edx,%edx
jmp    16a0 <ludcmp2+0x570>
cmpq   $0x0,0x50(%rsp)
je     17ed <ludcmp2+0x6bd>
mov    0x30(%rsp),%rax
lea    (%rax,%r11,8),%rdx
lea    (%rax,%rdi,8),%rbp
mov    0x38(%rsp),%rbx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups -0x30(%rdx,%rax,8),%xmm3
movups -0x20(%rdx,%rax,8),%xmm4
movups -0x30(%rbp,%rax,8),%xmm5
movups -0x20(%rbp,%rax,8),%xmm6
movups %xmm5,-0x30(%rdx,%rax,8)
movups %xmm6,-0x20(%rdx,%rax,8)
movups %xmm3,-0x30(%rbp,%rax,8)
movups %xmm4,-0x20(%rbp,%rax,8)
movupd -0x10(%rdx,%rax,8),%xmm3
movupd (%rdx,%rax,8),%xmm4
movupd -0x10(%rbp,%rax,8),%xmm5
movupd 0x0(%rbp,%rax,8),%xmm6
movupd %xmm5,-0x10(%rdx,%rax,8)
movupd %xmm6,(%rdx,%rax,8)
movupd %xmm3,-0x10(%rbp,%rax,8)
movupd %xmm4,0x0(%rbp,%rax,8)
add    $0x8,%rax
add    $0xfffffffffffffffe,%rbx
jne    15e0 <ludcmp2+0x4b0>
testb  $0x1,0x48(%rsp)
je     1686 <ludcmp2+0x556>
lea    (%rax,%r11,1),%rdx
movupd 0x0(%r13,%rdx,8),%xmm3
movupd 0x10(%r13,%rdx,8),%xmm4
add    %rdi,%rax
movupd 0x0(%r13,%rax,8),%xmm5
movupd 0x10(%r13,%rax,8),%xmm6
movupd %xmm5,0x0(%r13,%rdx,8)
movupd %xmm6,0x10(%r13,%rdx,8)
movupd %xmm3,0x0(%r13,%rax,8)
movupd %xmm4,0x10(%r13,%rax,8)
mov    0x40(%rsp),%rax
mov    %rax,%rdx
cmp    %r14,%rax
je     1725 <ludcmp2+0x5f5>
nopw   0x0(%rax,%rax,1)
mov    %rdx,%rax
test   $0x1,%r14b
je     16d3 <ludcmp2+0x5a3>
lea    (%rdx,%r11,1),%rax
movsd  0x0(%r13,%rax,8),%xmm3
add    %rdx,%rdi
movsd  0x0(%r13,%rdi,8),%xmm4
movsd  %xmm4,0x0(%r13,%rax,8)
movsd  %xmm3,0x0(%r13,%rdi,8)
mov    %rdx,%rax
or     $0x1,%rax
not    %rdx
cmp    0x60(%rsp),%rdx
je     1725 <ludcmp2+0x5f5>
mov    0x10(%rsp),%rdx
lea    (%rdx,%r11,8),%rdx
cs nopw 0x0(%rax,%rax,1)
movsd  -0x8(%rdx,%rax,8),%xmm3
movsd  -0x8(%rcx,%rax,8),%xmm4
movsd  %xmm4,-0x8(%rdx,%rax,8)
movsd  %xmm3,-0x8(%rcx,%rax,8)
movsd  (%rdx,%rax,8),%xmm3
movsd  (%rcx,%rax,8),%xmm4
movsd  %xmm4,(%rdx,%rax,8)
movsd  %xmm3,(%rcx,%rax,8)
add    $0x2,%rax
cmp    %rax,%r14
jne    16f0 <ludcmp2+0x5c0>
mov    0x68(%rsp),%rax
movsd  (%rax),%xmm3
xorpd  %xmm2,%xmm3
movlpd %xmm3,(%rax)
mov    0x8(%rsp),%rcx
movsd  (%rcx,%r12,8),%xmm3
movslq %r10d,%rax
movsd  %xmm3,(%rcx,%rax,8)
mov    0x78(%rsp),%rax
mov    %r10d,(%rax,%r12,4)
mov    %r12d,%eax
imul   (%rsp),%eax
cltq
add    %r12,%rax
movsd  0x0(%r13,%rax,8),%xmm4
ucomisd %xmm0,%xmm4
mov    0x20(%rsp),%rdi
mov    0x80(%rsp),%rbp
jne    178d <ludcmp2+0x65d>
jp     178d <ludcmp2+0x65d>
movabs $0x3bc79ca10c924223,%rcx
9c c7 3b
mov    %rcx,0x0(%r13,%rax,8)
movapd %xmm1,%xmm4
cmp    0x70(%rsp),%r12
je     1340 <ludcmp2+0x210>
lea    0x1(%r12),%rax
cmp    %r14,%rax
jge    1347 <ludcmp2+0x217>
movsd  0x872(%rip),%xmm3
divsd  %xmm4,%xmm3
add    %rbp,%r12
lea    0x0(,%r12,8),%rcx
add    %r13,%rcx
mov    %r14,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rcx),%xmm4
mulsd  %xmm3,%xmm4
movsd  %xmm4,(%rcx)
add    %r9,%rcx
add    $0xffffffffffffffff,%rdx
cmp    %rdx,%rdi
jne    17d0 <ludcmp2+0x6a0>
jmp    1347 <ludcmp2+0x217>
xor    %eax,%eax
testb  $0x1,0x48(%rsp)
jne    1647 <ludcmp2+0x517>
jmp    1686 <ludcmp2+0x556>
mov    0x8(%rsp),%rdi
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

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

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