void sor(double omg, double dx, double dy, int imax, int jmax, double **P,
         double **RS, double *res, int **Flag) {
  int i, j;
  double rloc;
  double coeff = omg / (2.0 * (1.0 / (dx * dx) + 1.0 / (dy * dy)));
  int fluid_cells_count = 0;
  for (i = 1; i < imax + 1; i++) {
    for (j = 1; j < jmax + 1; j++) {
      P[i][j] = (1.0 - omg) * P[i][j] +
                coeff * ((P[i + 1][j] + P[i - 1][j]) / (dx * dx) +
                         (P[i][j + 1] + P[i][j - 1]) / (dy * dy) - RS[i][j]);
    }
  }
  rloc = 0;
  for (i = 0; i <= imax; i++) {
    for (j = 0; j <= jmax; j++) {
      if (Flag[i][j] & 0x10) {
        rloc += ((P[i + 1][j] - 2.0 * P[i][j] + P[i - 1][j]) / (dx * dx) +
                 (P[i][j + 1] - 2.0 * P[i][j] + P[i][j - 1]) / (dy * dy) -
                 RS[i][j]) *
                ((P[i + 1][j] - 2.0 * P[i][j] + P[i - 1][j]) / (dx * dx) +
                 (P[i][j + 1] - 2.0 * P[i][j] + P[i][j - 1]) / (dy * dy) -
                 RS[i][j]);
        fluid_cells_count++;
      }
    }
  }
  rloc = rloc / (fluid_cells_count);
  rloc = sqrt(rloc);
  *res = rloc;
  for (i = 0; i <= imax + 1; i++) {
    P[i][0] = P[i][1];
    P[i][jmax + 1] = P[i][jmax];
  }
  for (j = 0; j <= jmax + 1; j++) {
    P[0][j] = P[1][j];
    P[imax + 1][j] = P[imax][j];
  }
  for (i = 1; i < imax + 1; i++) {
    for (j = 1; j < jmax + 1; j++) {
      if (Flag[i][j] == 0x08) {
        P[i][j] = P[i + 1][j];
      } else if (Flag[i][j] == 0x01) {
        P[i][j] = P[i][j + 1];
      } else if (Flag[i][j] == 0x04) {
        P[i][j] = P[i - 1][j];
      } else if (Flag[i][j] == 0x02) {
        P[i][j] = P[i][j - 1];
      } else if (Flag[i][j] == 0x09) {
        P[i][j] = (P[i][j + 1] + P[i + 1][j]) / 2;
      } else if (Flag[i][j] == 0x05) {
        P[i][j] = (P[i][j + 1] + P[i - 1][j]) / 2;
      } else if (Flag[i][j] == 0x0A) {
        P[i][j] = (P[i][j - 1] + P[i + 1][j]) / 2;
      } else if (Flag[i][j] == 0x06) {
        P[i][j] = (P[i][j - 1] + P[i - 1][j]) / 2;
      }
    }
  }
}


x86 assembly (clang, -O0):
<sor>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
mov    %edi,-0x1c(%rbp)
mov    %esi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    %r8,-0x38(%rbp)
mov    %r9,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
mulsd  -0x10(%rbp),%xmm1
movsd  0xeb4(%rip),%xmm2
divsd  %xmm1,%xmm2
movsd  -0x18(%rbp),%xmm3
mulsd  -0x18(%rbp),%xmm3
movsd  0xe9e(%rip),%xmm1
divsd  %xmm3,%xmm1
addsd  %xmm1,%xmm2
movsd  0xe86(%rip),%xmm1
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movl   $0x0,-0x5c(%rbp)
movl   $0x1,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    12c4 <sor+0x1b4>
movl   $0x1,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    12b1 <sor+0x1a1>
movsd  0xe42(%rip),%xmm0
subsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x58(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm3
movsd  -0x10(%rbp),%xmm4
mulsd  -0x10(%rbp),%xmm4
divsd  %xmm4,%xmm3
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm4
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm4
movsd  -0x18(%rbp),%xmm5
mulsd  -0x18(%rbp),%xmm5
divsd  %xmm5,%xmm4
addsd  %xmm4,%xmm3
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    11ad <sor+0x9d>
jmp    12b6 <sor+0x1a6>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1195 <sor+0x85>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jg     1500 <sor+0x3f0>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x20(%rbp),%eax
jg     14ed <sor+0x3dd>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     14da <sor+0x3ca>
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  -0x10(%rbp),%xmm1
mulsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
addsd  %xmm2,%xmm2
subsd  %xmm2,%xmm1
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm1
movsd  -0x18(%rbp),%xmm2
mulsd  -0x18(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm2
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm2
movsd  -0x10(%rbp),%xmm1
mulsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm2
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
addsd  %xmm3,%xmm3
subsd  %xmm3,%xmm1
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm1
movsd  -0x18(%rbp),%xmm3
mulsd  -0x18(%rbp),%xmm3
divsd  %xmm3,%xmm1
addsd  %xmm1,%xmm2
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    14df <sor+0x3cf>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    12e6 <sor+0x1d6>
jmp    14f2 <sor+0x3e2>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    12d3 <sor+0x1c3>
movsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x5c(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     15a5 <sor+0x495>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1536 <sor+0x426>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     161b <sor+0x50b>
mov    -0x28(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    15ac <sor+0x49c>
movl   $0x1,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1997 <sor+0x887>
movl   $0x1,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1984 <sor+0x874>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x8,(%rax,%rcx,4)
jne    1699 <sor+0x589>
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1971 <sor+0x861>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    16e7 <sor+0x5d7>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    196c <sor+0x85c>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x4,(%rax,%rcx,4)
jne    1735 <sor+0x625>
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1967 <sor+0x857>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x2,(%rax,%rcx,4)
jne    1783 <sor+0x673>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1962 <sor+0x852>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x9,(%rax,%rcx,4)
jne    17f7 <sor+0x6e7>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  0x827(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    195d <sor+0x84d>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x5,(%rax,%rcx,4)
jne    186b <sor+0x75b>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  0x7b3(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1958 <sor+0x848>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0xa,(%rax,%rcx,4)
jne    18df <sor+0x7cf>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  0x73f(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1953 <sor+0x843>
mov    -0x40(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x6,(%rax,%rcx,4)
jne    194e <sor+0x83e>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  0x6cb(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1953 <sor+0x843>
jmp    1958 <sor+0x848>
jmp    195d <sor+0x84d>
jmp    1962 <sor+0x852>
jmp    1967 <sor+0x857>
jmp    196c <sor+0x85c>
jmp    1971 <sor+0x861>
jmp    1976 <sor+0x866>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    163a <sor+0x52a>
jmp    1989 <sor+0x879>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1622 <sor+0x512>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sor>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r9,0x28(%rsp)
mov    %r8,0x20(%rsp)
mov    %rdx,%r14
mov    %esi,%r15d
unpcklpd %xmm2,%xmm1
mulpd  %xmm1,%xmm1
test   %edi,%edi
jle    1222 <sor+0x112>
movsd  0xeba(%rip),%xmm2
movapd %xmm2,%xmm3
divsd  %xmm1,%xmm3
movapd %xmm1,%xmm4
unpckhpd %xmm1,%xmm4
movapd %xmm2,%xmm5
divsd  %xmm4,%xmm5
addsd  %xmm3,%xmm5
addsd  %xmm5,%xmm5
subsd  %xmm0,%xmm2
divsd  %xmm5,%xmm0
lea    0x1(%r15),%r9d
lea    0x1(%rdi),%r11d
mov    $0x1,%edx
jmp    1190 <sor+0x80>
nopl   (%rax)
add    $0x1,%rdx
mov    %rdx,%r8
cmp    %r11,%r8
je     1226 <sor+0x116>
test   %r15d,%r15d
jle    1180 <sor+0x70>
mov    -0x8(%r14,%rdx,8),%r10
mov    (%r14,%rdx,8),%rsi
lea    0x1(%rdx),%r8
mov    %r8d,%ebp
mov    (%r14,%rbp,8),%rbp
mov    (%rcx,%rdx,8),%rbx
movsd  (%rsi),%xmm3
movsd  0x8(%rsi),%xmm4
mov    $0x1,%edx
nopl   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm4
movsd  0x8(%rsi,%rdx,8),%xmm5
movsd  0x0(%rbp,%rdx,8),%xmm6
unpcklpd %xmm5,%xmm6
movsd  (%r10,%rdx,8),%xmm7
unpcklpd %xmm3,%xmm7
addpd  %xmm6,%xmm7
divpd  %xmm1,%xmm7
movapd %xmm7,%xmm3
unpckhpd %xmm7,%xmm3
addsd  %xmm7,%xmm3
subsd  (%rbx,%rdx,8),%xmm3
mulsd  %xmm0,%xmm3
addsd  %xmm4,%xmm3
movsd  %xmm3,(%rsi,%rdx,8)
lea    0x1(%rdx),%rax
movapd %xmm5,%xmm4
mov    %rax,%rdx
cmp    %rax,%r9
jne    11c0 <sor+0xb0>
mov    %r8,%rdx
cmp    %r11,%r8
jne    1190 <sor+0x80>
jmp    1226 <sor+0x116>
lea    0x1(%rdi),%r11d
xorpd  %xmm2,%xmm2
mov    %r11,0x18(%rsp)
mov    %r11d,%eax
mov    %rax,0x30(%rsp)
mov    %rdi,0x10(%rsp)
test   %edi,%edi
js     131e <sor+0x20e>
lea    0x1(%r15),%r10d
xorpd  %xmm0,%xmm0
xor    %esi,%esi
xor    %r11d,%r11d
jmp    1272 <sor+0x162>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rsi
mov    %rsi,%r8
cmp    0x30(%rsp),%r8
je     1325 <sor+0x215>
test   %r15d,%r15d
js     1260 <sor+0x150>
mov    0x28(%rsp),%rax
mov    (%rax,%rsi,8),%rbp
lea    0x1(%rsi),%r8
mov    %r8d,%r9d
xor    %ebx,%ebx
jmp    12fe <sor+0x1ee>
nopl   0x0(%rax,%rax,1)
mov    (%r14,%r9,8),%rax
mov    -0x8(%r14,%rsi,8),%rdx
mov    (%r14,%rsi,8),%r12
movsd  (%r12,%rbx,8),%xmm3
lea    0x1(%rbx),%rdi
mov    %edi,%r13d
movsd  (%rax,%rbx,8),%xmm4
movhpd (%r12,%r13,8),%xmm4
addsd  %xmm3,%xmm3
unpcklpd %xmm3,%xmm3
movsd  (%rdx,%rbx,8),%xmm5
movhpd -0x8(%r12,%rbx,8),%xmm5
subpd  %xmm3,%xmm4
addpd  %xmm4,%xmm5
divpd  %xmm1,%xmm5
movapd %xmm5,%xmm3
unpckhpd %xmm5,%xmm3
addsd  %xmm5,%xmm3
mov    (%rcx,%rsi,8),%rax
subsd  (%rax,%rbx,8),%xmm3
mulsd  %xmm3,%xmm3
addsd  %xmm3,%xmm0
add    $0x1,%r11d
mov    %rdi,%rbx
cmp    %r10,%rbx
je     130e <sor+0x1fe>
testb  $0x10,0x0(%rbp,%rbx,4)
jne    1290 <sor+0x180>
add    $0x1,%rbx
cmp    %r10,%rbx
jne    12fe <sor+0x1ee>
mov    %r8,%rsi
cmp    0x30(%rsp),%r8
jne    1272 <sor+0x162>
jmp    1325 <sor+0x215>
xor    %r11d,%r11d
xorpd  %xmm0,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r11d,%xmm1
divsd  %xmm1,%xmm0
ucomisd %xmm2,%xmm0
jb     133d <sor+0x22d>
sqrtsd %xmm0,%xmm0
jmp    1342 <sor+0x232>
call   1030 <sqrt@plt>
mov    0x10(%rsp),%r10
mov    0x18(%rsp),%rbx
mov    0x20(%rsp),%rax
movsd  %xmm0,(%rax)
cmp    $0xffffffff,%r10d
jl     13eb <sor+0x2db>
lea    0x1(%r15),%ecx
xor    %edx,%edx
test   %ebx,%ebx
mov    $0x0,%esi
cmovg  %ebx,%esi
add    $0x1,%esi
movslq %r15d,%rax
movslq %ecx,%rcx
test   %ebx,%ebx
jle    13ce <sor+0x2be>
mov    %esi,%edi
and    $0xfffffffe,%edi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%r14,%rdx,8),%rbp
movsd  0x8(%rbp),%xmm0
movsd  %xmm0,0x0(%rbp)
movsd  0x0(%rbp,%rax,8),%xmm0
movsd  %xmm0,0x0(%rbp,%rcx,8)
mov    0x8(%r14,%rdx,8),%rbp
movsd  0x8(%rbp),%xmm0
movsd  %xmm0,0x0(%rbp)
movsd  0x0(%rbp,%rax,8),%xmm0
movsd  %xmm0,0x0(%rbp,%rcx,8)
add    $0x2,%rdx
cmp    %rdx,%rdi
jne    1390 <sor+0x280>
test   $0x1,%sil
je     13eb <sor+0x2db>
mov    (%r14,%rdx,8),%rdx
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,(%rdx)
movsd  (%rdx,%rax,8),%xmm0
movsd  %xmm0,(%rdx,%rcx,8)
cmp    $0xffffffff,%r15d
jl     15d5 <sor+0x4c5>
mov    (%r14),%rax
mov    0x8(%r14),%rcx
movslq %r10d,%rdx
mov    (%r14,%rdx,8),%rdx
movslq %ebx,%rsi
mov    (%r14,%rsi,8),%rsi
lea    0x2(%r15),%r8d
cmp    $0x4,%r8d
jae    141b <sor+0x30b>
xor    %edi,%edi
jmp    1574 <sor+0x464>
lea    (%rax,%r8,8),%rdi
lea    (%rsi,%r8,8),%rbp
lea    (%rcx,%r8,8),%rbx
lea    (%rdx,%r8,8),%r11
cmp    %rbp,%rax
setb   0x18(%rsp)
cmp    %rdi,%rsi
setb   %r12b
cmp    %rbx,%rax
setb   %r13b
cmp    %rdi,%rcx
setb   0x20(%rsp)
cmp    %r11,%rax
setb   %r9b
cmp    %rdi,%rdx
setb   0xf(%rsp)
cmp    %rbx,%rsi
setb   %r10b
cmp    %rbp,%rcx
setb   %bl
cmp    %r11,%rsi
setb   %r11b
cmp    %rbp,%rdx
setb   %bpl
xor    %edi,%edi
test   %r12b,0x18(%rsp)
jne    156f <sor+0x45f>
and    0x20(%rsp),%r13b
jne    156f <sor+0x45f>
and    0xf(%rsp),%r9b
jne    156f <sor+0x45f>
and    %bl,%r10b
jne    156f <sor+0x45f>
and    %bpl,%r11b
mov    0x10(%rsp),%r10
jne    1574 <sor+0x464>
mov    %r8d,%edi
and    $0xfffffffc,%edi
lea    -0x4(%rdi),%rbp
mov    %rbp,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rbp,%rbp
je     1701 <sor+0x5f1>
mov    %r9,%rbx
and    $0xfffffffffffffffe,%rbx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups (%rcx,%rbp,8),%xmm0
movups 0x10(%rcx,%rbp,8),%xmm1
movups %xmm0,(%rax,%rbp,8)
movups %xmm1,0x10(%rax,%rbp,8)
movups (%rdx,%rbp,8),%xmm0
movups 0x10(%rdx,%rbp,8),%xmm1
movups %xmm0,(%rsi,%rbp,8)
movups %xmm1,0x10(%rsi,%rbp,8)
movups 0x20(%rcx,%rbp,8),%xmm0
movups 0x30(%rcx,%rbp,8),%xmm1
movups %xmm0,0x20(%rax,%rbp,8)
movups %xmm1,0x30(%rax,%rbp,8)
movupd 0x20(%rdx,%rbp,8),%xmm0
movupd 0x30(%rdx,%rbp,8),%xmm1
movupd %xmm0,0x20(%rsi,%rbp,8)
movupd %xmm1,0x30(%rsi,%rbp,8)
add    $0x8,%rbp
add    $0xfffffffffffffffe,%rbx
jne    14e0 <sor+0x3d0>
test   $0x1,%r9b
je     1568 <sor+0x458>
movups (%rcx,%rbp,8),%xmm0
movups 0x10(%rcx,%rbp,8),%xmm1
movups %xmm0,(%rax,%rbp,8)
movups %xmm1,0x10(%rax,%rbp,8)
movupd (%rdx,%rbp,8),%xmm0
movupd 0x10(%rdx,%rbp,8),%xmm1
movupd %xmm0,(%rsi,%rbp,8)
movupd %xmm1,0x10(%rsi,%rbp,8)
cmp    %r8,%rdi
jne    1574 <sor+0x464>
jmp    15d5 <sor+0x4c5>
mov    0x10(%rsp),%r10
mov    %rdi,%rbp
not    %rbp
test   $0x1,%r8b
je     1598 <sor+0x488>
movsd  (%rcx,%rdi,8),%xmm0
movsd  %xmm0,(%rax,%rdi,8)
movsd  (%rdx,%rdi,8),%xmm0
movsd  %xmm0,(%rsi,%rdi,8)
or     $0x1,%rdi
add    %r8,%rbp
je     15d5 <sor+0x4c5>
nopl   (%rax)
movsd  (%rcx,%rdi,8),%xmm0
movsd  %xmm0,(%rax,%rdi,8)
movsd  (%rdx,%rdi,8),%xmm0
movsd  %xmm0,(%rsi,%rdi,8)
movsd  0x8(%rcx,%rdi,8),%xmm0
movsd  %xmm0,0x8(%rax,%rdi,8)
movsd  0x8(%rdx,%rdi,8),%xmm0
movsd  %xmm0,0x8(%rsi,%rdi,8)
add    $0x2,%rdi
cmp    %rdi,%r8
jne    15a0 <sor+0x490>
test   %r10d,%r10d
jle    16f2 <sor+0x5e2>
lea    0x1(%r15),%eax
lea    -0x4(,%rax,4),%rax
ff
mov    $0x1,%ecx
lea    0xa1a(%rip),%rdx
movsd  0xa0a(%rip),%xmm0
jmp    160e <sor+0x4fe>
mov    %r8,%rcx
cmp    0x30(%rsp),%r8
je     16f2 <sor+0x5e2>
test   %r15d,%r15d
jle    16e0 <sor+0x5d0>
mov    0x28(%rsp),%rsi
mov    (%rsi,%rcx,8),%rdi
lea    0x1(%rcx),%r8
mov    %r8d,%r9d
xor    %esi,%esi
jmp    1652 <sor+0x542>
mov    -0x8(%r14,%rcx,8),%rbp
mov    (%r14,%rcx,8),%rbx
movsd  (%rbx,%rsi,2),%xmm1
addsd  0x8(%rbp,%rsi,2),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rbx,%rsi,2)
add    $0x4,%rsi
cmp    %rsi,%rax
je     1600 <sor+0x4f0>
mov    0x4(%rdi,%rsi,1),%ebx
add    $0xffffffff,%ebx
cmp    $0x9,%ebx
ja     1649 <sor+0x539>
movslq (%rdx,%rbx,4),%rbx
add    %rdx,%rbx
jmp    *%rbx
mov    (%r14,%rcx,8),%rbx
movsd  0x10(%rbx,%rsi,2),%xmm1
jmp    1643 <sor+0x533>
mov    (%r14,%rcx,8),%rbx
movsd  (%rbx,%rsi,2),%xmm1
jmp    1643 <sor+0x533>
mov    -0x8(%r14,%rcx,8),%rbp
mov    (%r14,%rcx,8),%rbx
movsd  0x8(%rbp,%rsi,2),%xmm1
jmp    1643 <sor+0x533>
mov    -0x8(%r14,%rcx,8),%rbp
mov    (%r14,%rcx,8),%rbx
movsd  0x10(%rbx,%rsi,2),%xmm1
jmp    1639 <sor+0x529>
mov    (%r14,%r9,8),%rbx
movsd  0x8(%rbx,%rsi,2),%xmm1
mov    (%r14,%rcx,8),%rbx
jmp    1643 <sor+0x533>
mov    (%r14,%rcx,8),%rbx
movsd  0x10(%rbx,%rsi,2),%xmm1
mov    (%r14,%r9,8),%rbp
jmp    1639 <sor+0x529>
mov    (%r14,%rcx,8),%rbx
movsd  (%rbx,%rsi,2),%xmm1
mov    (%r14,%r9,8),%rbp
jmp    1639 <sor+0x529>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%rcx
mov    %rcx,%r8
cmp    0x30(%rsp),%r8
jne    160e <sor+0x4fe>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebp,%ebp
test   $0x1,%r9b
jne    1540 <sor+0x430>
jmp    1568 <sor+0x458>

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

LLVM IR (-O2):
define void @sor(double %0, double %1, double %2, i32 %3, i32 %4, double** %5, double** nocapture %6, double* nocapture writeonly %7, i32** nocapture %8) {
%10 = insertelement <2 x double> poison, double %1, i64 0
%11 = insertelement <2 x double> %10, double %2, i64 1
%12 = fmul <2 x double> %11, %11
%13 = extractelement <2 x double> %12, i64 0
%14 = fdiv double 1.000000e+00, %13
%15 = extractelement <2 x double> %12, i64 1
%16 = fdiv double 1.000000e+00, %15
%17 = fadd double %14, %16
%18 = fmul double %17, 2.000000e+00
%19 = fdiv double %0, %18
%20 = icmp slt i32 %3, 1
br i1 %20, label %21, label %23
21: ; preds = %9
%22 = add nsw i32 %3, 1
br label %49
23: ; preds = %9
%24 = icmp slt i32 %4, 1
%25 = fsub double 1.000000e+00, %0
%26 = add i32 %4, 1
%27 = add nuw i32 %3, 1
%28 = zext i32 %27 to i64
%29 = zext i32 %26 to i64
br label %30
30: ; preds = %23, %84
%31 = phi i64 [ 1, %23 ], [ %85, %84 ]
br i1 %24, label %32, label %34
32: ; preds = %30
%33 = add nuw nsw i64 %31, 1
br label %84
34: ; preds = %30
%35 = getelementptr inbounds double*, double** %5, i64 %31
%36 = load double*, double** %35
%37 = add nuw nsw i64 %31, 1
%38 = and i64 %37, 4294967295
%39 = getelementptr inbounds double*, double** %5, i64 %38
%40 = load double*, double** %39
%41 = add nsw i64 %31, -1
%42 = getelementptr inbounds double*, double** %5, i64 %41
%43 = load double*, double** %42
%44 = getelementptr inbounds double*, double** %6, i64 %31
%45 = load double*, double** %44
%46 = getelementptr inbounds double, double* %36, i64 1
%47 = load double, double* %46
%48 = load double, double* %36
br label %57
49: ; preds = %84, %21
%50 = phi i32 [ %22, %21 ], [ %27, %84 ]
%51 = icmp slt i32 %3, 0
br i1 %51, label %158, label %52
52: ; preds = %49
%53 = icmp slt i32 %4, 0
%54 = add i32 %4, 1
%55 = zext i32 %50 to i64
%56 = zext i32 %54 to i64
br label %87
57: ; preds = %34, %57
%58 = phi double [ %48, %34 ], [ %82, %57 ]
%59 = phi double [ %47, %34 ], [ %68, %57 ]
%60 = phi i64 [ 1, %34 ], [ %66, %57 ]
%61 = getelementptr inbounds double, double* %36, i64 %60
%62 = getelementptr inbounds double, double* %40, i64 %60
%63 = load double, double* %62
%64 = getelementptr inbounds double, double* %43, i64 %60
%65 = load double, double* %64
%66 = add nuw nsw i64 %60, 1
%67 = getelementptr inbounds double, double* %36, i64 %66
%68 = load double, double* %67
%69 = insertelement <2 x double> poison, double %63, i64 0
%70 = insertelement <2 x double> %69, double %68, i64 1
%71 = insertelement <2 x double> poison, double %65, i64 0
%72 = insertelement <2 x double> %71, double %58, i64 1
%73 = fadd <2 x double> %70, %72
%74 = fdiv <2 x double> %73, %12
%75 = shufflevector <2 x double> %74, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%76 = fadd <2 x double> %74, %75
%77 = extractelement <2 x double> %76, i64 0
%78 = getelementptr inbounds double, double* %45, i64 %60
%79 = load double, double* %78
%80 = fsub double %77, %79
%81 = fmul double %19, %80
%82 = tail call double @llvm.fmuladd.f64(double %25, double %59, double %81)
store double %82, double* %61
%83 = icmp eq i64 %66, %29
br i1 %83, label %84, label %57
84: ; preds = %57, %32
%85 = phi i64 [ %33, %32 ], [ %37, %57 ]
%86 = icmp eq i64 %85, %28
br i1 %86, label %49, label %30
87: ; preds = %52, %153
%88 = phi i64 [ 0, %52 ], [ %154, %153 ]
%89 = phi i32 [ 0, %52 ], [ %156, %153 ]
%90 = phi double [ 0.000000e+00, %52 ], [ %155, %153 ]
br i1 %53, label %91, label %93
91: ; preds = %87
%92 = add nuw nsw i64 %88, 1
br label %153
93: ; preds = %87
%94 = getelementptr inbounds i32*, i32** %8, i64 %88
%95 = load i32*, i32** %94
%96 = add nuw nsw i64 %88, 1
%97 = and i64 %96, 4294967295
%98 = getelementptr inbounds double*, double** %5, i64 %97
%99 = getelementptr inbounds double*, double** %5, i64 %88
%100 = add nsw i64 %88, -1
%101 = getelementptr inbounds double*, double** %5, i64 %100
%102 = getelementptr inbounds double*, double** %6, i64 %88
br label %103
103: ; preds = %93, %148
%104 = phi i64 [ 0, %93 ], [ %149, %148 ]
%105 = phi i32 [ %89, %93 ], [ %151, %148 ]
%106 = phi double [ %90, %93 ], [ %150, %148 ]
%107 = getelementptr inbounds i32, i32* %95, i64 %104
%108 = load i32, i32* %107
%109 = and i32 %108, 16
%110 = icmp eq i32 %109, 0
br i1 %110, label %111, label %113
111: ; preds = %103
%112 = add nuw nsw i64 %104, 1
br label %148
113: ; preds = %103
%114 = load double*, double** %98
%115 = getelementptr inbounds double, double* %114, i64 %104
%116 = load double, double* %115
%117 = load double*, double** %99
%118 = getelementptr inbounds double, double* %117, i64 %104
%119 = load double, double* %118
%120 = load double*, double** %101
%121 = getelementptr inbounds double, double* %120, i64 %104
%122 = load double, double* %121
%123 = add nuw nsw i64 %104, 1
%124 = and i64 %123, 4294967295
%125 = getelementptr inbounds double, double* %117, i64 %124
%126 = load double, double* %125
%127 = insertelement <2 x double> poison, double %119, i64 0
%128 = shufflevector <2 x double> %127, <2 x double> poison, <2 x i32> zeroinitializer
%129 = insertelement <2 x double> poison, double %116, i64 0
%130 = insertelement <2 x double> %129, double %126, i64 1
%131 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %128, <2 x double> <double -2.000000e+00, double -2.000000e+00>, <2 x double> %130)
%132 = add nsw i64 %104, -1
%133 = getelementptr inbounds double, double* %117, i64 %132
%134 = load double, double* %133
%135 = insertelement <2 x double> poison, double %122, i64 0
%136 = insertelement <2 x double> %135, double %134, i64 1
%137 = fadd <2 x double> %131, %136
%138 = fdiv <2 x double> %137, %12
%139 = shufflevector <2 x double> %138, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%140 = fadd <2 x double> %138, %139
%141 = extractelement <2 x double> %140, i64 0
%142 = load double*, double** %102
%143 = getelementptr inbounds double, double* %142, i64 %104
%144 = load double, double* %143
%145 = fsub double %141, %144
%146 = tail call double @llvm.fmuladd.f64(double %145, double %145, double %106)
%147 = add nsw i32 %105, 1
br label %148
148: ; preds = %111, %113
%149 = phi i64 [ %112, %111 ], [ %123, %113 ]
%150 = phi double [ %106, %111 ], [ %146, %113 ]
%151 = phi i32 [ %105, %111 ], [ %147, %113 ]
%152 = icmp eq i64 %149, %56
br i1 %152, label %153, label %103
153: ; preds = %148, %91
%154 = phi i64 [ %92, %91 ], [ %96, %148 ]
%155 = phi double [ %90, %91 ], [ %150, %148 ]
%156 = phi i32 [ %89, %91 ], [ %151, %148 ]
%157 = icmp eq i64 %154, %55
br i1 %157, label %158, label %87
158: ; preds = %153, %49
%159 = phi double [ 0.000000e+00, %49 ], [ %155, %153 ]
%160 = phi i32 [ 0, %49 ], [ %156, %153 ]
%161 = sitofp i32 %160 to double
%162 = fdiv double %159, %161
%163 = tail call double @sqrt(double %162)
store double %163, double* %7
%164 = icmp slt i32 %3, -1
br i1 %164, label %187, label %165
165: ; preds = %158
%166 = sext i32 %4 to i64
%167 = add nsw i32 %4, 1
%168 = sext i32 %167 to i64
%169 = call i32 @llvm.smax.i32(i32 %50, i32 0)
%170 = add nuw i32 %169, 1
%171 = zext i32 %170 to i64
%172 = and i64 %171, 1
%173 = icmp slt i32 %50, 1
br i1 %173, label %176, label %174
174: ; preds = %165
%175 = and i64 %171, 4294967294
br label %325
176: ; preds = %325, %165
%177 = phi i64 [ 0, %165 ], [ %343, %325 ]
%178 = icmp eq i64 %172, 0
br i1 %178, label %187, label %179
179: ; preds = %176
%180 = getelementptr inbounds double*, double** %5, i64 %177
%181 = load double*, double** %180
%182 = getelementptr inbounds double, double* %181, i64 1
%183 = load double, double* %182
store double %183, double* %181
%184 = getelementptr inbounds double, double* %181, i64 %166
%185 = load double, double* %184
%186 = getelementptr inbounds double, double* %181, i64 %168
store double %185, double* %186
br label %187
187: ; preds = %179, %176, %158
%188 = icmp slt i32 %4, -1
br i1 %188, label %346, label %189
189: ; preds = %187
%190 = getelementptr inbounds double*, double** %5, i64 1
%191 = load double*, double** %190
%192 = load double*, double** %5
%193 = sext i32 %3 to i64
%194 = getelementptr inbounds double*, double** %5, i64 %193
%195 = load double*, double** %194
%196 = sext i32 %50 to i64
%197 = getelementptr inbounds double*, double** %5, i64 %196
%198 = load double*, double** %197
%199 = add i32 %4, 2
%200 = zext i32 %199 to i64
%201 = icmp ult i32 %199, 4
br i1 %201, label %308, label %202
202: ; preds = %189
%203 = getelementptr double, double* %192, i64 %200
%204 = getelementptr double, double* %198, i64 %200
%205 = getelementptr double, double* %191, i64 %200
%206 = getelementptr double, double* %195, i64 %200
%207 = icmp ult double* %192, %204
%208 = icmp ult double* %198, %203
%209 = and i1 %207, %208
%210 = icmp ult double* %192, %205
%211 = icmp ult double* %191, %203
%212 = and i1 %210, %211
%213 = or i1 %209, %212
%214 = icmp ult double* %192, %206
%215 = icmp ult double* %195, %203
%216 = and i1 %214, %215
%217 = or i1 %213, %216
%218 = icmp ult double* %198, %205
%219 = icmp ult double* %191, %204
%220 = and i1 %218, %219
%221 = or i1 %217, %220
%222 = icmp ult double* %198, %206
%223 = icmp ult double* %195, %204
%224 = and i1 %222, %223
%225 = or i1 %221, %224
br i1 %225, label %308, label %226
226: ; preds = %202
%227 = and i64 %200, 4294967292
%228 = add nsw i64 %227, -4
%229 = lshr exact i64 %228, 2
%230 = add nuw nsw i64 %229, 1
%231 = and i64 %230, 1
%232 = icmp eq i64 %228, 0
br i1 %232, label %282, label %233
233: ; preds = %226
%234 = and i64 %230, 9223372036854775806
br label %235
235: ; preds = %235, %233
%236 = phi i64 [ 0, %233 ], [ %279, %235 ]
%237 = phi i64 [ 0, %233 ], [ %280, %235 ]
%238 = getelementptr inbounds double, double* %191, i64 %236
%239 = bitcast double* %238 to <2 x double>*
%240 = load <2 x double>, <2 x double>* %239
%241 = getelementptr inbounds double, double* %238, i64 2
%242 = bitcast double* %241 to <2 x double>*
%243 = load <2 x double>, <2 x double>* %242
%244 = getelementptr inbounds double, double* %192, i64 %236
%245 = bitcast double* %244 to <2 x double>*
store <2 x double> %240, <2 x double>* %245
%246 = getelementptr inbounds double, double* %244, i64 2
%247 = bitcast double* %246 to <2 x double>*
store <2 x double> %243, <2 x double>* %247
%248 = getelementptr inbounds double, double* %195, i64 %236
%249 = bitcast double* %248 to <2 x double>*
%250 = load <2 x double>, <2 x double>* %249
%251 = getelementptr inbounds double, double* %248, i64 2
%252 = bitcast double* %251 to <2 x double>*
%253 = load <2 x double>, <2 x double>* %252
%254 = getelementptr inbounds double, double* %198, i64 %236
%255 = bitcast double* %254 to <2 x double>*
store <2 x double> %250, <2 x double>* %255
%256 = getelementptr inbounds double, double* %254, i64 2
%257 = bitcast double* %256 to <2 x double>*
store <2 x double> %253, <2 x double>* %257
%258 = or i64 %236, 4
%259 = getelementptr inbounds double, double* %191, i64 %258
%260 = bitcast double* %259 to <2 x double>*
%261 = load <2 x double>, <2 x double>* %260
%262 = getelementptr inbounds double, double* %259, i64 2
%263 = bitcast double* %262 to <2 x double>*
%264 = load <2 x double>, <2 x double>* %263
%265 = getelementptr inbounds double, double* %192, i64 %258
%266 = bitcast double* %265 to <2 x double>*
store <2 x double> %261, <2 x double>* %266
%267 = getelementptr inbounds double, double* %265, i64 2
%268 = bitcast double* %267 to <2 x double>*
store <2 x double> %264, <2 x double>* %268
%269 = getelementptr inbounds double, double* %195, i64 %258
%270 = bitcast double* %269 to <2 x double>*
%271 = load <2 x double>, <2 x double>* %270
%272 = getelementptr inbounds double, double* %269, i64 2
%273 = bitcast double* %272 to <2 x double>*
%274 = load <2 x double>, <2 x double>* %273
%275 = getelementptr inbounds double, double* %198, i64 %258
%276 = bitcast double* %275 to <2 x double>*
store <2 x double> %271, <2 x double>* %276
%277 = getelementptr inbounds double, double* %275, i64 2
%278 = bitcast double* %277 to <2 x double>*
store <2 x double> %274, <2 x double>* %278
%279 = add nuw i64 %236, 8
%280 = add i64 %237, 2
%281 = icmp eq i64 %280, %234
br i1 %281, label %282, label %235
282: ; preds = %235, %226
%283 = phi i64 [ 0, %226 ], [ %279, %235 ]
%284 = icmp eq i64 %231, 0
br i1 %284, label %306, label %285
285: ; preds = %282
%286 = getelementptr inbounds double, double* %191, i64 %283
%287 = bitcast double* %286 to <2 x double>*
%288 = load <2 x double>, <2 x double>* %287
%289 = getelementptr inbounds double, double* %286, i64 2
%290 = bitcast double* %289 to <2 x double>*
%291 = load <2 x double>, <2 x double>* %290
%292 = getelementptr inbounds double, double* %192, i64 %283
%293 = bitcast double* %292 to <2 x double>*
store <2 x double> %288, <2 x double>* %293
%294 = getelementptr inbounds double, double* %292, i64 2
%295 = bitcast double* %294 to <2 x double>*
store <2 x double> %291, <2 x double>* %295
%296 = getelementptr inbounds double, double* %195, i64 %283
%297 = bitcast double* %296 to <2 x double>*
%298 = load <2 x double>, <2 x double>* %297
%299 = getelementptr inbounds double, double* %296, i64 2
%300 = bitcast double* %299 to <2 x double>*
%301 = load <2 x double>, <2 x double>* %300
%302 = getelementptr inbounds double, double* %198, i64 %283
%303 = bitcast double* %302 to <2 x double>*
store <2 x double> %298, <2 x double>* %303
%304 = getelementptr inbounds double, double* %302, i64 2
%305 = bitcast double* %304 to <2 x double>*
store <2 x double> %301, <2 x double>* %305
br label %306
306: ; preds = %282, %285
%307 = icmp eq i64 %227, %200
br i1 %307, label %346, label %308
308: ; preds = %202, %189, %306
%309 = phi i64 [ 0, %202 ], [ 0, %189 ], [ %227, %306 ]
%310 = xor i64 %309, -1
%311 = and i64 %200, 1
%312 = icmp eq i64 %311, 0
br i1 %312, label %321, label %313
313: ; preds = %308
%314 = getelementptr inbounds double, double* %191, i64 %309
%315 = load double, double* %314
%316 = getelementptr inbounds double, double* %192, i64 %309
store double %315, double* %316
%317 = getelementptr inbounds double, double* %195, i64 %309
%318 = load double, double* %317
%319 = getelementptr inbounds double, double* %198, i64 %309
store double %318, double* %319
%320 = or i64 %309, 1
br label %321
321: ; preds = %313, %308
%322 = phi i64 [ %309, %308 ], [ %320, %313 ]
%323 = sub nsw i64 0, %200
%324 = icmp eq i64 %310, %323
br i1 %324, label %346, label %352
325: ; preds = %325, %174
%326 = phi i64 [ 0, %174 ], [ %343, %325 ]
%327 = phi i64 [ 0, %174 ], [ %344, %325 ]
%328 = getelementptr inbounds double*, double** %5, i64 %326
%329 = load double*, double** %328
%330 = getelementptr inbounds double, double* %329, i64 1
%331 = load double, double* %330
store double %331, double* %329
%332 = getelementptr inbounds double, double* %329, i64 %166
%333 = load double, double* %332
%334 = getelementptr inbounds double, double* %329, i64 %168
store double %333, double* %334
%335 = or i64 %326, 1
%336 = getelementptr inbounds double*, double** %5, i64 %335
%337 = load double*, double** %336
%338 = getelementptr inbounds double, double* %337, i64 1
%339 = load double, double* %338
store double %339, double* %337
%340 = getelementptr inbounds double, double* %337, i64 %166
%341 = load double, double* %340
%342 = getelementptr inbounds double, double* %337, i64 %168
store double %341, double* %342
%343 = add nuw nsw i64 %326, 2
%344 = add i64 %327, 2
%345 = icmp eq i64 %344, %175
br i1 %345, label %176, label %325
346: ; preds = %321, %352, %306, %187
br i1 %20, label %459, label %347
347: ; preds = %346
%348 = icmp slt i32 %4, 1
%349 = add nsw i32 %4, 1
%350 = zext i32 %50 to i64
%351 = zext i32 %349 to i64
br label %369
352: ; preds = %321, %352
%353 = phi i64 [ %367, %352 ], [ %322, %321 ]
%354 = getelementptr inbounds double, double* %191, i64 %353
%355 = load double, double* %354
%356 = getelementptr inbounds double, double* %192, i64 %353
store double %355, double* %356
%357 = getelementptr inbounds double, double* %195, i64 %353
%358 = load double, double* %357
%359 = getelementptr inbounds double, double* %198, i64 %353
store double %358, double* %359
%360 = add nuw nsw i64 %353, 1
%361 = getelementptr inbounds double, double* %191, i64 %360
%362 = load double, double* %361
%363 = getelementptr inbounds double, double* %192, i64 %360
store double %362, double* %363
%364 = getelementptr inbounds double, double* %195, i64 %360
%365 = load double, double* %364
%366 = getelementptr inbounds double, double* %198, i64 %360
store double %365, double* %366
%367 = add nuw nsw i64 %353, 2
%368 = icmp eq i64 %367, %200
br i1 %368, label %346, label %352
369: ; preds = %347, %456
%370 = phi i64 [ 1, %347 ], [ %457, %456 ]
br i1 %348, label %371, label %373
371: ; preds = %369
%372 = add nuw nsw i64 %370, 1
br label %456
373: ; preds = %369
%374 = getelementptr inbounds i32*, i32** %8, i64 %370
%375 = load i32*, i32** %374
%376 = getelementptr inbounds double*, double** %5, i64 %370
%377 = add nsw i64 %370, -1
%378 = getelementptr inbounds double*, double** %5, i64 %377
%379 = add nuw nsw i64 %370, 1
%380 = and i64 %379, 4294967295
%381 = getelementptr inbounds double*, double** %5, i64 %380
br label %382
382: ; preds = %373, %453
%383 = phi i64 [ 1, %373 ], [ %454, %453 ]
%384 = getelementptr inbounds i32, i32* %375, i64 %383
%385 = load i32, i32* %384
switch i32 %385, label %453 [
i32 8, label %386
i32 1, label %391
i32 4, label %397
i32 2, label %402
i32 9, label %407
i32 5, label %418
i32 10, label %429
i32 6, label %439
]
386: ; preds = %382
%387 = load double*, double** %381
%388 = getelementptr inbounds double, double* %387, i64 %383
%389 = load double, double* %388
%390 = load double*, double** %376
br label %449
391: ; preds = %382
%392 = load double*, double** %376
%393 = add nuw i64 %383, 1
%394 = and i64 %393, 4294967295
%395 = getelementptr inbounds double, double* %392, i64 %394
%396 = load double, double* %395
br label %449
397: ; preds = %382
%398 = load double*, double** %378
%399 = getelementptr inbounds double, double* %398, i64 %383
%400 = load double, double* %399
%401 = load double*, double** %376
br label %449
402: ; preds = %382
%403 = load double*, double** %376
%404 = add nsw i64 %383, -1
%405 = getelementptr inbounds double, double* %403, i64 %404
%406 = load double, double* %405
br label %449
407: ; preds = %382
%408 = load double*, double** %376
%409 = add nuw i64 %383, 1
%410 = and i64 %409, 4294967295
%411 = getelementptr inbounds double, double* %408, i64 %410
%412 = load double, double* %411
%413 = load double*, double** %381
%414 = getelementptr inbounds double, double* %413, i64 %383
%415 = load double, double* %414
%416 = fadd double %412, %415
%417 = fmul double %416, 5.000000e-01
br label %449
418: ; preds = %382
%419 = load double*, double** %376
%420 = add nuw i64 %383, 1
%421 = and i64 %420, 4294967295
%422 = getelementptr inbounds double, double* %419, i64 %421
%423 = load double, double* %422
%424 = load double*, double** %378
%425 = getelementptr inbounds double, double* %424, i64 %383
%426 = load double, double* %425
%427 = fadd double %423, %426
%428 = fmul double %427, 5.000000e-01
br label %449
429: ; preds = %382
%430 = load double*, double** %376
%431 = add nsw i64 %383, -1
%432 = getelementptr inbounds double, double* %430, i64 %431
%433 = load double, double* %432
%434 = load double*, double** %381
%435 = getelementptr inbounds double, double* %434, i64 %383
%436 = load double, double* %435
%437 = fadd double %433, %436
%438 = fmul double %437, 5.000000e-01
br label %449
439: ; preds = %382
%440 = load double*, double** %376
%441 = add nsw i64 %383, -1
%442 = getelementptr inbounds double, double* %440, i64 %441
%443 = load double, double* %442
%444 = load double*, double** %378
%445 = getelementptr inbounds double, double* %444, i64 %383
%446 = load double, double* %445
%447 = fadd double %443, %446
%448 = fmul double %447, 5.000000e-01
br label %449
449: ; preds = %391, %402, %418, %439, %429, %407, %397, %386
%450 = phi double* [ %390, %386 ], [ %401, %397 ], [ %408, %407 ], [ %430, %429 ], [ %440, %439 ], [ %419, %418 ], [ %403, %402 ], [ %392, %391 ]
%451 = phi double [ %389, %386 ], [ %400, %397 ], [ %417, %407 ], [ %438, %429 ], [ %448, %439 ], [ %428, %418 ], [ %406, %402 ], [ %396, %391 ]
%452 = getelementptr inbounds double, double* %450, i64 %383
store double %451, double* %452
br label %453
453: ; preds = %449, %382
%454 = add nuw nsw i64 %383, 1
%455 = icmp eq i64 %454, %351
br i1 %455, label %456, label %382
456: ; preds = %453, %371
%457 = phi i64 [ %372, %371 ], [ %379, %453 ]
%458 = icmp eq i64 %457, %350
br i1 %458, label %459, label %369
459: ; preds = %456, %346
ret void
}