int pca(int nrows, int ncolumns, double **u, double **v, double *w) {
  int i;
  int j;
  int error;
  int *index = malloc(ncolumns * sizeof(int));
  double *temp = malloc(ncolumns * sizeof(double));
  if (!index || !temp) {
    if (index)
      free(index);
    if (temp)
      free(temp);
    return -1;
  }
  error = svd(nrows, ncolumns, u, w, v);
  if (error == 0) {
    if (nrows >= ncolumns) {
      for (j = 0; j < ncolumns; j++) {
        const double s = w[j];
        for (i = 0; i < nrows; i++)
          u[i][j] *= s;
      }
      sort(ncolumns, w, index);
      for (i = 0; i < ncolumns / 2; i++) {
        j = index[i];
        index[i] = index[ncolumns - 1 - i];
        index[ncolumns - 1 - i] = j;
      }
      for (i = 0; i < nrows; i++) {
        for (j = 0; j < ncolumns; j++)
          temp[j] = u[i][index[j]];
        for (j = 0; j < ncolumns; j++)
          u[i][j] = temp[j];
      }
      for (i = 0; i < ncolumns; i++) {
        for (j = 0; j < ncolumns; j++)
          temp[j] = v[index[j]][i];
        for (j = 0; j < ncolumns; j++)
          v[j][i] = temp[j];
      }
      for (i = 0; i < ncolumns; i++)
        temp[i] = w[index[i]];
      for (i = 0; i < ncolumns; i++)
        w[i] = temp[i];
    } else {
      for (j = 0; j < nrows; j++) {
        const double s = w[j];
        for (i = 0; i < nrows; i++)
          v[i][j] *= s;
      }
      sort(nrows, w, index);
      for (i = 0; i < nrows / 2; i++) {
        j = index[i];
        index[i] = index[nrows - 1 - i];
        index[nrows - 1 - i] = j;
      }
      for (j = 0; j < ncolumns; j++) {
        for (i = 0; i < nrows; i++)
          temp[i] = u[index[i]][j];
        for (i = 0; i < nrows; i++)
          u[i][j] = temp[i];
      }
      for (j = 0; j < nrows; j++) {
        for (i = 0; i < nrows; i++)
          temp[i] = v[j][index[i]];
        for (i = 0; i < nrows; i++)
          v[j][i] = temp[i];
      }
      for (i = 0; i < nrows; i++)
        temp[i] = w[index[i]];
      for (i = 0; i < nrows; i++)
        w[i] = temp[i];
    }
  }
  free(index);
  free(temp);
  return error;
}


x86 assembly (clang, -O0):
<pca>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movslq -0xc(%rbp),%rdi
shl    $0x2,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x40(%rbp)
movslq -0xc(%rbp),%rdi
shl    $0x3,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x40(%rbp)
je     1192 <pca+0x52>
cmpq   $0x0,-0x48(%rbp)
jne    11c6 <pca+0x86>
cmpq   $0x0,-0x40(%rbp)
je     11a6 <pca+0x66>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0x48(%rbp)
je     11ba <pca+0x7a>
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    17e9 <pca+0x6a9>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x18(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    -0x20(%rbp),%r8
mov    $0x0,%al
call   1050 <svd@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jne    17d1 <pca+0x691>
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     14e2 <pca+0x3a2>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1270 <pca+0x130>
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    125d <pca+0x11d>
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1224 <pca+0xe4>
jmp    1262 <pca+0x122>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11ff <pca+0xbf>
mov    -0xc(%rbp),%edi
mov    -0x28(%rbp),%rsi
mov    -0x40(%rbp),%rdx
mov    $0x0,%al
call   1040 <sort@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x5c(%rbp),%eax
cmp    %ecx,%eax
jge    12f7 <pca+0x1b7>
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x30(%rbp)
mov    -0x40(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%edx
mov    -0x40(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1289 <pca+0x149>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    13ab <pca+0x26b>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1355 <pca+0x215>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x40(%rbp),%rcx
movslq -0x30(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1311 <pca+0x1d1>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1398 <pca+0x258>
mov    -0x48(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    135c <pca+0x21c>
jmp    139d <pca+0x25d>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12fe <pca+0x1be>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    145f <pca+0x31f>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1409 <pca+0x2c9>
mov    -0x20(%rbp),%rax
mov    -0x40(%rbp),%rcx
movslq -0x30(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    13c5 <pca+0x285>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    144c <pca+0x30c>
mov    -0x48(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1410 <pca+0x2d0>
jmp    1451 <pca+0x311>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13b2 <pca+0x272>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14a2 <pca+0x362>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1466 <pca+0x326>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14dd <pca+0x39d>
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    14a9 <pca+0x369>
jmp    17cc <pca+0x68c>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    155a <pca+0x41a>
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1547 <pca+0x407>
movsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    150e <pca+0x3ce>
jmp    154c <pca+0x40c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    14e9 <pca+0x3a9>
mov    -0x8(%rbp),%edi
mov    -0x28(%rbp),%rsi
mov    -0x40(%rbp),%rdx
mov    $0x0,%al
call   1040 <sort@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    -0x8(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x60(%rbp),%eax
cmp    %ecx,%eax
jge    15e1 <pca+0x4a1>
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x30(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x40(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%edx
mov    -0x40(%rbp),%rax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1573 <pca+0x433>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1695 <pca+0x555>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    163f <pca+0x4ff>
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    15fb <pca+0x4bb>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1682 <pca+0x542>
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1646 <pca+0x506>
jmp    1687 <pca+0x547>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    15e8 <pca+0x4a8>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1749 <pca+0x609>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    16f3 <pca+0x5b3>
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x40(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    16af <pca+0x56f>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1736 <pca+0x5f6>
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    16fa <pca+0x5ba>
jmp    173b <pca+0x5fb>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    169c <pca+0x55c>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    178c <pca+0x64c>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1750 <pca+0x610>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    17c7 <pca+0x687>
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1793 <pca+0x653>
jmp    17cc <pca+0x68c>
jmp    17d1 <pca+0x691>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pca>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %r8,%rbp
mov    %rcx,%r15
mov    %rdx,%r12
mov    %rdi,0x8(%rsp)
mov    %rsi,0x10(%rsp)
movslq %esi,%rbx
lea    0x0(,%rbx,4),%rdi
call   1070 <malloc@plt>
mov    %rax,%r14
shl    $0x3,%rbx
mov    %rbx,%rdi
call   1070 <malloc@plt>
mov    %rax,%rbx
test   %r14,%r14
je     11df <pca+0x8f>
test   %rbx,%rbx
je     11df <pca+0x8f>
mov    %rbp,%rcx
mov    0x8(%rsp),%r13
mov    %r13d,%edi
mov    0x10(%rsp),%rbp
mov    %ebp,%esi
mov    %r12,%rdx
mov    %rcx,0x18(%rsp)
mov    %r15,%r8
xor    %eax,%eax
call   1050 <svd@plt>
mov    %eax,0x34(%rsp)
test   %eax,%eax
je     120f <pca+0xbf>
mov    %r14,%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    0x34(%rsp),%ebp
jmp    11fe <pca+0xae>
test   %r14,%r14
je     11ec <pca+0x9c>
mov    %r14,%rdi
call   1030 <free@plt>
mov    $0xffffffff,%ebp
test   %rbx,%rbx
je     11fe <pca+0xae>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %ebp,%eax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rbp,%rdi
cmp    %edi,%r13d
mov    %r13,%r10
jge    12f2 <pca+0x1a2>
test   %r10d,%r10d
mov    0x18(%rsp),%rsi
jle    142a <pca+0x2da>
mov    %r10d,%r9d
lea    -0x1(%r9),%r8
mov    %r9d,%edx
and    $0x3,%edx
mov    %r9d,%r11d
and    $0xfffffffc,%r11d
xor    %edi,%edi
jmp    125d <pca+0x10d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdi
cmp    %r9,%rdi
je     13c1 <pca+0x271>
movsd  (%rsi,%rdi,8),%xmm0
xor    %ecx,%ecx
cmp    $0x3,%r8
jb     12c4 <pca+0x174>
nopw   0x0(%rax,%rax,1)
mov    (%r15,%rcx,8),%rax
movsd  (%rax,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rdi,8)
mov    0x8(%r15,%rcx,8),%rax
movsd  (%rax,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rdi,8)
mov    0x10(%r15,%rcx,8),%rax
movsd  (%rax,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rdi,8)
mov    0x18(%r15,%rcx,8),%rax
movsd  (%rax,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rdi,8)
add    $0x4,%rcx
cmp    %rcx,%r11
jne    1270 <pca+0x120>
test   %rdx,%rdx
je     1250 <pca+0x100>
lea    (%r15,%rcx,8),%rcx
xor    %eax,%eax
nop
mov    (%rcx,%rax,8),%rbp
movsd  0x0(%rbp,%rdi,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x0(%rbp,%rdi,8)
add    $0x1,%rax
cmp    %rax,%rdx
jne    12d0 <pca+0x180>
jmp    1250 <pca+0x100>
mov    %edi,%r13d
mov    %r10d,%r9d
test   %edi,%edi
mov    0x18(%rsp),%rsi
mov    %r9,0x20(%rsp)
jle    1441 <pca+0x2f1>
lea    -0x1(%r9),%r8
mov    %r9d,%r11d
and    $0x3,%r11d
and    $0xfffffffc,%r9d
xor    %ecx,%ecx
jmp    132d <pca+0x1dd>
nopl   (%rax)
add    $0x1,%rcx
cmp    %r13,%rcx
je     13f5 <pca+0x2a5>
test   %r10d,%r10d
jle    1320 <pca+0x1d0>
movsd  (%rsi,%rcx,8),%xmm0
xor    %edx,%edx
cmp    $0x3,%r8
jb     1394 <pca+0x244>
nop
mov    (%r12,%rdx,8),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rcx,8)
mov    0x8(%r12,%rdx,8),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rcx,8)
mov    0x10(%r12,%rdx,8),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rcx,8)
mov    0x18(%r12,%rdx,8),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rcx,8)
add    $0x4,%rdx
cmp    %rdx,%r9
jne    1340 <pca+0x1f0>
test   %r11,%r11
je     1320 <pca+0x1d0>
lea    (%r12,%rdx,8),%rbp
xor    %eax,%eax
nop
mov    0x0(%rbp,%rax,8),%rdx
movsd  (%rdx,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%rcx,8)
add    $0x1,%rax
cmp    %rax,%r11
jne    13a0 <pca+0x250>
jmp    1320 <pca+0x1d0>
mov    %r10d,%edi
mov    %r14,%rdx
xor    %eax,%eax
call   1040 <sort@plt>
mov    0x8(%rsp),%r10
cmp    $0x2,%r10d
mov    0x10(%rsp),%r9
jl     14c7 <pca+0x377>
mov    %r10d,%r8d
shr    %r8d
cmp    $0x1,%r8d
jne    145a <pca+0x30a>
xor    %ecx,%ecx
jmp    14a7 <pca+0x357>
mov    %r14,%rdx
xor    %eax,%eax
call   1040 <sort@plt>
mov    0x8(%rsp),%rbp
mov    0x10(%rsp),%r11
cmp    $0x2,%r11d
jl     1866 <pca+0x716>
mov    %r11d,%r8d
shr    %r8d
cmp    $0x1,%r8d
jne    17f8 <pca+0x6a8>
xor    %ecx,%ecx
jmp    1846 <pca+0x6f6>
mov    %r10d,%edi
mov    %r14,%rdx
xor    %eax,%eax
call   1040 <sort@plt>
mov    0x10(%rsp),%r9
jmp    14c7 <pca+0x377>
mov    %r14,%rdx
xor    %eax,%eax
call   1040 <sort@plt>
mov    0x8(%rsp),%rbp
mov    0x10(%rsp),%r11
jmp    1866 <pca+0x716>
mov    %r8d,%edx
and    $0xfffffffe,%edx
lea    -0x2(%r10),%esi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
mov    (%r14,%rcx,4),%edi
lea    0x1(%rsi),%ebp
movslq %ebp,%rbp
mov    (%r14,%rbp,4),%eax
mov    %eax,(%r14,%rcx,4)
mov    %edi,(%r14,%rbp,4)
mov    0x4(%r14,%rcx,4),%eax
movslq %esi,%rsi
mov    (%r14,%rsi,4),%edi
mov    %edi,0x4(%r14,%rcx,4)
mov    %eax,(%r14,%rsi,4)
add    $0x2,%rcx
add    $0xfffffffe,%esi
cmp    %rcx,%rdx
jne    1470 <pca+0x320>
test   $0x1,%r8b
je     14c7 <pca+0x377>
mov    (%r14,%rcx,4),%eax
mov    %ecx,%edx
not    %edx
add    %r10d,%edx
movslq %edx,%rdx
mov    (%r14,%rdx,4),%esi
mov    %esi,(%r14,%rcx,4)
mov    %eax,(%r14,%rdx,4)
test   %r9d,%r9d
jle    162d <pca+0x4dd>
mov    %r9d,%r9d
mov    0x8(%rsp),%r8d
lea    -0x1(%r8),%r10
mov    %r8d,%esi
and    $0x3,%esi
mov    %r8d,%r11d
and    $0xfffffffc,%r11d
xor    %ecx,%ecx
jmp    14fd <pca+0x3ad>
nopl   (%rax)
add    $0x1,%rcx
cmp    %r9,%rcx
je     162d <pca+0x4dd>
cmpl   $0x0,0x8(%rsp)
jle    14f0 <pca+0x3a0>
xor    %eax,%eax
cmp    $0x3,%r10
jb     1567 <pca+0x417>
nopl   0x0(%rax)
movslq (%r14,%rax,4),%rdx
mov    (%r12,%rdx,8),%rdx
movsd  (%rdx,%rcx,8),%xmm0
movsd  %xmm0,(%rbx,%rax,8)
movslq 0x4(%r14,%rax,4),%rdx
mov    (%r12,%rdx,8),%rdx
movsd  (%rdx,%rcx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rax,8)
movslq 0x8(%r14,%rax,4),%rdx
mov    (%r12,%rdx,8),%rdx
movsd  (%rdx,%rcx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rax,8)
movslq 0xc(%r14,%rax,4),%rdx
mov    (%r12,%rdx,8),%rdx
movsd  (%rdx,%rcx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rax,8)
add    $0x4,%rax
cmp    %rax,%r11
jne    1510 <pca+0x3c0>
test   %rsi,%rsi
je     159c <pca+0x44c>
lea    (%rbx,%rax,8),%rdx
lea    (%r14,%rax,4),%rax
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
movslq (%rax,%rdi,4),%rbp
mov    (%r12,%rbp,8),%rbp
movsd  0x0(%rbp,%rcx,8),%xmm0
movsd  %xmm0,(%rdx,%rdi,8)
add    $0x1,%rdi
cmp    %rdi,%rsi
jne    1580 <pca+0x430>
cmpl   $0x0,0x8(%rsp)
jle    14f0 <pca+0x3a0>
xor    %eax,%eax
cmp    $0x3,%r10
jb     15f7 <pca+0x4a7>
nop
movsd  (%rbx,%rax,8),%xmm0
mov    (%r12,%rax,8),%rdx
movsd  %xmm0,(%rdx,%rcx,8)
movsd  0x8(%rbx,%rax,8),%xmm0
mov    0x8(%r12,%rax,8),%rdx
movsd  %xmm0,(%rdx,%rcx,8)
movsd  0x10(%rbx,%rax,8),%xmm0
mov    0x10(%r12,%rax,8),%rdx
movsd  %xmm0,(%rdx,%rcx,8)
movsd  0x18(%rbx,%rax,8),%xmm0
mov    0x18(%r12,%rax,8),%rdx
movsd  %xmm0,(%rdx,%rcx,8)
add    $0x4,%rax
cmp    %rax,%r11
jne    15b0 <pca+0x460>
test   $0x3,%r8b
je     14f0 <pca+0x3a0>
lea    (%r12,%rax,8),%rdx
lea    (%rbx,%rax,8),%rax
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
movsd  (%rax,%rdi,8),%xmm0
mov    (%rdx,%rdi,8),%rbp
movsd  %xmm0,0x0(%rbp,%rcx,8)
add    $0x1,%rdi
cmp    %rdi,%rsi
jne    1610 <pca+0x4c0>
jmp    14f0 <pca+0x3a0>
mov    0x8(%rsp),%rax
test   %eax,%eax
jle    11c9 <pca+0x79>
mov    %eax,%esi
lea    0x0(,%rsi,8),%rax
mov    %rax,0x20(%rsp)
lea    -0x1(%rsi),%rax
mov    %rax,0x10(%rsp)
mov    %esi,%r13d
and    $0x3,%r13d
mov    %esi,%ebp
and    $0xfffffffc,%ebp
xor    %r12d,%r12d
mov    %rsi,0x28(%rsp)
jmp    1698 <pca+0x548>
nopl   0x0(%rax,%rax,1)
mov    (%r15,%r12,8),%rdi
mov    %rbx,%rsi
mov    0x20(%rsp),%rdx
call   1060 <memcpy@plt>
add    $0x1,%r12
mov    0x28(%rsp),%rsi
cmp    %rsi,%r12
mov    0x8(%rsp),%rax
je     173c <pca+0x5ec>
mov    (%r15,%r12,8),%rax
cmpq   $0x3,0x10(%rsp)
jae    16b0 <pca+0x560>
xor    %ecx,%ecx
jmp    1707 <pca+0x5b7>
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq (%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rcx,8)
movslq 0x4(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rcx,8)
movslq 0x8(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rcx,8)
movslq 0xc(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%rbp
jne    16c0 <pca+0x570>
test   %r13,%r13
je     1670 <pca+0x520>
lea    (%rbx,%rcx,8),%rdx
lea    (%r14,%rcx,4),%rcx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movslq (%rcx,%rsi,4),%rdi
movsd  (%rax,%rdi,8),%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%r13
jne    1720 <pca+0x5d0>
jmp    1670 <pca+0x520>
test   %eax,%eax
mov    0x18(%rsp),%rdi
jle    11c9 <pca+0x79>
mov    %esi,%eax
and    $0x3,%eax
cmpq   $0x3,0x10(%rsp)
jae    175f <pca+0x60f>
xor    %ecx,%ecx
mov    0x8(%rsp),%r8
jmp    17b7 <pca+0x667>
and    $0xfffffffc,%esi
xor    %ecx,%ecx
mov    0x8(%rsp),%r8
nopl   0x0(%rax)
movslq (%r14,%rcx,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rcx,8)
movslq 0x4(%r14,%rcx,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rcx,8)
movslq 0x8(%r14,%rcx,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rcx,8)
movslq 0xc(%r14,%rcx,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%rsi
jne    1770 <pca+0x620>
test   %rax,%rax
je     17e7 <pca+0x697>
lea    (%rbx,%rcx,8),%rdx
lea    (%r14,%rcx,4),%rcx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movslq (%rcx,%rsi,4),%rbp
movsd  (%rdi,%rbp,8),%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%rax
jne    17d0 <pca+0x680>
mov    %r8d,%r11d
test   %r8d,%r8d
jg     1bb0 <pca+0xa60>
jmp    11c9 <pca+0x79>
mov    %r8d,%r9d
and    $0xfffffffe,%r9d
lea    -0x2(%r11),%esi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%r14,%rcx,4),%edi
lea    0x1(%rsi),%eax
cltq
mov    (%r14,%rax,4),%edx
mov    %edx,(%r14,%rcx,4)
mov    %edi,(%r14,%rax,4)
mov    0x4(%r14,%rcx,4),%eax
movslq %esi,%rsi
mov    (%r14,%rsi,4),%edx
mov    %edx,0x4(%r14,%rcx,4)
mov    %eax,(%r14,%rsi,4)
add    $0x2,%rcx
add    $0xfffffffe,%esi
cmp    %rcx,%r9
jne    1810 <pca+0x6c0>
test   $0x1,%r8b
je     1866 <pca+0x716>
mov    (%r14,%rcx,4),%eax
mov    %ecx,%edx
not    %edx
add    %r11d,%edx
movslq %edx,%rdx
mov    (%r14,%rdx,4),%esi
mov    %esi,(%r14,%rcx,4)
mov    %eax,(%r14,%rdx,4)
mov    %r13,0x38(%rsp)
test   %ebp,%ebp
mov    0x20(%rsp),%r8
jle    199a <pca+0x84a>
mov    0x38(%rsp),%rbp
lea    0x0(,%rbp,8),%rax
mov    %rax,0x40(%rsp)
lea    -0x1(%rbp),%rax
mov    %rax,0x28(%rsp)
mov    %ebp,%r13d
and    $0x3,%r13d
and    $0xfffffffc,%ebp
xor    %r9d,%r9d
jmp    18bd <pca+0x76d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%r9
cmp    %r8,%r9
je     199a <pca+0x84a>
test   %r11d,%r11d
jle    18b0 <pca+0x760>
mov    (%r12,%r9,8),%rax
cmpq   $0x3,0x28(%rsp)
jae    18e0 <pca+0x790>
xor    %ecx,%ecx
jmp    1937 <pca+0x7e7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq (%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rcx,8)
movslq 0x4(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rcx,8)
movslq 0x8(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rcx,8)
movslq 0xc(%r14,%rcx,4),%rdx
movsd  (%rax,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%rbp
jne    18f0 <pca+0x7a0>
test   %r13,%r13
je     1967 <pca+0x817>
lea    (%rbx,%rcx,8),%rdx
lea    (%r14,%rcx,4),%rcx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movslq (%rcx,%rsi,4),%rdi
movsd  (%rax,%rdi,8),%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%r13
jne    1950 <pca+0x800>
test   %r11d,%r11d
jle    18b0 <pca+0x760>
mov    (%r12,%r9,8),%rdi
mov    %rbx,%rsi
mov    0x40(%rsp),%rdx
mov    %r9,0x8(%rsp)
call   1060 <memcpy@plt>
mov    0x8(%rsp),%r9
mov    0x20(%rsp),%r8
mov    0x10(%rsp),%r11
jmp    18b0 <pca+0x760>
test   %r11d,%r11d
mov    0x18(%rsp),%rdi
mov    0x38(%rsp),%r12
jle    11c9 <pca+0x79>
lea    -0x1(%r12),%r8
mov    %r12d,%r10d
and    $0x3,%r10d
mov    %r12d,%r9d
and    $0xfffffffc,%r9d
xor    %esi,%esi
jmp    19dd <pca+0x88d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rsi
cmp    %r12,%rsi
je     1b0d <pca+0x9bd>
xor    %edx,%edx
cmp    $0x3,%r8
jb     1a47 <pca+0x8f7>
cs nopw 0x0(%rax,%rax,1)
nop
movslq (%r14,%rdx,4),%rax
mov    (%r15,%rax,8),%rax
movsd  (%rax,%rsi,8),%xmm0
movsd  %xmm0,(%rbx,%rdx,8)
movslq 0x4(%r14,%rdx,4),%rax
mov    (%r15,%rax,8),%rax
movsd  (%rax,%rsi,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rdx,8)
movslq 0x8(%r14,%rdx,4),%rax
mov    (%r15,%rax,8),%rax
movsd  (%rax,%rsi,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rdx,8)
movslq 0xc(%r14,%rdx,4),%rax
mov    (%r15,%rax,8),%rax
movsd  (%rax,%rsi,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%r9
jne    19f0 <pca+0x8a0>
test   %r10,%r10
je     1a7c <pca+0x92c>
lea    (%rbx,%rdx,8),%rax
lea    (%r14,%rdx,4),%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
movslq (%rcx,%rdx,4),%rbp
mov    (%r15,%rbp,8),%rbp
movsd  0x0(%rbp,%rsi,8),%xmm0
movsd  %xmm0,(%rax,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%r10
jne    1a60 <pca+0x910>
xor    %edx,%edx
cmp    $0x3,%r8
jb     1ad7 <pca+0x987>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rbx,%rdx,8),%xmm0
mov    (%r15,%rdx,8),%rax
movsd  %xmm0,(%rax,%rsi,8)
movsd  0x8(%rbx,%rdx,8),%xmm0
mov    0x8(%r15,%rdx,8),%rax
movsd  %xmm0,(%rax,%rsi,8)
movsd  0x10(%rbx,%rdx,8),%xmm0
mov    0x10(%r15,%rdx,8),%rax
movsd  %xmm0,(%rax,%rsi,8)
movsd  0x18(%rbx,%rdx,8),%xmm0
mov    0x18(%r15,%rdx,8),%rax
movsd  %xmm0,(%rax,%rsi,8)
add    $0x4,%rdx
cmp    %rdx,%r9
jne    1a90 <pca+0x940>
test   $0x3,%r12b
je     19d0 <pca+0x880>
lea    (%r15,%rdx,8),%rax
lea    (%rbx,%rdx,8),%rcx
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%rdx,8),%xmm0
mov    (%rax,%rdx,8),%rbp
movsd  %xmm0,0x0(%rbp,%rsi,8)
add    $0x1,%rdx
cmp    %rdx,%r10
jne    1af0 <pca+0x9a0>
jmp    19d0 <pca+0x880>
test   %r11d,%r11d
jle    11c9 <pca+0x79>
mov    %r12d,%ecx
and    $0x3,%ecx
cmp    $0x3,%r8
jae    1b26 <pca+0x9d6>
xor    %eax,%eax
jmp    1b77 <pca+0xa27>
and    $0xfffffffc,%r12d
xor    %eax,%eax
nopl   0x0(%rax)
movslq (%r14,%rax,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,(%rbx,%rax,8)
movslq 0x4(%r14,%rax,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x8(%rbx,%rax,8)
movslq 0x8(%r14,%rax,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x10(%rbx,%rax,8)
movslq 0xc(%r14,%rax,4),%rdx
movsd  (%rdi,%rdx,8),%xmm0
movsd  %xmm0,0x18(%rbx,%rax,8)
add    $0x4,%rax
cmp    %rax,%r12
jne    1b30 <pca+0x9e0>
test   %rcx,%rcx
je     1ba7 <pca+0xa57>
lea    (%rbx,%rax,8),%rdx
lea    (%r14,%rax,4),%rax
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movslq (%rax,%rsi,4),%rbp
movsd  (%rdi,%rbp,8),%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1b90 <pca+0xa40>
test   %r11d,%r11d
jle    11c9 <pca+0x79>
mov    %r11d,%edx
shl    $0x3,%rdx
mov    %rbx,%rsi
call   1060 <memcpy@plt>
jmp    11c9 <pca+0x79>

LLVM IR (-O0):
define i32 @pca(i32 %0, i32 %1, double** %2, double** %3, double* %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double**
%10 = alloca double**
%11 = alloca double*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32*
%16 = alloca double*
%17 = alloca double
%18 = alloca double
store i32 %0, i32* %7
store i32 %1, i32* %8
store double** %2, double*** %9
store double** %3, double*** %10
store double* %4, double** %11
%19 = load i32, i32* %8
%20 = sext i32 %19 to i64
%21 = mul i64 %20, 4
%22 = call i8* @malloc(i64 %21)
%23 = bitcast i8* %22 to i32*
store i32* %23, i32** %15
%24 = load i32, i32* %8
%25 = sext i32 %24 to i64
%26 = mul i64 %25, 8
%27 = call i8* @malloc(i64 %26)
%28 = bitcast i8* %27 to double*
store double* %28, double** %16
%29 = load i32*, i32** %15
%30 = icmp ne i32* %29, null
br i1 %30, label %31, label %34
31: ; preds = %5
%32 = load double*, double** %16
%33 = icmp ne double* %32, null
br i1 %33, label %47, label %34
34: ; preds = %31, %5
%35 = load i32*, i32** %15
%36 = icmp ne i32* %35, null
br i1 %36, label %37, label %40
37: ; preds = %34
%38 = load i32*, i32** %15
%39 = bitcast i32* %38 to i8*
br label %40
40: ; preds = %37, %34
%41 = load double*, double** %16
%42 = icmp ne double* %41, null
br i1 %42, label %43, label %46
43: ; preds = %40
%44 = load double*, double** %16
%45 = bitcast double* %44 to i8*
br label %46
46: ; preds = %43, %40
store i32 -1, i32* %6
br label %523
47: ; preds = %31
%48 = load i32, i32* %7
%49 = load i32, i32* %8
%50 = load double**, double*** %9
%51 = load double*, double** %11
%52 = load double**, double*** %10
%53 = call i32 (i32, i32, double**, double*, double**, ...) bitcast (i32 (...)* @svd to i32 (i32, i32, double**, double*, double**, ...)*)(i32 %48, i32 %49, double** %50, double* %51, double** %52)
store i32 %53, i32* %14
%54 = load i32, i32* %14
%55 = icmp eq i32 %54, 0
br i1 %55, label %56, label %517
56: ; preds = %47
%57 = load i32, i32* %7
%58 = load i32, i32* %8
%59 = icmp sge i32 %57, %58
br i1 %59, label %60, label %288
60: ; preds = %56
store i32 0, i32* %13
br label %61
61: ; preds = %91, %60
%62 = load i32, i32* %13
%63 = load i32, i32* %8
%64 = icmp slt i32 %62, %63
br i1 %64, label %65, label %94
65: ; preds = %61
%66 = load double*, double** %11
%67 = load i32, i32* %13
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds double, double* %66, i64 %68
%70 = load double, double* %69
store double %70, double* %17
store i32 0, i32* %12
br label %71
71: ; preds = %87, %65
%72 = load i32, i32* %12
%73 = load i32, i32* %7
%74 = icmp slt i32 %72, %73
br i1 %74, label %75, label %90
75: ; preds = %71
%76 = load double, double* %17
%77 = load double**, double*** %9
%78 = load i32, i32* %12
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds double*, double** %77, i64 %79
%81 = load double*, double** %80
%82 = load i32, i32* %13
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds double, double* %81, i64 %83
%85 = load double, double* %84
%86 = fmul double %85, %76
store double %86, double* %84
br label %87
87: ; preds = %75
%88 = load i32, i32* %12
%89 = add nsw i32 %88, 1
store i32 %89, i32* %12
br label %71
90: ; preds = %71
br label %91
91: ; preds = %90
%92 = load i32, i32* %13
%93 = add nsw i32 %92, 1
store i32 %93, i32* %13
br label %61
94: ; preds = %61
%95 = load i32, i32* %8
%96 = load double*, double** %11
%97 = load i32*, i32** %15
%98 = call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %95, double* %96, i32* %97)
store i32 0, i32* %12
br label %99
99: ; preds = %130, %94
%100 = load i32, i32* %12
%101 = load i32, i32* %8
%102 = sdiv i32 %101, 2
%103 = icmp slt i32 %100, %102
br i1 %103, label %104, label %133
104: ; preds = %99
%105 = load i32*, i32** %15
%106 = load i32, i32* %12
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds i32, i32* %105, i64 %107
%109 = load i32, i32* %108
store i32 %109, i32* %13
%110 = load i32*, i32** %15
%111 = load i32, i32* %8
%112 = sub nsw i32 %111, 1
%113 = load i32, i32* %12
%114 = sub nsw i32 %112, %113
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i32, i32* %110, i64 %115
%117 = load i32, i32* %116
%118 = load i32*, i32** %15
%119 = load i32, i32* %12
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i32, i32* %118, i64 %120
store i32 %117, i32* %121
%122 = load i32, i32* %13
%123 = load i32*, i32** %15
%124 = load i32, i32* %8
%125 = sub nsw i32 %124, 1
%126 = load i32, i32* %12
%127 = sub nsw i32 %125, %126
%128 = sext i32 %127 to i64
%129 = getelementptr inbounds i32, i32* %123, i64 %128
store i32 %122, i32* %129
br label %130
130: ; preds = %104
%131 = load i32, i32* %12
%132 = add nsw i32 %131, 1
store i32 %132, i32* %12
br label %99
133: ; preds = %99
store i32 0, i32* %12
br label %134
134: ; preds = %187, %133
%135 = load i32, i32* %12
%136 = load i32, i32* %7
%137 = icmp slt i32 %135, %136
br i1 %137, label %138, label %190
138: ; preds = %134
store i32 0, i32* %13
br label %139
139: ; preds = %161, %138
%140 = load i32, i32* %13
%141 = load i32, i32* %8
%142 = icmp slt i32 %140, %141
br i1 %142, label %143, label %164
143: ; preds = %139
%144 = load double**, double*** %9
%145 = load i32, i32* %12
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds double*, double** %144, i64 %146
%148 = load double*, double** %147
%149 = load i32*, i32** %15
%150 = load i32, i32* %13
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds i32, i32* %149, i64 %151
%153 = load i32, i32* %152
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds double, double* %148, i64 %154
%156 = load double, double* %155
%157 = load double*, double** %16
%158 = load i32, i32* %13
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds double, double* %157, i64 %159
store double %156, double* %160
br label %161
161: ; preds = %143
%162 = load i32, i32* %13
%163 = add nsw i32 %162, 1
store i32 %163, i32* %13
br label %139
164: ; preds = %139
store i32 0, i32* %13
br label %165
165: ; preds = %183, %164
%166 = load i32, i32* %13
%167 = load i32, i32* %8
%168 = icmp slt i32 %166, %167
br i1 %168, label %169, label %186
169: ; preds = %165
%170 = load double*, double** %16
%171 = load i32, i32* %13
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds double, double* %170, i64 %172
%174 = load double, double* %173
%175 = load double**, double*** %9
%176 = load i32, i32* %12
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double*, double** %175, i64 %177
%179 = load double*, double** %178
%180 = load i32, i32* %13
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds double, double* %179, i64 %181
store double %174, double* %182
br label %183
183: ; preds = %169
%184 = load i32, i32* %13
%185 = add nsw i32 %184, 1
store i32 %185, i32* %13
br label %165
186: ; preds = %165
br label %187
187: ; preds = %186
%188 = load i32, i32* %12
%189 = add nsw i32 %188, 1
store i32 %189, i32* %12
br label %134
190: ; preds = %134
store i32 0, i32* %12
br label %191
191: ; preds = %244, %190
%192 = load i32, i32* %12
%193 = load i32, i32* %8
%194 = icmp slt i32 %192, %193
br i1 %194, label %195, label %247
195: ; preds = %191
store i32 0, i32* %13
br label %196
196: ; preds = %218, %195
%197 = load i32, i32* %13
%198 = load i32, i32* %8
%199 = icmp slt i32 %197, %198
br i1 %199, label %200, label %221
200: ; preds = %196
%201 = load double**, double*** %10
%202 = load i32*, i32** %15
%203 = load i32, i32* %13
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds i32, i32* %202, i64 %204
%206 = load i32, i32* %205
%207 = sext i32 %206 to i64
%208 = getelementptr inbounds double*, double** %201, i64 %207
%209 = load double*, double** %208
%210 = load i32, i32* %12
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %209, i64 %211
%213 = load double, double* %212
%214 = load double*, double** %16
%215 = load i32, i32* %13
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds double, double* %214, i64 %216
store double %213, double* %217
br label %218
218: ; preds = %200
%219 = load i32, i32* %13
%220 = add nsw i32 %219, 1
store i32 %220, i32* %13
br label %196
221: ; preds = %196
store i32 0, i32* %13
br label %222
222: ; preds = %240, %221
%223 = load i32, i32* %13
%224 = load i32, i32* %8
%225 = icmp slt i32 %223, %224
br i1 %225, label %226, label %243
226: ; preds = %222
%227 = load double*, double** %16
%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*** %10
%233 = load i32, i32* %13
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds double*, double** %232, i64 %234
%236 = load double*, double** %235
%237 = load i32, i32* %12
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds double, double* %236, i64 %238
store double %231, double* %239
br label %240
240: ; preds = %226
%241 = load i32, i32* %13
%242 = add nsw i32 %241, 1
store i32 %242, i32* %13
br label %222
243: ; preds = %222
br label %244
244: ; preds = %243
%245 = load i32, i32* %12
%246 = add nsw i32 %245, 1
store i32 %246, i32* %12
br label %191
247: ; preds = %191
store i32 0, i32* %12
br label %248
248: ; preds = %266, %247
%249 = load i32, i32* %12
%250 = load i32, i32* %8
%251 = icmp slt i32 %249, %250
br i1 %251, label %252, label %269
252: ; preds = %248
%253 = load double*, double** %11
%254 = load i32*, i32** %15
%255 = load i32, i32* %12
%256 = sext i32 %255 to i64
%257 = getelementptr inbounds i32, i32* %254, i64 %256
%258 = load i32, i32* %257
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds double, double* %253, i64 %259
%261 = load double, double* %260
%262 = load double*, double** %16
%263 = load i32, i32* %12
%264 = sext i32 %263 to i64
%265 = getelementptr inbounds double, double* %262, i64 %264
store double %261, double* %265
br label %266
266: ; preds = %252
%267 = load i32, i32* %12
%268 = add nsw i32 %267, 1
store i32 %268, i32* %12
br label %248
269: ; preds = %248
store i32 0, i32* %12
br label %270
270: ; preds = %284, %269
%271 = load i32, i32* %12
%272 = load i32, i32* %8
%273 = icmp slt i32 %271, %272
br i1 %273, label %274, label %287
274: ; preds = %270
%275 = load double*, double** %16
%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 = load double*, double** %11
%281 = load i32, i32* %12
%282 = sext i32 %281 to i64
%283 = getelementptr inbounds double, double* %280, i64 %282
store double %279, double* %283
br label %284
284: ; preds = %274
%285 = load i32, i32* %12
%286 = add nsw i32 %285, 1
store i32 %286, i32* %12
br label %270
287: ; preds = %270
br label %516
288: ; preds = %56
store i32 0, i32* %13
br label %289
289: ; preds = %319, %288
%290 = load i32, i32* %13
%291 = load i32, i32* %7
%292 = icmp slt i32 %290, %291
br i1 %292, label %293, label %322
293: ; preds = %289
%294 = load double*, double** %11
%295 = load i32, i32* %13
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds double, double* %294, i64 %296
%298 = load double, double* %297
store double %298, double* %18
store i32 0, i32* %12
br label %299
299: ; preds = %315, %293
%300 = load i32, i32* %12
%301 = load i32, i32* %7
%302 = icmp slt i32 %300, %301
br i1 %302, label %303, label %318
303: ; preds = %299
%304 = load double, double* %18
%305 = load double**, double*** %10
%306 = load i32, i32* %12
%307 = sext i32 %306 to i64
%308 = getelementptr inbounds double*, double** %305, i64 %307
%309 = load double*, double** %308
%310 = load i32, i32* %13
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds double, double* %309, i64 %311
%313 = load double, double* %312
%314 = fmul double %313, %304
store double %314, double* %312
br label %315
315: ; preds = %303
%316 = load i32, i32* %12
%317 = add nsw i32 %316, 1
store i32 %317, i32* %12
br label %299
318: ; preds = %299
br label %319
319: ; preds = %318
%320 = load i32, i32* %13
%321 = add nsw i32 %320, 1
store i32 %321, i32* %13
br label %289
322: ; preds = %289
%323 = load i32, i32* %7
%324 = load double*, double** %11
%325 = load i32*, i32** %15
%326 = call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %323, double* %324, i32* %325)
store i32 0, i32* %12
br label %327
327: ; preds = %358, %322
%328 = load i32, i32* %12
%329 = load i32, i32* %7
%330 = sdiv i32 %329, 2
%331 = icmp slt i32 %328, %330
br i1 %331, label %332, label %361
332: ; preds = %327
%333 = load i32*, i32** %15
%334 = load i32, i32* %12
%335 = sext i32 %334 to i64
%336 = getelementptr inbounds i32, i32* %333, i64 %335
%337 = load i32, i32* %336
store i32 %337, i32* %13
%338 = load i32*, i32** %15
%339 = load i32, i32* %7
%340 = sub nsw i32 %339, 1
%341 = load i32, i32* %12
%342 = sub nsw i32 %340, %341
%343 = sext i32 %342 to i64
%344 = getelementptr inbounds i32, i32* %338, i64 %343
%345 = load i32, i32* %344
%346 = load i32*, i32** %15
%347 = load i32, i32* %12
%348 = sext i32 %347 to i64
%349 = getelementptr inbounds i32, i32* %346, i64 %348
store i32 %345, i32* %349
%350 = load i32, i32* %13
%351 = load i32*, i32** %15
%352 = load i32, i32* %7
%353 = sub nsw i32 %352, 1
%354 = load i32, i32* %12
%355 = sub nsw i32 %353, %354
%356 = sext i32 %355 to i64
%357 = getelementptr inbounds i32, i32* %351, i64 %356
store i32 %350, i32* %357
br label %358
358: ; preds = %332
%359 = load i32, i32* %12
%360 = add nsw i32 %359, 1
store i32 %360, i32* %12
br label %327
361: ; preds = %327
store i32 0, i32* %13
br label %362
362: ; preds = %415, %361
%363 = load i32, i32* %13
%364 = load i32, i32* %8
%365 = icmp slt i32 %363, %364
br i1 %365, label %366, label %418
366: ; preds = %362
store i32 0, i32* %12
br label %367
367: ; preds = %389, %366
%368 = load i32, i32* %12
%369 = load i32, i32* %7
%370 = icmp slt i32 %368, %369
br i1 %370, label %371, label %392
371: ; preds = %367
%372 = load double**, double*** %9
%373 = load i32*, i32** %15
%374 = load i32, i32* %12
%375 = sext i32 %374 to i64
%376 = getelementptr inbounds i32, i32* %373, i64 %375
%377 = load i32, i32* %376
%378 = sext i32 %377 to i64
%379 = getelementptr inbounds double*, double** %372, i64 %378
%380 = load double*, double** %379
%381 = load i32, i32* %13
%382 = sext i32 %381 to i64
%383 = getelementptr inbounds double, double* %380, i64 %382
%384 = load double, double* %383
%385 = load double*, double** %16
%386 = load i32, i32* %12
%387 = sext i32 %386 to i64
%388 = getelementptr inbounds double, double* %385, i64 %387
store double %384, double* %388
br label %389
389: ; preds = %371
%390 = load i32, i32* %12
%391 = add nsw i32 %390, 1
store i32 %391, i32* %12
br label %367
392: ; preds = %367
store i32 0, i32* %12
br label %393
393: ; preds = %411, %392
%394 = load i32, i32* %12
%395 = load i32, i32* %7
%396 = icmp slt i32 %394, %395
br i1 %396, label %397, label %414
397: ; preds = %393
%398 = load double*, double** %16
%399 = load i32, i32* %12
%400 = sext i32 %399 to i64
%401 = getelementptr inbounds double, double* %398, i64 %400
%402 = load double, double* %401
%403 = load double**, double*** %9
%404 = load i32, i32* %12
%405 = sext i32 %404 to i64
%406 = getelementptr inbounds double*, double** %403, i64 %405
%407 = load double*, double** %406
%408 = load i32, i32* %13
%409 = sext i32 %408 to i64
%410 = getelementptr inbounds double, double* %407, i64 %409
store double %402, double* %410
br label %411
411: ; preds = %397
%412 = load i32, i32* %12
%413 = add nsw i32 %412, 1
store i32 %413, i32* %12
br label %393
414: ; preds = %393
br label %415
415: ; preds = %414
%416 = load i32, i32* %13
%417 = add nsw i32 %416, 1
store i32 %417, i32* %13
br label %362
418: ; preds = %362
store i32 0, i32* %13
br label %419
419: ; preds = %472, %418
%420 = load i32, i32* %13
%421 = load i32, i32* %7
%422 = icmp slt i32 %420, %421
br i1 %422, label %423, label %475
423: ; preds = %419
store i32 0, i32* %12
br label %424
424: ; preds = %446, %423
%425 = load i32, i32* %12
%426 = load i32, i32* %7
%427 = icmp slt i32 %425, %426
br i1 %427, label %428, label %449
428: ; preds = %424
%429 = load double**, double*** %10
%430 = load i32, i32* %13
%431 = sext i32 %430 to i64
%432 = getelementptr inbounds double*, double** %429, i64 %431
%433 = load double*, double** %432
%434 = load i32*, i32** %15
%435 = load i32, i32* %12
%436 = sext i32 %435 to i64
%437 = getelementptr inbounds i32, i32* %434, i64 %436
%438 = load i32, i32* %437
%439 = sext i32 %438 to i64
%440 = getelementptr inbounds double, double* %433, i64 %439
%441 = load double, double* %440
%442 = load double*, double** %16
%443 = load i32, i32* %12
%444 = sext i32 %443 to i64
%445 = getelementptr inbounds double, double* %442, i64 %444
store double %441, double* %445
br label %446
446: ; preds = %428
%447 = load i32, i32* %12
%448 = add nsw i32 %447, 1
store i32 %448, i32* %12
br label %424
449: ; preds = %424
store i32 0, i32* %12
br label %450
450: ; preds = %468, %449
%451 = load i32, i32* %12
%452 = load i32, i32* %7
%453 = icmp slt i32 %451, %452
br i1 %453, label %454, label %471
454: ; preds = %450
%455 = load double*, double** %16
%456 = load i32, i32* %12
%457 = sext i32 %456 to i64
%458 = getelementptr inbounds double, double* %455, i64 %457
%459 = load double, double* %458
%460 = load double**, double*** %10
%461 = load i32, i32* %13
%462 = sext i32 %461 to i64
%463 = getelementptr inbounds double*, double** %460, i64 %462
%464 = load double*, double** %463
%465 = load i32, i32* %12
%466 = sext i32 %465 to i64
%467 = getelementptr inbounds double, double* %464, i64 %466
store double %459, double* %467
br label %468
468: ; preds = %454
%469 = load i32, i32* %12
%470 = add nsw i32 %469, 1
store i32 %470, i32* %12
br label %450
471: ; preds = %450
br label %472
472: ; preds = %471
%473 = load i32, i32* %13
%474 = add nsw i32 %473, 1
store i32 %474, i32* %13
br label %419
475: ; preds = %419
store i32 0, i32* %12
br label %476
476: ; preds = %494, %475
%477 = load i32, i32* %12
%478 = load i32, i32* %7
%479 = icmp slt i32 %477, %478
br i1 %479, label %480, label %497
480: ; preds = %476
%481 = load double*, double** %11
%482 = load i32*, i32** %15
%483 = load i32, i32* %12
%484 = sext i32 %483 to i64
%485 = getelementptr inbounds i32, i32* %482, i64 %484
%486 = load i32, i32* %485
%487 = sext i32 %486 to i64
%488 = getelementptr inbounds double, double* %481, i64 %487
%489 = load double, double* %488
%490 = load double*, double** %16
%491 = load i32, i32* %12
%492 = sext i32 %491 to i64
%493 = getelementptr inbounds double, double* %490, i64 %492
store double %489, double* %493
br label %494
494: ; preds = %480
%495 = load i32, i32* %12
%496 = add nsw i32 %495, 1
store i32 %496, i32* %12
br label %476
497: ; preds = %476
store i32 0, i32* %12
br label %498
498: ; preds = %512, %497
%499 = load i32, i32* %12
%500 = load i32, i32* %7
%501 = icmp slt i32 %499, %500
br i1 %501, label %502, label %515
502: ; preds = %498
%503 = load double*, double** %16
%504 = load i32, i32* %12
%505 = sext i32 %504 to i64
%506 = getelementptr inbounds double, double* %503, i64 %505
%507 = load double, double* %506
%508 = load double*, double** %11
%509 = load i32, i32* %12
%510 = sext i32 %509 to i64
%511 = getelementptr inbounds double, double* %508, i64 %510
store double %507, double* %511
br label %512
512: ; preds = %502
%513 = load i32, i32* %12
%514 = add nsw i32 %513, 1
store i32 %514, i32* %12
br label %498
515: ; preds = %498
br label %516
516: ; preds = %515, %287
br label %517
517: ; preds = %516, %47
%518 = load i32*, i32** %15
%519 = bitcast i32* %518 to i8*
%520 = load double*, double** %16
%521 = bitcast double* %520 to i8*
%522 = load i32, i32* %14
store i32 %522, i32* %6
br label %523
523: ; preds = %517, %46
%524 = load i32, i32* %6
ret i32 %524
}

LLVM IR (-O2):
define i32 @pca(i32 %0, i32 %1, double** %2, double** %3, double* %4) {
%6 = bitcast double* %4 to i8*
%7 = sext i32 %1 to i64
%8 = shl nsw i64 %7, 2
%9 = tail call i8* @malloc(i64 %8)
%10 = bitcast i8* %9 to i32*
%11 = shl nsw i64 %7, 3
%12 = tail call i8* @malloc(i64 %11)
%13 = bitcast i8* %12 to double*
%14 = icmp ne i8* %9, null
%15 = icmp ne i8* %12, null
%16 = and i1 %14, %15
br i1 %16, label %21, label %17
17: ; preds = %5
br i1 %14, label %18, label %19
18: ; preds = %17
tail call void @free(i8* %9)
br label %19
19: ; preds = %18, %17
br i1 %15, label %20, label %729
20: ; preds = %19
tail call void @free(i8* %12)
br label %729
21: ; preds = %5
%22 = tail call i32 (i32, i32, double**, double*, double**, ...) bitcast (i32 (...)* @svd to i32 (i32, i32, double**, double*, double**, ...)*)(i32 %0, i32 %1, double** %2, double* %4, double** %3)
%23 = icmp eq i32 %22, 0
br i1 %23, label %24, label %728
24: ; preds = %21
%25 = icmp slt i32 %0, %1
br i1 %25, label %39, label %26
26: ; preds = %24
%27 = icmp sgt i32 %1, 0
br i1 %27, label %30, label %28
28: ; preds = %26
%29 = tail call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %1, double* %4, i32* %10)
br label %122
30: ; preds = %26
%31 = icmp sgt i32 %0, 0
%32 = zext i32 %1 to i64
%33 = zext i32 %0 to i64
%34 = add nsw i64 %33, -1
%35 = and i64 %33, 3
%36 = icmp ult i64 %34, 3
%37 = and i64 %33, 4294967292
%38 = icmp eq i64 %35, 0
br label %50
39: ; preds = %24
%40 = icmp sgt i32 %0, 0
br i1 %40, label %43, label %41
41: ; preds = %39
%42 = tail call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %0, double* %4, i32* %10)
br label %459
43: ; preds = %39
%44 = zext i32 %0 to i64
%45 = add nsw i64 %44, -1
%46 = and i64 %44, 3
%47 = icmp ult i64 %45, 3
%48 = and i64 %44, 4294967292
%49 = icmp eq i64 %46, 0
br label %388
50: ; preds = %30, %97
%51 = phi i64 [ 0, %30 ], [ %98, %97 ]
%52 = getelementptr inbounds double, double* %4, i64 %51
%53 = load double, double* %52
br i1 %31, label %54, label %97
54: ; preds = %50
br i1 %36, label %84, label %55
55: ; preds = %54, %55
%56 = phi i64 [ %81, %55 ], [ 0, %54 ]
%57 = phi i64 [ %82, %55 ], [ 0, %54 ]
%58 = getelementptr inbounds double*, double** %2, i64 %56
%59 = load double*, double** %58
%60 = getelementptr inbounds double, double* %59, i64 %51
%61 = load double, double* %60
%62 = fmul double %53, %61
store double %62, double* %60
%63 = or i64 %56, 1
%64 = getelementptr inbounds double*, double** %2, i64 %63
%65 = load double*, double** %64
%66 = getelementptr inbounds double, double* %65, i64 %51
%67 = load double, double* %66
%68 = fmul double %53, %67
store double %68, double* %66
%69 = or i64 %56, 2
%70 = getelementptr inbounds double*, double** %2, i64 %69
%71 = load double*, double** %70
%72 = getelementptr inbounds double, double* %71, i64 %51
%73 = load double, double* %72
%74 = fmul double %53, %73
store double %74, double* %72
%75 = or i64 %56, 3
%76 = getelementptr inbounds double*, double** %2, i64 %75
%77 = load double*, double** %76
%78 = getelementptr inbounds double, double* %77, i64 %51
%79 = load double, double* %78
%80 = fmul double %53, %79
store double %80, double* %78
%81 = add nuw nsw i64 %56, 4
%82 = add i64 %57, 4
%83 = icmp eq i64 %82, %37
br i1 %83, label %84, label %55
84: ; preds = %55, %54
%85 = phi i64 [ 0, %54 ], [ %81, %55 ]
br i1 %38, label %97, label %86
86: ; preds = %84, %86
%87 = phi i64 [ %94, %86 ], [ %85, %84 ]
%88 = phi i64 [ %95, %86 ], [ 0, %84 ]
%89 = getelementptr inbounds double*, double** %2, i64 %87
%90 = load double*, double** %89
%91 = getelementptr inbounds double, double* %90, i64 %51
%92 = load double, double* %91
%93 = fmul double %53, %92
store double %93, double* %91
%94 = add nuw nsw i64 %87, 1
%95 = add i64 %88, 1
%96 = icmp eq i64 %95, %35
br i1 %96, label %97, label %86
97: ; preds = %84, %86, %50
%98 = add nuw nsw i64 %51, 1
%99 = icmp eq i64 %98, %32
br i1 %99, label %100, label %50
100: ; preds = %97
%101 = tail call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %1, double* %4, i32* %10)
%102 = icmp sgt i32 %1, 1
br i1 %102, label %103, label %122
103: ; preds = %100
%104 = lshr i32 %1, 1
%105 = zext i32 %104 to i64
%106 = and i64 %105, 1
%107 = icmp eq i32 %104, 1
br i1 %107, label %110, label %108
108: ; preds = %103
%109 = and i64 %105, 2147483646
br label %133
110: ; preds = %133, %103
%111 = phi i64 [ 0, %103 ], [ %153, %133 ]
%112 = icmp eq i64 %106, 0
br i1 %112, label %122, label %113
113: ; preds = %110
%114 = getelementptr inbounds i32, i32* %10, i64 %111
%115 = load i32, i32* %114
%116 = trunc i64 %111 to i32
%117 = xor i32 %116, -1
%118 = add i32 %117, %1
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i32, i32* %10, i64 %119
%121 = load i32, i32* %120
store i32 %121, i32* %114
store i32 %115, i32* %120
br label %122
122: ; preds = %113, %110, %28, %100
%123 = icmp sgt i32 %0, 0
br i1 %123, label %124, label %161
124: ; preds = %122
%125 = zext i32 %1 to i64
%126 = shl nuw nsw i64 %125, 3
%127 = zext i32 %0 to i64
%128 = add nsw i64 %125, -1
%129 = and i64 %125, 3
%130 = icmp ult i64 %128, 3
%131 = and i64 %125, 4294967292
%132 = icmp eq i64 %129, 0
br label %156
133: ; preds = %133, %108
%134 = phi i64 [ 0, %108 ], [ %153, %133 ]
%135 = phi i64 [ 0, %108 ], [ %154, %133 ]
%136 = getelementptr inbounds i32, i32* %10, i64 %134
%137 = load i32, i32* %136
%138 = trunc i64 %134 to i32
%139 = xor i32 %138, -1
%140 = add i32 %139, %1
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds i32, i32* %10, i64 %141
%143 = load i32, i32* %142
store i32 %143, i32* %136
store i32 %137, i32* %142
%144 = or i64 %134, 1
%145 = getelementptr inbounds i32, i32* %10, i64 %144
%146 = load i32, i32* %145
%147 = trunc i64 %144 to i32
%148 = xor i32 %147, -1
%149 = add i32 %148, %1
%150 = sext i32 %149 to i64
%151 = getelementptr inbounds i32, i32* %10, i64 %150
%152 = load i32, i32* %151
store i32 %152, i32* %145
store i32 %146, i32* %151
%153 = add nuw nsw i64 %134, 2
%154 = add i64 %135, 2
%155 = icmp eq i64 %154, %109
br i1 %155, label %110, label %133
156: ; preds = %124, %225
%157 = phi i64 [ 0, %124 ], [ %226, %225 ]
br i1 %27, label %158, label %225
158: ; preds = %156
%159 = getelementptr inbounds double*, double** %2, i64 %157
%160 = load double*, double** %159
br i1 %130, label %173, label %192
161: ; preds = %225, %122
br i1 %27, label %162, label %728
162: ; preds = %161
%163 = zext i32 %1 to i64
%164 = add nsw i64 %163, -1
%165 = and i64 %163, 3
%166 = icmp ult i64 %164, 3
%167 = and i64 %163, 4294967292
%168 = icmp eq i64 %165, 0
%169 = and i64 %163, 3
%170 = icmp ult i64 %164, 3
%171 = and i64 %163, 4294967292
%172 = icmp eq i64 %169, 0
br label %228
173: ; preds = %192, %158
%174 = phi i64 [ 0, %158 ], [ %222, %192 ]
br i1 %132, label %187, label %175
175: ; preds = %173, %175
%176 = phi i64 [ %184, %175 ], [ %174, %173 ]
%177 = phi i64 [ %185, %175 ], [ 0, %173 ]
%178 = getelementptr inbounds i32, i32* %10, i64 %176
%179 = load i32, i32* %178
%180 = sext i32 %179 to i64
%181 = getelementptr inbounds double, double* %160, i64 %180
%182 = load double, double* %181
%183 = getelementptr inbounds double, double* %13, i64 %176
store double %182, double* %183
%184 = add nuw nsw i64 %176, 1
%185 = add i64 %177, 1
%186 = icmp eq i64 %185, %129
br i1 %186, label %187, label %175
187: ; preds = %175, %173
br i1 %27, label %188, label %225
188: ; preds = %187
%189 = getelementptr inbounds double*, double** %2, i64 %157
%190 = bitcast double** %189 to i8**
%191 = load i8*, i8** %190
br label %225
192: ; preds = %158, %192
%193 = phi i64 [ %222, %192 ], [ 0, %158 ]
%194 = phi i64 [ %223, %192 ], [ 0, %158 ]
%195 = getelementptr inbounds i32, i32* %10, i64 %193
%196 = load i32, i32* %195
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds double, double* %160, i64 %197
%199 = load double, double* %198
%200 = getelementptr inbounds double, double* %13, i64 %193
store double %199, double* %200
%201 = or i64 %193, 1
%202 = getelementptr inbounds i32, i32* %10, i64 %201
%203 = load i32, i32* %202
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds double, double* %160, i64 %204
%206 = load double, double* %205
%207 = getelementptr inbounds double, double* %13, i64 %201
store double %206, double* %207
%208 = or i64 %193, 2
%209 = getelementptr inbounds i32, i32* %10, i64 %208
%210 = load i32, i32* %209
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %160, i64 %211
%213 = load double, double* %212
%214 = getelementptr inbounds double, double* %13, i64 %208
store double %213, double* %214
%215 = or i64 %193, 3
%216 = getelementptr inbounds i32, i32* %10, i64 %215
%217 = load i32, i32* %216
%218 = sext i32 %217 to i64
%219 = getelementptr inbounds double, double* %160, i64 %218
%220 = load double, double* %219
%221 = getelementptr inbounds double, double* %13, i64 %215
store double %220, double* %221
%222 = add nuw nsw i64 %193, 4
%223 = add i64 %194, 4
%224 = icmp eq i64 %223, %131
br i1 %224, label %173, label %192
225: ; preds = %156, %188, %187
%226 = add nuw nsw i64 %157, 1
%227 = icmp eq i64 %226, %127
br i1 %227, label %161, label %156
228: ; preds = %336, %162
%229 = phi i64 [ 0, %162 ], [ %337, %336 ]
br i1 %166, label %277, label %236
230: ; preds = %336
br i1 %27, label %231, label %728
231: ; preds = %230
%232 = and i64 %163, 3
%233 = icmp ult i64 %164, 3
br i1 %233, label %339, label %234
234: ; preds = %231
%235 = and i64 %163, 4294967292
br label %355
236: ; preds = %228, %236
%237 = phi i64 [ %274, %236 ], [ 0, %228 ]
%238 = phi i64 [ %275, %236 ], [ 0, %228 ]
%239 = getelementptr inbounds i32, i32* %10, i64 %237
%240 = load i32, i32* %239
%241 = sext i32 %240 to i64
%242 = getelementptr inbounds double*, double** %3, i64 %241
%243 = load double*, double** %242
%244 = getelementptr inbounds double, double* %243, i64 %229
%245 = load double, double* %244
%246 = getelementptr inbounds double, double* %13, i64 %237
store double %245, double* %246
%247 = or i64 %237, 1
%248 = getelementptr inbounds i32, i32* %10, i64 %247
%249 = load i32, i32* %248
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds double*, double** %3, i64 %250
%252 = load double*, double** %251
%253 = getelementptr inbounds double, double* %252, i64 %229
%254 = load double, double* %253
%255 = getelementptr inbounds double, double* %13, i64 %247
store double %254, double* %255
%256 = or i64 %237, 2
%257 = getelementptr inbounds i32, i32* %10, i64 %256
%258 = load i32, i32* %257
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds double*, double** %3, i64 %259
%261 = load double*, double** %260
%262 = getelementptr inbounds double, double* %261, i64 %229
%263 = load double, double* %262
%264 = getelementptr inbounds double, double* %13, i64 %256
store double %263, double* %264
%265 = or i64 %237, 3
%266 = getelementptr inbounds i32, i32* %10, i64 %265
%267 = load i32, i32* %266
%268 = sext i32 %267 to i64
%269 = getelementptr inbounds double*, double** %3, i64 %268
%270 = load double*, double** %269
%271 = getelementptr inbounds double, double* %270, i64 %229
%272 = load double, double* %271
%273 = getelementptr inbounds double, double* %13, i64 %265
store double %272, double* %273
%274 = add nuw nsw i64 %237, 4
%275 = add i64 %238, 4
%276 = icmp eq i64 %275, %167
br i1 %276, label %277, label %236
277: ; preds = %236, %228
%278 = phi i64 [ 0, %228 ], [ %274, %236 ]
br i1 %168, label %293, label %279
279: ; preds = %277, %279
%280 = phi i64 [ %290, %279 ], [ %278, %277 ]
%281 = phi i64 [ %291, %279 ], [ 0, %277 ]
%282 = getelementptr inbounds i32, i32* %10, i64 %280
%283 = load i32, i32* %282
%284 = sext i32 %283 to i64
%285 = getelementptr inbounds double*, double** %3, i64 %284
%286 = load double*, double** %285
%287 = getelementptr inbounds double, double* %286, i64 %229
%288 = load double, double* %287
%289 = getelementptr inbounds double, double* %13, i64 %280
store double %288, double* %289
%290 = add nuw nsw i64 %280, 1
%291 = add i64 %281, 1
%292 = icmp eq i64 %291, %165
br i1 %292, label %293, label %279
293: ; preds = %279, %277
br i1 %170, label %323, label %294
294: ; preds = %293, %294
%295 = phi i64 [ %320, %294 ], [ 0, %293 ]
%296 = phi i64 [ %321, %294 ], [ 0, %293 ]
%297 = getelementptr inbounds double, double* %13, i64 %295
%298 = load double, double* %297
%299 = getelementptr inbounds double*, double** %3, i64 %295
%300 = load double*, double** %299
%301 = getelementptr inbounds double, double* %300, i64 %229
store double %298, double* %301
%302 = or i64 %295, 1
%303 = getelementptr inbounds double, double* %13, i64 %302
%304 = load double, double* %303
%305 = getelementptr inbounds double*, double** %3, i64 %302
%306 = load double*, double** %305
%307 = getelementptr inbounds double, double* %306, i64 %229
store double %304, double* %307
%308 = or i64 %295, 2
%309 = getelementptr inbounds double, double* %13, i64 %308
%310 = load double, double* %309
%311 = getelementptr inbounds double*, double** %3, i64 %308
%312 = load double*, double** %311
%313 = getelementptr inbounds double, double* %312, i64 %229
store double %310, double* %313
%314 = or i64 %295, 3
%315 = getelementptr inbounds double, double* %13, i64 %314
%316 = load double, double* %315
%317 = getelementptr inbounds double*, double** %3, i64 %314
%318 = load double*, double** %317
%319 = getelementptr inbounds double, double* %318, i64 %229
store double %316, double* %319
%320 = add nuw nsw i64 %295, 4
%321 = add i64 %296, 4
%322 = icmp eq i64 %321, %171
br i1 %322, label %323, label %294
323: ; preds = %294, %293
%324 = phi i64 [ 0, %293 ], [ %320, %294 ]
br i1 %172, label %336, label %325
325: ; preds = %323, %325
%326 = phi i64 [ %333, %325 ], [ %324, %323 ]
%327 = phi i64 [ %334, %325 ], [ 0, %323 ]
%328 = getelementptr inbounds double, double* %13, i64 %326
%329 = load double, double* %328
%330 = getelementptr inbounds double*, double** %3, i64 %326
%331 = load double*, double** %330
%332 = getelementptr inbounds double, double* %331, i64 %229
store double %329, double* %332
%333 = add nuw nsw i64 %326, 1
%334 = add i64 %327, 1
%335 = icmp eq i64 %334, %169
br i1 %335, label %336, label %325
336: ; preds = %325, %323
%337 = add nuw nsw i64 %229, 1
%338 = icmp eq i64 %337, %163
br i1 %338, label %230, label %228
339: ; preds = %355, %231
%340 = phi i64 [ 0, %231 ], [ %385, %355 ]
%341 = icmp eq i64 %232, 0
br i1 %341, label %354, label %342
342: ; preds = %339, %342
%343 = phi i64 [ %351, %342 ], [ %340, %339 ]
%344 = phi i64 [ %352, %342 ], [ 0, %339 ]
%345 = getelementptr inbounds i32, i32* %10, i64 %343
%346 = load i32, i32* %345
%347 = sext i32 %346 to i64
%348 = getelementptr inbounds double, double* %4, i64 %347
%349 = load double, double* %348
%350 = getelementptr inbounds double, double* %13, i64 %343
store double %349, double* %350
%351 = add nuw nsw i64 %343, 1
%352 = add i64 %344, 1
%353 = icmp eq i64 %352, %232
br i1 %353, label %354, label %342
354: ; preds = %342, %339
br i1 %27, label %724, label %728
355: ; preds = %355, %234
%356 = phi i64 [ 0, %234 ], [ %385, %355 ]
%357 = phi i64 [ 0, %234 ], [ %386, %355 ]
%358 = getelementptr inbounds i32, i32* %10, i64 %356
%359 = load i32, i32* %358
%360 = sext i32 %359 to i64
%361 = getelementptr inbounds double, double* %4, i64 %360
%362 = load double, double* %361
%363 = getelementptr inbounds double, double* %13, i64 %356
store double %362, double* %363
%364 = or i64 %356, 1
%365 = getelementptr inbounds i32, i32* %10, i64 %364
%366 = load i32, i32* %365
%367 = sext i32 %366 to i64
%368 = getelementptr inbounds double, double* %4, i64 %367
%369 = load double, double* %368
%370 = getelementptr inbounds double, double* %13, i64 %364
store double %369, double* %370
%371 = or i64 %356, 2
%372 = getelementptr inbounds i32, i32* %10, i64 %371
%373 = load i32, i32* %372
%374 = sext i32 %373 to i64
%375 = getelementptr inbounds double, double* %4, i64 %374
%376 = load double, double* %375
%377 = getelementptr inbounds double, double* %13, i64 %371
store double %376, double* %377
%378 = or i64 %356, 3
%379 = getelementptr inbounds i32, i32* %10, i64 %378
%380 = load i32, i32* %379
%381 = sext i32 %380 to i64
%382 = getelementptr inbounds double, double* %4, i64 %381
%383 = load double, double* %382
%384 = getelementptr inbounds double, double* %13, i64 %378
store double %383, double* %384
%385 = add nuw nsw i64 %356, 4
%386 = add i64 %357, 4
%387 = icmp eq i64 %386, %235
br i1 %387, label %339, label %355
388: ; preds = %434, %43
%389 = phi i64 [ 0, %43 ], [ %435, %434 ]
%390 = getelementptr inbounds double, double* %4, i64 %389
%391 = load double, double* %390
br i1 %47, label %421, label %392
392: ; preds = %388, %392
%393 = phi i64 [ %418, %392 ], [ 0, %388 ]
%394 = phi i64 [ %419, %392 ], [ 0, %388 ]
%395 = getelementptr inbounds double*, double** %3, i64 %393
%396 = load double*, double** %395
%397 = getelementptr inbounds double, double* %396, i64 %389
%398 = load double, double* %397
%399 = fmul double %391, %398
store double %399, double* %397
%400 = or i64 %393, 1
%401 = getelementptr inbounds double*, double** %3, i64 %400
%402 = load double*, double** %401
%403 = getelementptr inbounds double, double* %402, i64 %389
%404 = load double, double* %403
%405 = fmul double %391, %404
store double %405, double* %403
%406 = or i64 %393, 2
%407 = getelementptr inbounds double*, double** %3, i64 %406
%408 = load double*, double** %407
%409 = getelementptr inbounds double, double* %408, i64 %389
%410 = load double, double* %409
%411 = fmul double %391, %410
store double %411, double* %409
%412 = or i64 %393, 3
%413 = getelementptr inbounds double*, double** %3, i64 %412
%414 = load double*, double** %413
%415 = getelementptr inbounds double, double* %414, i64 %389
%416 = load double, double* %415
%417 = fmul double %391, %416
store double %417, double* %415
%418 = add nuw nsw i64 %393, 4
%419 = add i64 %394, 4
%420 = icmp eq i64 %419, %48
br i1 %420, label %421, label %392
421: ; preds = %392, %388
%422 = phi i64 [ 0, %388 ], [ %418, %392 ]
br i1 %49, label %434, label %423
423: ; preds = %421, %423
%424 = phi i64 [ %431, %423 ], [ %422, %421 ]
%425 = phi i64 [ %432, %423 ], [ 0, %421 ]
%426 = getelementptr inbounds double*, double** %3, i64 %424
%427 = load double*, double** %426
%428 = getelementptr inbounds double, double* %427, i64 %389
%429 = load double, double* %428
%430 = fmul double %391, %429
store double %430, double* %428
%431 = add nuw nsw i64 %424, 1
%432 = add i64 %425, 1
%433 = icmp eq i64 %432, %46
br i1 %433, label %434, label %423
434: ; preds = %423, %421
%435 = add nuw nsw i64 %389, 1
%436 = icmp eq i64 %435, %44
br i1 %436, label %437, label %388
437: ; preds = %434
%438 = tail call i32 (i32, double*, i32*, ...) bitcast (i32 (...)* @sort to i32 (i32, double*, i32*, ...)*)(i32 %0, double* %4, i32* %10)
%439 = icmp sgt i32 %0, 1
br i1 %439, label %440, label %459
440: ; preds = %437
%441 = lshr i32 %0, 1
%442 = zext i32 %441 to i64
%443 = and i64 %442, 1
%444 = icmp eq i32 %441, 1
br i1 %444, label %447, label %445
445: ; preds = %440
%446 = and i64 %442, 2147483646
br label %473
447: ; preds = %473, %440
%448 = phi i64 [ 0, %440 ], [ %493, %473 ]
%449 = icmp eq i64 %443, 0
br i1 %449, label %459, label %450
450: ; preds = %447
%451 = getelementptr inbounds i32, i32* %10, i64 %448
%452 = load i32, i32* %451
%453 = trunc i64 %448 to i32
%454 = xor i32 %453, -1
%455 = add i32 %454, %0
%456 = sext i32 %455 to i64
%457 = getelementptr inbounds i32, i32* %10, i64 %456
%458 = load i32, i32* %457
store i32 %458, i32* %451
store i32 %452, i32* %457
br label %459
459: ; preds = %450, %447, %41, %437
%460 = icmp sgt i32 %1, 0
br i1 %460, label %461, label %499
461: ; preds = %459
%462 = zext i32 %1 to i64
%463 = zext i32 %0 to i64
%464 = add nsw i64 %463, -1
%465 = and i64 %463, 3
%466 = icmp ult i64 %464, 3
%467 = and i64 %463, 4294967292
%468 = icmp eq i64 %465, 0
%469 = and i64 %463, 3
%470 = icmp ult i64 %464, 3
%471 = and i64 %463, 4294967292
%472 = icmp eq i64 %469, 0
br label %496
473: ; preds = %473, %445
%474 = phi i64 [ 0, %445 ], [ %493, %473 ]
%475 = phi i64 [ 0, %445 ], [ %494, %473 ]
%476 = getelementptr inbounds i32, i32* %10, i64 %474
%477 = load i32, i32* %476
%478 = trunc i64 %474 to i32
%479 = xor i32 %478, -1
%480 = add i32 %479, %0
%481 = sext i32 %480 to i64
%482 = getelementptr inbounds i32, i32* %10, i64 %481
%483 = load i32, i32* %482
store i32 %483, i32* %476
store i32 %477, i32* %482
%484 = or i64 %474, 1
%485 = getelementptr inbounds i32, i32* %10, i64 %484
%486 = load i32, i32* %485
%487 = trunc i64 %484 to i32
%488 = xor i32 %487, -1
%489 = add i32 %488, %0
%490 = sext i32 %489 to i64
%491 = getelementptr inbounds i32, i32* %10, i64 %490
%492 = load i32, i32* %491
store i32 %492, i32* %485
store i32 %486, i32* %491
%493 = add nuw nsw i64 %474, 2
%494 = add i64 %475, 2
%495 = icmp eq i64 %494, %446
br i1 %495, label %447, label %473
496: ; preds = %461, %609
%497 = phi i64 [ 0, %461 ], [ %610, %609 ]
br i1 %40, label %498, label %609
498: ; preds = %496
br i1 %466, label %508, label %526
499: ; preds = %609, %459
br i1 %40, label %500, label %728
500: ; preds = %499
%501 = zext i32 %0 to i64
%502 = shl nuw nsw i64 %501, 3
%503 = add nsw i64 %501, -1
%504 = and i64 %501, 3
%505 = icmp ult i64 %503, 3
%506 = and i64 %501, 4294967292
%507 = icmp eq i64 %504, 0
br label %612
508: ; preds = %526, %498
%509 = phi i64 [ 0, %498 ], [ %564, %526 ]
br i1 %468, label %524, label %510
510: ; preds = %508, %510
%511 = phi i64 [ %521, %510 ], [ %509, %508 ]
%512 = phi i64 [ %522, %510 ], [ 0, %508 ]
%513 = getelementptr inbounds i32, i32* %10, i64 %511
%514 = load i32, i32* %513
%515 = sext i32 %514 to i64
%516 = getelementptr inbounds double*, double** %2, i64 %515
%517 = load double*, double** %516
%518 = getelementptr inbounds double, double* %517, i64 %497
%519 = load double, double* %518
%520 = getelementptr inbounds double, double* %13, i64 %511
store double %519, double* %520
%521 = add nuw nsw i64 %511, 1
%522 = add i64 %512, 1
%523 = icmp eq i64 %522, %465
br i1 %523, label %524, label %510
524: ; preds = %510, %508
br i1 %40, label %525, label %609
525: ; preds = %524
br i1 %470, label %596, label %567
526: ; preds = %498, %526
%527 = phi i64 [ %564, %526 ], [ 0, %498 ]
%528 = phi i64 [ %565, %526 ], [ 0, %498 ]
%529 = getelementptr inbounds i32, i32* %10, i64 %527
%530 = load i32, i32* %529
%531 = sext i32 %530 to i64
%532 = getelementptr inbounds double*, double** %2, i64 %531
%533 = load double*, double** %532
%534 = getelementptr inbounds double, double* %533, i64 %497
%535 = load double, double* %534
%536 = getelementptr inbounds double, double* %13, i64 %527
store double %535, double* %536
%537 = or i64 %527, 1
%538 = getelementptr inbounds i32, i32* %10, i64 %537
%539 = load i32, i32* %538
%540 = sext i32 %539 to i64
%541 = getelementptr inbounds double*, double** %2, i64 %540
%542 = load double*, double** %541
%543 = getelementptr inbounds double, double* %542, i64 %497
%544 = load double, double* %543
%545 = getelementptr inbounds double, double* %13, i64 %537
store double %544, double* %545
%546 = or i64 %527, 2
%547 = getelementptr inbounds i32, i32* %10, i64 %546
%548 = load i32, i32* %547
%549 = sext i32 %548 to i64
%550 = getelementptr inbounds double*, double** %2, i64 %549
%551 = load double*, double** %550
%552 = getelementptr inbounds double, double* %551, i64 %497
%553 = load double, double* %552
%554 = getelementptr inbounds double, double* %13, i64 %546
store double %553, double* %554
%555 = or i64 %527, 3
%556 = getelementptr inbounds i32, i32* %10, i64 %555
%557 = load i32, i32* %556
%558 = sext i32 %557 to i64
%559 = getelementptr inbounds double*, double** %2, i64 %558
%560 = load double*, double** %559
%561 = getelementptr inbounds double, double* %560, i64 %497
%562 = load double, double* %561
%563 = getelementptr inbounds double, double* %13, i64 %555
store double %562, double* %563
%564 = add nuw nsw i64 %527, 4
%565 = add i64 %528, 4
%566 = icmp eq i64 %565, %467
br i1 %566, label %508, label %526
567: ; preds = %525, %567
%568 = phi i64 [ %593, %567 ], [ 0, %525 ]
%569 = phi i64 [ %594, %567 ], [ 0, %525 ]
%570 = getelementptr inbounds double, double* %13, i64 %568
%571 = load double, double* %570
%572 = getelementptr inbounds double*, double** %2, i64 %568
%573 = load double*, double** %572
%574 = getelementptr inbounds double, double* %573, i64 %497
store double %571, double* %574
%575 = or i64 %568, 1
%576 = getelementptr inbounds double, double* %13, i64 %575
%577 = load double, double* %576
%578 = getelementptr inbounds double*, double** %2, i64 %575
%579 = load double*, double** %578
%580 = getelementptr inbounds double, double* %579, i64 %497
store double %577, double* %580
%581 = or i64 %568, 2
%582 = getelementptr inbounds double, double* %13, i64 %581
%583 = load double, double* %582
%584 = getelementptr inbounds double*, double** %2, i64 %581
%585 = load double*, double** %584
%586 = getelementptr inbounds double, double* %585, i64 %497
store double %583, double* %586
%587 = or i64 %568, 3
%588 = getelementptr inbounds double, double* %13, i64 %587
%589 = load double, double* %588
%590 = getelementptr inbounds double*, double** %2, i64 %587
%591 = load double*, double** %590
%592 = getelementptr inbounds double, double* %591, i64 %497
store double %589, double* %592
%593 = add nuw nsw i64 %568, 4
%594 = add i64 %569, 4
%595 = icmp eq i64 %594, %471
br i1 %595, label %596, label %567
596: ; preds = %567, %525
%597 = phi i64 [ 0, %525 ], [ %593, %567 ]
br i1 %472, label %609, label %598
598: ; preds = %596, %598
%599 = phi i64 [ %606, %598 ], [ %597, %596 ]
%600 = phi i64 [ %607, %598 ], [ 0, %596 ]
%601 = getelementptr inbounds double, double* %13, i64 %599
%602 = load double, double* %601
%603 = getelementptr inbounds double*, double** %2, i64 %599
%604 = load double*, double** %603
%605 = getelementptr inbounds double, double* %604, i64 %497
store double %602, double* %605
%606 = add nuw nsw i64 %599, 1
%607 = add i64 %600, 1
%608 = icmp eq i64 %607, %469
br i1 %608, label %609, label %598
609: ; preds = %596, %598, %496, %524
%610 = add nuw nsw i64 %497, 1
%611 = icmp eq i64 %610, %462
br i1 %611, label %499, label %496
612: ; preds = %669, %500
%613 = phi i64 [ 0, %500 ], [ %673, %669 ]
%614 = getelementptr inbounds double*, double** %3, i64 %613
%615 = load double*, double** %614
br i1 %505, label %655, label %622
616: ; preds = %669
br i1 %40, label %617, label %728
617: ; preds = %616
%618 = and i64 %501, 3
%619 = icmp ult i64 %503, 3
br i1 %619, label %675, label %620
620: ; preds = %617
%621 = and i64 %501, 4294967292
br label %691
622: ; preds = %612, %622
%623 = phi i64 [ %652, %622 ], [ 0, %612 ]
%624 = phi i64 [ %653, %622 ], [ 0, %612 ]
%625 = getelementptr inbounds i32, i32* %10, i64 %623
%626 = load i32, i32* %625
%627 = sext i32 %626 to i64
%628 = getelementptr inbounds double, double* %615, i64 %627
%629 = load double, double* %628
%630 = getelementptr inbounds double, double* %13, i64 %623
store double %629, double* %630
%631 = or i64 %623, 1
%632 = getelementptr inbounds i32, i32* %10, i64 %631
%633 = load i32, i32* %632
%634 = sext i32 %633 to i64
%635 = getelementptr inbounds double, double* %615, i64 %634
%636 = load double, double* %635
%637 = getelementptr inbounds double, double* %13, i64 %631
store double %636, double* %637
%638 = or i64 %623, 2
%639 = getelementptr inbounds i32, i32* %10, i64 %638
%640 = load i32, i32* %639
%641 = sext i32 %640 to i64
%642 = getelementptr inbounds double, double* %615, i64 %641
%643 = load double, double* %642
%644 = getelementptr inbounds double, double* %13, i64 %638
store double %643, double* %644
%645 = or i64 %623, 3
%646 = getelementptr inbounds i32, i32* %10, i64 %645
%647 = load i32, i32* %646
%648 = sext i32 %647 to i64
%649 = getelementptr inbounds double, double* %615, i64 %648
%650 = load double, double* %649
%651 = getelementptr inbounds double, double* %13, i64 %645
store double %650, double* %651
%652 = add nuw nsw i64 %623, 4
%653 = add i64 %624, 4
%654 = icmp eq i64 %653, %506
br i1 %654, label %655, label %622
655: ; preds = %622, %612
%656 = phi i64 [ 0, %612 ], [ %652, %622 ]
br i1 %507, label %669, label %657
657: ; preds = %655, %657
%658 = phi i64 [ %666, %657 ], [ %656, %655 ]
%659 = phi i64 [ %667, %657 ], [ 0, %655 ]
%660 = getelementptr inbounds i32, i32* %10, i64 %658
%661 = load i32, i32* %660
%662 = sext i32 %661 to i64
%663 = getelementptr inbounds double, double* %615, i64 %662
%664 = load double, double* %663
%665 = getelementptr inbounds double, double* %13, i64 %658
store double %664, double* %665
%666 = add nuw nsw i64 %658, 1
%667 = add i64 %659, 1
%668 = icmp eq i64 %667, %504
br i1 %668, label %669, label %657
669: ; preds = %657, %655
%670 = getelementptr inbounds double*, double** %3, i64 %613
%671 = bitcast double** %670 to i8**
%672 = load i8*, i8** %671
%673 = add nuw nsw i64 %613, 1
%674 = icmp eq i64 %673, %501
br i1 %674, label %616, label %612
675: ; preds = %691, %617
%676 = phi i64 [ 0, %617 ], [ %721, %691 ]
%677 = icmp eq i64 %618, 0
br i1 %677, label %690, label %678
678: ; preds = %675, %678
%679 = phi i64 [ %687, %678 ], [ %676, %675 ]
%680 = phi i64 [ %688, %678 ], [ 0, %675 ]
%681 = getelementptr inbounds i32, i32* %10, i64 %679
%682 = load i32, i32* %681
%683 = sext i32 %682 to i64
%684 = getelementptr inbounds double, double* %4, i64 %683
%685 = load double, double* %684
%686 = getelementptr inbounds double, double* %13, i64 %679
store double %685, double* %686
%687 = add nuw nsw i64 %679, 1
%688 = add i64 %680, 1
%689 = icmp eq i64 %688, %618
br i1 %689, label %690, label %678
690: ; preds = %678, %675
br i1 %40, label %724, label %728
691: ; preds = %691, %620
%692 = phi i64 [ 0, %620 ], [ %721, %691 ]
%693 = phi i64 [ 0, %620 ], [ %722, %691 ]
%694 = getelementptr inbounds i32, i32* %10, i64 %692
%695 = load i32, i32* %694
%696 = sext i32 %695 to i64
%697 = getelementptr inbounds double, double* %4, i64 %696
%698 = load double, double* %697
%699 = getelementptr inbounds double, double* %13, i64 %692
store double %698, double* %699
%700 = or i64 %692, 1
%701 = getelementptr inbounds i32, i32* %10, i64 %700
%702 = load i32, i32* %701
%703 = sext i32 %702 to i64
%704 = getelementptr inbounds double, double* %4, i64 %703
%705 = load double, double* %704
%706 = getelementptr inbounds double, double* %13, i64 %700
store double %705, double* %706
%707 = or i64 %692, 2
%708 = getelementptr inbounds i32, i32* %10, i64 %707
%709 = load i32, i32* %708
%710 = sext i32 %709 to i64
%711 = getelementptr inbounds double, double* %4, i64 %710
%712 = load double, double* %711
%713 = getelementptr inbounds double, double* %13, i64 %707
store double %712, double* %713
%714 = or i64 %692, 3
%715 = getelementptr inbounds i32, i32* %10, i64 %714
%716 = load i32, i32* %715
%717 = sext i32 %716 to i64
%718 = getelementptr inbounds double, double* %4, i64 %717
%719 = load double, double* %718
%720 = getelementptr inbounds double, double* %13, i64 %714
store double %719, double* %720
%721 = add nuw nsw i64 %692, 4
%722 = add i64 %693, 4
%723 = icmp eq i64 %722, %621
br i1 %723, label %675, label %691
724: ; preds = %690, %354
%725 = phi i32 [ %1, %354 ], [ %0, %690 ]
%726 = zext i32 %725 to i64
%727 = shl nuw nsw i64 %726, 3
br label %728
728: ; preds = %724, %499, %616, %161, %230, %354, %690, %21
tail call void @free(i8* %9)
tail call void @free(i8* %12)
br label %729
729: ; preds = %19, %20, %728
%730 = phi i32 [ %22, %728 ], [ -1, %20 ], [ -1, %19 ]
ret i32 %730
}