#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 fabs(double);
int /*<<< orphan*/ free(double *);
int /*<<< orphan*/ int_error(int, char *);
double *vec(int);
void lu_decomp(double **a, int n, int *indx, double *d) {
  int i, imax = -1, j, k;
  double large, dummy, temp, **ar, **lim, *limc, *ac, *dp, *vscal;
  dp = vscal = vec(n);
  *d = 1.0;
  for (ar = a, lim = &(a[n]); ar < lim; ar++) {
    large = 0.0;
    for (ac = *ar, limc = &(ac[n]); ac < limc;)
      if ((temp = fabs(*ac++)) > large)
        large = temp;
    if (large == 0.0)
      int_error((-1), "Singular matrix in LU-DECOMP");
    *dp++ = 1 / large;
  }
  ar = a;
  for (j = 0; j < n; j++, ar++) {
    for (i = 0; i < j; i++) {
      ac = &(a[i][j]);
      for (k = 0; k < i; k++)
        *ac -= a[i][k] * a[k][j];
    }
    large = 0.0;
    dp = &(vscal[j]);
    for (i = j; i < n; i++) {
      ac = &(a[i][j]);
      for (k = 0; k < j; k++)
        *ac -= a[i][k] * a[k][j];
      if ((dummy = *dp++ * fabs(*ac)) >= large) {
        large = dummy;
        imax = i;
      }
    }
    if (j != imax) {
      ac = a[imax];
      dp = *ar;
      for (k = 0; k < n; k++, ac++, dp++) {
        double temp = (*ac);
        (*ac) = (*dp);
        (*dp) = temp;
      };
      *d = -(*d);
      vscal[imax] = vscal[j];
    }
    indx[j] = imax;
    if (*(dp = &(*ar)[j]) == 0)
      *dp = 1e-30;
    if (j != n - 1) {
      dummy = 1 / (*ar)[j];
      for (i = j + 1; i < n; i++)
        a[i][j] *= dummy;
    }
  }
  free(vscal);
}


x86 assembly (clang, -O0):
<lu_decomp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0xffffffff,-0x28(%rbp)
mov    -0xc(%rbp),%edi
call   1050 <vec@plt>
mov    %rax,-0x78(%rbp)
mov    %rax,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0xe93(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
cmp    -0x58(%rbp),%rax
jae    1265 <lu_decomp+0x135>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x50(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%rax
cmp    -0x60(%rbp),%rax
jae    120b <lu_decomp+0xdb>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x68(%rbp)
movsd  (%rax),%xmm0
movaps 0xe28(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
ucomisd -0x38(%rbp),%xmm0
jbe    1206 <lu_decomp+0xd6>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    11c0 <lu_decomp+0x90>
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1234 <lu_decomp+0x104>
jp     1234 <lu_decomp+0x104>
mov    $0xffffffff,%edi
lea    0xdf1(%rip),%rsi
call   1040 <int_error@plt>
movsd  0xdc4(%rip),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    -0x70(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax)
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
jmp    118c <lu_decomp+0x5c>
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1603 <lu_decomp+0x4d3>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1337 <lu_decomp+0x207>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1324 <lu_decomp+0x1f4>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm0,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12b5 <lu_decomp+0x185>
jmp    1329 <lu_decomp+0x1f9>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1287 <lu_decomp+0x157>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x78(%rbp),%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1452 <lu_decomp+0x322>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13f5 <lu_decomp+0x2c5>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm0,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1386 <lu_decomp+0x256>
mov    -0x70(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x70(%rbp)
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm1
movaps 0xbf9(%rip),%xmm2
pand   %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
ucomisd -0x38(%rbp),%xmm0
jb     143f <lu_decomp+0x30f>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1444 <lu_decomp+0x314>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1358 <lu_decomp+0x228>
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     151d <lu_decomp+0x3ed>
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x68(%rbp)
mov    -0x50(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x70(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14dc <lu_decomp+0x3ac>
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x70(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x68(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x68(%rbp)
mov    -0x70(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x70(%rbp)
jmp    1480 <lu_decomp+0x350>
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    -0x78(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x78(%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    -0x50(%rbp),%rax
mov    (%rax),%rax
movslq -0x2c(%rbp),%rcx
mov    %rcx,%rsi
shl    $0x3,%rsi
mov    %rax,%rdx
add    %rsi,%rdx
mov    %rdx,-0x70(%rbp)
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    156f <lu_decomp+0x43f>
jp     156f <lu_decomp+0x43f>
mov    -0x70(%rbp),%rax
movsd  0xa9d(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x2c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
je     15e4 <lu_decomp+0x4b4>
mov    -0x50(%rbp),%rax
mov    (%rax),%rax
movslq -0x2c(%rbp),%rcx
movsd  0xa6d(%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    15df <lu_decomp+0x4af>
movsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    15a6 <lu_decomp+0x476>
jmp    15e4 <lu_decomp+0x4b4>
jmp    15e9 <lu_decomp+0x4b9>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
jmp    1274 <lu_decomp+0x144>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lu_decomp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %rcx,%r14
mov    %rdx,0x60(%rsp)
mov    %esi,%ebp
mov    %rdi,%rbx
mov    %esi,%edi
call   1050 <vec@plt>
mov    %rax,%r12
movabs $0x3ff0000000000000,%rax
mov    %rax,(%r14)
mov    %rbp,0x8(%rsp)
test   %ebp,%ebp
jle    172e <lu_decomp+0x5fe>
movslq 0x8(%rsp),%rax
mov    %r12,%r13
mov    %rax,0x28(%rsp)
lea    (%rbx,%rax,8),%r12
movapd 0xe78(%rip),%xmm7
lea    0xea9(%rip),%r15
mov    %r13,0x20(%rsp)
mov    %rbx,%rbp
jmp    11bf <lu_decomp+0x8f>
nopl   0x0(%rax)
movsd  0xe78(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,0x0(%r13)
add    $0x8,%r13
add    $0x8,%rbp
cmp    %r12,%rbp
jae    1218 <lu_decomp+0xe8>
mov    0x0(%rbp),%rax
mov    0x28(%rsp),%rcx
lea    (%rax,%rcx,8),%rcx
xorpd  %xmm1,%xmm1
movapd %xmm1,%xmm0
movsd  (%rax),%xmm1
add    $0x8,%rax
andpd  %xmm7,%xmm1
maxsd  %xmm0,%xmm1
cmp    %rcx,%rax
jb     11d0 <lu_decomp+0xa0>
ucomisd 0xe3f(%rip),%xmm1
jne    11a0 <lu_decomp+0x70>
jp     11a0 <lu_decomp+0x70>
mov    $0xffffffff,%edi
mov    %r15,%rsi
movapd %xmm1,0x30(%rsp)
call   1040 <int_error@plt>
movapd 0x30(%rsp),%xmm1
movapd 0xdea(%rip),%xmm7
jmp    11a0 <lu_decomp+0x70>
cmpl   $0x0,0x8(%rsp)
mov    0x20(%rsp),%r12
jle    172e <lu_decomp+0x5fe>
mov    0x8(%rsp),%rax
lea    -0x1(%rax),%ecx
mov    %eax,%r13d
mov    %rcx,0x30(%rsp)
lea    0x1(%rcx),%rax
mov    %rax,0x10(%rsp)
and    $0xfffffffffffffffc,%rax
mov    %rax,0x18(%rsp)
add    $0xfffffffffffffffc,%rax
mov    %rax,0x50(%rsp)
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %rcx,%rax
mov    %rcx,0x48(%rsp)
and    $0xfffffffffffffffe,%rcx
mov    %rcx,0x40(%rsp)
mov    $0xffffffff,%r10d
xor    %r9d,%r9d
xorpd  %xmm0,%xmm0
movsd  0xda4(%rip),%xmm1
movaps 0xd85(%rip),%xmm2
mov    %r13,%r15
mov    %rbx,%r8
jmp    12bb <lu_decomp+0x18b>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r9
mov    %r9,%rax
add    $0x8,%r8
add    $0xffffffffffffffff,%r15
mov    %rax,%r9
cmp    %r13,%rax
je     172e <lu_decomp+0x5fe>
test   %r9,%r9
je     1380 <lu_decomp+0x250>
xor    %eax,%eax
jmp    12dd <lu_decomp+0x1ad>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rax
cmp    %r9,%rax
je     1380 <lu_decomp+0x250>
test   %rax,%rax
je     12d0 <lu_decomp+0x1a0>
mov    (%rbx,%rax,8),%rdx
movsd  (%rdx,%r9,8),%xmm3
cmp    $0x1,%rax
jne    1300 <lu_decomp+0x1d0>
xor    %ecx,%ecx
jmp    134d <lu_decomp+0x21d>
cs nopw 0x0(%rax,%rax,1)
mov    %rax,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %ecx,%ecx
nopl   0x0(%rax)
movsd  (%rdx,%rcx,8),%xmm4
mov    (%rbx,%rcx,8),%rdi
mulsd  (%rdi,%r9,8),%xmm4
subsd  %xmm4,%xmm3
movsd  %xmm3,(%rdx,%r9,8)
movsd  0x8(%rdx,%rcx,8),%xmm4
mov    0x8(%rbx,%rcx,8),%rdi
mulsd  (%rdi,%r9,8),%xmm4
subsd  %xmm4,%xmm3
movsd  %xmm3,(%rdx,%r9,8)
add    $0x2,%rcx
cmp    %rcx,%rsi
jne    1310 <lu_decomp+0x1e0>
test   $0x1,%al
je     12d0 <lu_decomp+0x1a0>
movsd  (%rdx,%rcx,8),%xmm4
mov    (%rbx,%rcx,8),%rcx
mulsd  (%rcx,%r9,8),%xmm4
subsd  %xmm4,%xmm3
movsd  %xmm3,(%rdx,%r9,8)
jmp    12d0 <lu_decomp+0x1a0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    (%r12,%r9,8),%r11
mov    %r9,%rdx
and    $0xfffffffffffffffe,%rdx
xorpd  %xmm3,%xmm3
mov    %r9,%rsi
mov    %r11,%rax
jmp    13de <lu_decomp+0x2ae>
nopw   0x0(%rax,%rax,1)
andpd  %xmm7,%xmm4
mulsd  (%rax),%xmm4
add    $0x8,%rax
ucomisd %xmm3,%xmm4
movapd %xmm3,%xmm5
cmpnlesd %xmm4,%xmm5
movapd %xmm5,%xmm6
andnpd %xmm4,%xmm6
andpd  %xmm3,%xmm5
orpd   %xmm6,%xmm5
cmovae %esi,%r10d
add    $0x1,%rsi
movapd %xmm5,%xmm3
cmp    %r13,%rsi
je     1470 <lu_decomp+0x340>
mov    (%rbx,%rsi,8),%rdi
movsd  (%rdi,%r9,8),%xmm4
test   %r9,%r9
je     13a0 <lu_decomp+0x270>
xor    %ecx,%ecx
cmp    $0x1,%r9
je     143f <lu_decomp+0x30f>
cs nopw 0x0(%rax,%rax,1)
nop
movsd  (%rdi,%rcx,8),%xmm5
mov    (%rbx,%rcx,8),%rbp
mulsd  0x0(%rbp,%r9,8),%xmm5
subsd  %xmm5,%xmm4
movsd  %xmm4,(%rdi,%r9,8)
movsd  0x8(%rdi,%rcx,8),%xmm5
mov    0x8(%rbx,%rcx,8),%rbp
mulsd  0x0(%rbp,%r9,8),%xmm5
subsd  %xmm5,%xmm4
movsd  %xmm4,(%rdi,%r9,8)
add    $0x2,%rcx
cmp    %rcx,%rdx
jne    1400 <lu_decomp+0x2d0>
test   $0x1,%r9b
je     13a0 <lu_decomp+0x270>
movsd  (%rdi,%rcx,8),%xmm5
mov    (%rbx,%rcx,8),%rcx
mulsd  (%rcx,%r9,8),%xmm5
subsd  %xmm5,%xmm4
movsd  %xmm4,(%rdi,%r9,8)
jmp    13a0 <lu_decomp+0x270>
nopw   0x0(%rax,%rax,1)
mov    %r10d,%eax
cmp    %rax,%r9
jne    1480 <lu_decomp+0x350>
mov    (%r8),%r11
jmp    1680 <lu_decomp+0x550>
mov    %r11,0x58(%rsp)
xor    %r12d,%r12d
movslq %r10d,%rsi
mov    (%r8),%r11
mov    (%rbx,%rsi,8),%rdx
cmpl   $0x3,0x30(%rsp)
jb     14b8 <lu_decomp+0x388>
mov    0x10(%rsp),%rcx
lea    (%r11,%rcx,8),%rax
cmp    %rax,%rdx
jae    1589 <lu_decomp+0x459>
lea    (%rdx,%rcx,8),%rax
cmp    %rax,%r11
jae    1589 <lu_decomp+0x459>
mov    %r11,%rax
mov    0x8(%rsp),%rbp
mov    %ebp,%ecx
sub    %r12d,%ecx
mov    %r12d,%edi
not    %edi
add    %ebp,%edi
and    $0x3,%ecx
je     1507 <lu_decomp+0x3d7>
mov    %r14,%rbp
neg    %ecx
xor    %r14d,%r14d
nopl   0x0(%rax)
movsd  (%rdx),%xmm3
movsd  (%rax),%xmm4
movsd  %xmm4,(%rdx)
movsd  %xmm3,(%rax)
add    $0x8,%rdx
add    $0x8,%rax
add    $0xffffffff,%r14d
cmp    %r14d,%ecx
jne    14e0 <lu_decomp+0x3b0>
sub    %r14d,%r12d
mov    %rbp,%r14
cmp    $0x3,%edi
jb     1660 <lu_decomp+0x530>
mov    0x8(%rsp),%rcx
sub    %r12d,%ecx
xor    %edi,%edi
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rdi,8),%xmm3
movsd  (%rax,%rdi,8),%xmm4
movsd  %xmm4,(%rdx,%rdi,8)
movsd  %xmm3,(%rax,%rdi,8)
movsd  0x8(%rdx,%rdi,8),%xmm3
movsd  0x8(%rax,%rdi,8),%xmm4
movsd  %xmm4,0x8(%rdx,%rdi,8)
movsd  %xmm3,0x8(%rax,%rdi,8)
movsd  0x10(%rdx,%rdi,8),%xmm3
movsd  0x10(%rax,%rdi,8),%xmm4
movsd  %xmm4,0x10(%rdx,%rdi,8)
movsd  %xmm3,0x10(%rax,%rdi,8)
movsd  0x18(%rdx,%rdi,8),%xmm3
movsd  0x18(%rax,%rdi,8),%xmm4
movsd  %xmm4,0x18(%rdx,%rdi,8)
movsd  %xmm3,0x18(%rax,%rdi,8)
add    $0x4,%rdi
cmp    %edi,%ecx
jne    1520 <lu_decomp+0x3f0>
jmp    1660 <lu_decomp+0x530>
cmpq   $0x0,0x50(%rsp)
je     1717 <lu_decomp+0x5e7>
mov    0x40(%rsp),%rcx
xor    %eax,%eax
mov    0x10(%rsp),%rdi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups (%rdx,%rax,8),%xmm3
movups 0x10(%rdx,%rax,8),%xmm4
movups (%r11,%rax,8),%xmm5
movups 0x10(%r11,%rax,8),%xmm6
movups %xmm5,(%rdx,%rax,8)
movups %xmm6,0x10(%rdx,%rax,8)
movups %xmm3,(%r11,%rax,8)
movups %xmm4,0x10(%r11,%rax,8)
movupd 0x20(%rdx,%rax,8),%xmm3
movupd 0x30(%rdx,%rax,8),%xmm4
movupd 0x20(%r11,%rax,8),%xmm5
movupd 0x30(%r11,%rax,8),%xmm6
movupd %xmm5,0x20(%rdx,%rax,8)
movupd %xmm6,0x30(%rdx,%rax,8)
movupd %xmm3,0x20(%r11,%rax,8)
movupd %xmm4,0x30(%r11,%rax,8)
add    $0x8,%rax
add    $0xfffffffffffffffe,%rcx
jne    15b0 <lu_decomp+0x480>
testb  $0x1,0x48(%rsp)
je     164d <lu_decomp+0x51d>
movupd (%rdx,%rax,8),%xmm3
movupd 0x10(%rdx,%rax,8),%xmm4
movupd (%r11,%rax,8),%xmm5
movupd 0x10(%r11,%rax,8),%xmm6
movupd %xmm5,(%rdx,%rax,8)
movupd %xmm6,0x10(%rdx,%rax,8)
movupd %xmm3,(%r11,%rax,8)
movupd %xmm4,0x10(%r11,%rax,8)
cmp    0x18(%rsp),%rdi
jne    1702 <lu_decomp+0x5d2>
nopl   0x0(%rax,%rax,1)
movsd  (%r14),%xmm3
xorps  %xmm2,%xmm3
movlps %xmm3,(%r14)
mov    0x58(%rsp),%rax
movsd  (%rax),%xmm3
mov    0x20(%rsp),%r12
movsd  %xmm3,(%r12,%rsi,8)
mov    0x60(%rsp),%rax
mov    %r10d,(%rax,%r9,4)
movsd  (%r11,%r9,8),%xmm3
ucomisd %xmm0,%xmm3
jne    16a9 <lu_decomp+0x579>
jp     16a9 <lu_decomp+0x579>
movabs $0x39b4484bfeebc2a0,%rax
48 b4 39
mov    %rax,(%r11,%r9,8)
movapd %xmm1,%xmm3
cmp    0x30(%rsp),%r9
je     12a0 <lu_decomp+0x170>
lea    0x1(%r9),%rax
cmp    0x28(%rsp),%rax
jge    12a7 <lu_decomp+0x177>
movsd  0x955(%rip),%xmm4
divsd  %xmm3,%xmm4
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%r8,%rcx,8),%rdx
movsd  (%rdx,%r9,8),%xmm3
mulsd  %xmm4,%xmm3
movsd  %xmm3,(%rdx,%r9,8)
add    $0x1,%rcx
cmp    %rcx,%r15
jne    16e0 <lu_decomp+0x5b0>
jmp    12a7 <lu_decomp+0x177>
mov    0x18(%rsp),%rcx
lea    (%r11,%rcx,8),%rax
lea    (%rdx,%rcx,8),%rdx
mov    %ecx,%r12d
jmp    14bb <lu_decomp+0x38b>
xor    %eax,%eax
mov    0x10(%rsp),%rdi
testb  $0x1,0x48(%rsp)
jne    161d <lu_decomp+0x4ed>
jmp    164d <lu_decomp+0x51d>
mov    %r12,%rdi
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

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

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