#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ Thomas(double *, double *, double *, int);
int /*<<< orphan*/ free(double *);
scalar_t__ malloc(int);
int sfa(double *, double *, int *, double *, double *, double *, double *,
        double, int, int, double *, double *, double, int, int);
int sfa_one(double *, double *, int *, double *, double *, double *, double,
            int, int, double *, double *, double, int);
int sfa_special(double *, double *, int *, double *, double *, double *, double,
                int, int, double *, double *, double, int);
void flsa(double *x, double *z, double *infor, double *v, double *z0,
          double lambda1, double lambda2, int n, int maxStep, double tol,
          int tau, int flag) {
  int i, nn = n - 1, m;
  double zMax, temp;
  double *Av, *g, *s;
  int iterStep, numS;
  double gap;
  double *zz;
  Av = (double *)malloc(sizeof(double) * nn);
  for (i = 0; i < nn; i++)
    Av[i] = v[i + 1] - v[i];
  Thomas(&zMax, z, Av, nn);
  if (lambda2 >= zMax) {
    temp = 0;
    m = n % 5;
    if (m != 0) {
      for (i = 0; i < m; i++)
        temp += v[i];
    }
    for (i = m; i < n; i += 5) {
      temp += v[i] + v[i + 1] + v[i + 2] + v[i + 3] + v[i + 4];
    }
    temp /= n;
    if (temp > lambda1)
      temp = temp - lambda1;
    else if (temp < -lambda1)
      temp = temp + lambda1;
    else
      temp = 0;
    m = n % 7;
    if (m != 0) {
      for (i = 0; i < m; i++)
        x[i] = temp;
    }
    for (i = m; i < n; i += 7) {
      x[i] = temp;
      x[i + 1] = temp;
      x[i + 2] = temp;
      x[i + 3] = temp;
      x[i + 4] = temp;
      x[i + 5] = temp;
      x[i + 6] = temp;
    }
    gap = 0;
    free(Av);
    infor[0] = gap;
    infor[1] = 0;
    infor[2] = zMax;
    infor[3] = 0;
    return;
  }
  g = (double *)malloc(sizeof(double) * nn),
  s = (double *)malloc(sizeof(double) * nn);
  m = flag / 10;
  if (m == 0) {
    for (i = 0; i < nn; i++) {
      if (z0[i] > lambda2)
        z[i] = lambda2;
      else if (z0[i] < -lambda2)
        z[i] = -lambda2;
      else
        z[i] = z0[i];
    }
  } else {
    if (lambda2 >= 0.5 * zMax) {
      for (i = 0; i < nn; i++) {
        if (z[i] > lambda2)
          z[i] = lambda2;
        else if (z[i] < -lambda2)
          z[i] = -lambda2;
      }
    } else {
      for (i = 0; i < nn; i++)
        z[i] = 0;
    }
  }
  flag = flag % 10;
  if (flag >= 1 && flag <= 4) {
    zz = (double *)malloc(sizeof(double) * nn);
    for (i = 0; i < nn; i++)
      zz[i] = 0;
  }
  if (flag == 6)
    iterStep =
        sfa_one(x, &gap, &numS, z, v, Av, lambda2, nn, maxStep, s, g, tol, tau);
  else if (flag == 5)
    iterStep = sfa_special(x, &gap, &numS, z, v, Av, lambda2, nn, maxStep, s, g,
                           tol, tau);
  else {
    iterStep = sfa(x, &gap, &numS, z, zz, v, Av, lambda2, nn, maxStep, s, g,
                   tol, tau, flag);
    free(zz);
  }
  for (i = 0; i < n; i++)
    if (x[i] > lambda1)
      x[i] -= lambda1;
    else if (x[i] < -lambda1)
      x[i] += lambda1;
    else
      x[i] = 0;
  free(Av);
  free(g);
  free(s);
  infor[0] = gap;
  infor[1] = iterStep;
  infor[2] = zMax;
  infor[3] = numS;
}


x86 assembly (clang, -O0):
<flsa>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0xd0,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x28(%rbp)
mov    %rsi,-0x30(%rbp)
mov    %rdx,-0x38(%rbp)
mov    %rcx,-0x40(%rbp)
mov    %r8,-0x48(%rbp)
movsd  %xmm0,-0x50(%rbp)
movsd  %xmm1,-0x58(%rbp)
mov    %r9d,-0x5c(%rbp)
movsd  %xmm2,-0x68(%rbp)
mov    -0x5c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x70(%rbp)
movslq -0x70(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1050 <malloc@plt>
mov    %rax,-0x90(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x70(%rbp),%eax
jge    1211 <flsa+0xb1>
mov    -0x40(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x6c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x90(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    11c8 <flsa+0x68>
mov    -0x30(%rbp),%rsi
mov    -0x90(%rbp),%rdx
mov    -0x70(%rbp),%ecx
lea    -0x80(%rbp),%rdi
call   1080 <Thomas@plt>
movsd  -0x58(%rbp),%xmm0
ucomisd -0x80(%rbp),%xmm0
jb     1537 <flsa+0x3d7>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x5c(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    %edx,-0x74(%rbp)
cmpl   $0x0,-0x74(%rbp)
je     129e <flsa+0x13e>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x74(%rbp),%eax
jge    1299 <flsa+0x139>
mov    -0x40(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1262 <flsa+0x102>
jmp    129e <flsa+0x13e>
mov    -0x74(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jge    1323 <flsa+0x1c3>
mov    -0x40(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x6c(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x6c(%rbp)
jmp    12a4 <flsa+0x144>
cvtsi2sdl -0x5c(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
ucomisd -0x50(%rbp),%xmm0
jbe    1369 <flsa+0x209>
movsd  -0x88(%rbp),%xmm0
ff
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
jmp    13c1 <flsa+0x261>
movsd  -0x88(%rbp),%xmm1
ff
movsd  -0x50(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jbe    13b1 <flsa+0x251>
movsd  -0x88(%rbp),%xmm0
ff
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
jmp    13bc <flsa+0x25c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
jmp    13c1 <flsa+0x261>
mov    -0x5c(%rbp),%eax
mov    $0x7,%ecx
cltd
idiv   %ecx
mov    %edx,-0x74(%rbp)
cmpl   $0x0,-0x74(%rbp)
je     1414 <flsa+0x2b4>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x74(%rbp),%eax
jge    140f <flsa+0x2af>
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    13e0 <flsa+0x280>
jmp    1414 <flsa+0x2b4>
mov    -0x74(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jge    14e5 <flsa+0x385>
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x7,%eax
mov    %eax,-0x6c(%rbp)
jmp    141a <flsa+0x2ba>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x90(%rbp),%rdi
call   1040 <free@plt>
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1a70 <flsa+0x910>
movslq -0x70(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1050 <malloc@plt>
mov    %rax,-0x98(%rbp)
movslq -0x70(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1050 <malloc@plt>
mov    %rax,-0xa0(%rbp)
mov    0x20(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x74(%rbp)
cmpl   $0x0,-0x74(%rbp)
jne    1655 <flsa+0x4f5>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x70(%rbp),%eax
jge    1650 <flsa+0x4f0>
mov    -0x48(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    15bd <flsa+0x45d>
movsd  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    163d <flsa+0x4dd>
mov    -0x48(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jbe    161e <flsa+0x4be>
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1638 <flsa+0x4d8>
mov    -0x48(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    163d <flsa+0x4dd>
jmp    1642 <flsa+0x4e2>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1582 <flsa+0x422>
jmp    1767 <flsa+0x607>
movsd  -0x58(%rbp),%xmm0
movsd  0x99e(%rip),%xmm1
mulsd  -0x80(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jb     172c <flsa+0x5cc>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x70(%rbp),%eax
jge    1727 <flsa+0x5c7>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    16b3 <flsa+0x553>
movsd  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1714 <flsa+0x5b4>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jbe    170f <flsa+0x5af>
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1714 <flsa+0x5b4>
jmp    1719 <flsa+0x5b9>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1678 <flsa+0x518>
jmp    1762 <flsa+0x602>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x70(%rbp),%eax
jge    175d <flsa+0x5fd>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1733 <flsa+0x5d3>
jmp    1762 <flsa+0x602>
jmp    1767 <flsa+0x607>
mov    0x20(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %edx,0x20(%rbp)
cmpl   $0x1,0x20(%rbp)
jl     17d8 <flsa+0x678>
cmpl   $0x4,0x20(%rbp)
jg     17d8 <flsa+0x678>
movslq -0x70(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1050 <malloc@plt>
mov    %rax,-0xb8(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x70(%rbp),%eax
jge    17d3 <flsa+0x673>
mov    -0xb8(%rbp),%rax
movslq -0x6c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    17a6 <flsa+0x646>
jmp    17d8 <flsa+0x678>
cmpl   $0x6,0x20(%rbp)
jne    184b <flsa+0x6eb>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%r8
mov    -0x90(%rbp),%r9
movsd  -0x58(%rbp),%xmm0
mov    -0x70(%rbp),%r14d
mov    0x10(%rbp),%ebx
mov    -0xa0(%rbp),%r11
mov    -0x98(%rbp),%r10
movsd  -0x68(%rbp),%xmm1
mov    0x18(%rbp),%eax
lea    -0xb0(%rbp),%rsi
lea    -0xa8(%rbp),%rdx
mov    %r14d,(%rsp)
mov    %ebx,0x8(%rsp)
mov    %r11,0x10(%rsp)
mov    %r10,0x18(%rsp)
mov    %eax,0x20(%rsp)
call   1030 <sfa_one@plt>
mov    %eax,-0xa4(%rbp)
jmp    194a <flsa+0x7ea>
cmpl   $0x5,0x20(%rbp)
jne    18be <flsa+0x75e>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%r8
mov    -0x90(%rbp),%r9
movsd  -0x58(%rbp),%xmm0
mov    -0x70(%rbp),%r14d
mov    0x10(%rbp),%ebx
mov    -0xa0(%rbp),%r11
mov    -0x98(%rbp),%r10
movsd  -0x68(%rbp),%xmm1
mov    0x18(%rbp),%eax
lea    -0xb0(%rbp),%rsi
lea    -0xa8(%rbp),%rdx
mov    %r14d,(%rsp)
mov    %ebx,0x8(%rsp)
mov    %r11,0x10(%rsp)
mov    %r10,0x18(%rsp)
mov    %eax,0x20(%rsp)
call   1070 <sfa_special@plt>
mov    %eax,-0xa4(%rbp)
jmp    1945 <flsa+0x7e5>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rcx
mov    -0xb8(%rbp),%r8
mov    -0x40(%rbp),%r9
mov    -0x90(%rbp),%r12
movsd  -0x58(%rbp),%xmm0
mov    -0x70(%rbp),%r15d
mov    0x10(%rbp),%r14d
mov    -0xa0(%rbp),%rbx
mov    -0x98(%rbp),%r11
movsd  -0x68(%rbp),%xmm1
mov    0x18(%rbp),%r10d
mov    0x20(%rbp),%eax
lea    -0xb0(%rbp),%rsi
lea    -0xa8(%rbp),%rdx
mov    %r12,(%rsp)
mov    %r15d,0x8(%rsp)
mov    %r14d,0x10(%rsp)
mov    %rbx,0x18(%rsp)
mov    %r11,0x20(%rsp)
mov    %r10d,0x28(%rsp)
mov    %eax,0x30(%rsp)
call   1060 <sfa@plt>
mov    %eax,-0xa4(%rbp)
mov    -0xb8(%rbp),%rdi
call   1040 <free@plt>
jmp    194a <flsa+0x7ea>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jge    1a0c <flsa+0x8ac>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x50(%rbp),%xmm0
jbe    1995 <flsa+0x835>
movsd  -0x50(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    19f9 <flsa+0x899>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x50(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jbe    19e4 <flsa+0x884>
movsd  -0x50(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    19f4 <flsa+0x894>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    19f9 <flsa+0x899>
jmp    19fe <flsa+0x89e>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1951 <flsa+0x7f1>
mov    -0x90(%rbp),%rdi
call   1040 <free@plt>
mov    -0x98(%rbp),%rdi
call   1040 <free@plt>
mov    -0xa0(%rbp),%rdi
call   1040 <free@plt>
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
cvtsi2sdl -0xa4(%rbp),%xmm0
ff
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cvtsi2sdl -0xa8(%rbp),%xmm0
ff
mov    -0x38(%rbp),%rax
movsd  %xmm0,0x18(%rax)
add    $0xd0,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

x86 assembly (clang, -O2):
<flsa>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
movsd  %xmm2,0x40(%rsp)
mov    %r9d,%r12d
movapd %xmm1,0x50(%rsp)
movapd %xmm0,0x60(%rsp)
mov    %r8,%rbp
mov    %rcx,%rbx
mov    %rdx,0x48(%rsp)
mov    %rsi,%r14
mov    %rdi,%r13
lea    -0x1(%r12),%eax
mov    %rax,(%rsp)
lea    -0x8(,%r12,8),%edi
ff
mov    %edi,0x24(%rsp)
call   1060 <malloc@plt>
mov    %rax,%r15
mov    %r12,0x10(%rsp)
cmp    $0x2,%r12d
jl     138a <flsa+0x21a>
mov    (%rsp),%rcx
mov    %ecx,%eax
cmp    $0x4,%ecx
jb     11f9 <flsa+0x89>
lea    (%rbx,%rax,8),%rcx
add    $0x8,%rcx
cmp    %rcx,%r15
jae    12ab <flsa+0x13b>
lea    (%r15,%rax,8),%rcx
cmp    %rbx,%rcx
jbe    12ab <flsa+0x13b>
xor    %ecx,%ecx
mov    %rcx,%rsi
not    %rsi
add    %rax,%rsi
mov    %rax,%rdi
and    $0x3,%rdi
je     123a <flsa+0xca>
nopl   (%rax)
lea    0x1(%rcx),%rdx
movsd  0x8(%rbx,%rcx,8),%xmm0
subsd  (%rbx,%rcx,8),%xmm0
movsd  %xmm0,(%r15,%rcx,8)
mov    %rdx,%rcx
add    $0xffffffffffffffff,%rdi
jne    1210 <flsa+0xa0>
cmp    $0x3,%rsi
jb     138a <flsa+0x21a>
jmp    1250 <flsa+0xe0>
mov    %rcx,%rdx
cmp    $0x3,%rsi
jb     138a <flsa+0x21a>
nopw   0x0(%rax,%rax,1)
movsd  0x8(%rbx,%rdx,8),%xmm0
subsd  (%rbx,%rdx,8),%xmm0
movsd  %xmm0,(%r15,%rdx,8)
movsd  0x10(%rbx,%rdx,8),%xmm0
subsd  0x8(%rbx,%rdx,8),%xmm0
movsd  %xmm0,0x8(%r15,%rdx,8)
movsd  0x18(%rbx,%rdx,8),%xmm0
subsd  0x10(%rbx,%rdx,8),%xmm0
movsd  %xmm0,0x10(%r15,%rdx,8)
movsd  0x20(%rbx,%rdx,8),%xmm0
subsd  0x18(%rbx,%rdx,8),%xmm0
movsd  %xmm0,0x18(%r15,%rdx,8)
lea    0x4(%rdx),%rcx
mov    %rcx,%rdx
cmp    %rcx,%rax
jne    1250 <flsa+0xe0>
jmp    138a <flsa+0x21a>
mov    %eax,%ecx
and    $0xfffffffc,%ecx
lea    -0x4(%rcx),%rdx
mov    %rdx,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
test   %rdx,%rdx
je     1927 <flsa+0x7b7>
mov    %rsi,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movupd (%rbx,%rdx,8),%xmm0
movupd 0x8(%rbx,%rdx,8),%xmm1
subpd  %xmm0,%xmm1
movupd 0x10(%rbx,%rdx,8),%xmm0
movupd 0x18(%rbx,%rdx,8),%xmm2
subpd  %xmm0,%xmm2
movupd %xmm1,(%r15,%rdx,8)
movupd %xmm2,0x10(%r15,%rdx,8)
movupd 0x20(%rbx,%rdx,8),%xmm0
movupd 0x28(%rbx,%rdx,8),%xmm1
subpd  %xmm0,%xmm1
movupd 0x30(%rbx,%rdx,8),%xmm0
movupd 0x38(%rbx,%rdx,8),%xmm2
subpd  %xmm0,%xmm2
movupd %xmm1,0x20(%r15,%rdx,8)
movupd %xmm2,0x30(%r15,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rdi
jne    12e0 <flsa+0x170>
test   $0x1,%sil
je     1381 <flsa+0x211>
lea    0x0(,%rdx,8),%rsi
or     $0x8,%rsi
movupd (%rbx,%rsi,1),%xmm0
movupd 0x10(%rbx,%rsi,1),%xmm1
movupd (%rbx,%rdx,8),%xmm2
subpd  %xmm2,%xmm0
movupd 0x10(%rbx,%rdx,8),%xmm2
subpd  %xmm2,%xmm1
movupd %xmm0,(%r15,%rdx,8)
movupd %xmm1,0x10(%r15,%rdx,8)
cmp    %rax,%rcx
jne    11fb <flsa+0x8b>
lea    0x28(%rsp),%rdi
mov    %r14,%rsi
mov    %r15,%rdx
mov    (%rsp),%rcx
call   1090 <Thomas@plt>
movapd 0x50(%rsp),%xmm0
ucomisd 0x28(%rsp),%xmm0
jae    1448 <flsa+0x2d8>
mov    0x24(%rsp),%r12d
mov    %r12d,%edi
call   1060 <malloc@plt>
mov    %rax,0x38(%rsp)
mov    %r12d,%edi
mov    0xc0(%rsp),%r12d
call   1060 <malloc@plt>
mov    %rax,0x30(%rsp)
lea    0x9(%r12),%eax
cmp    $0x12,%eax
ja     14ba <flsa+0x34a>
cmpl   $0x2,0x10(%rsp)
movapd 0x50(%rsp),%xmm0
jl     16bb <flsa+0x54b>
movapd 0xc02(%rip),%xmm2
xorpd  %xmm0,%xmm2
mov    (%rsp),%eax
xor    %ecx,%ecx
jmp    1423 <flsa+0x2b3>
nopl   0x0(%rax)
movsd  %xmm0,(%r14,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
je     16bb <flsa+0x54b>
movsd  0x0(%rbp,%rcx,8),%xmm1
ucomisd %xmm0,%xmm1
ja     1410 <flsa+0x2a0>
ucomisd %xmm1,%xmm2
jbe    1440 <flsa+0x2d0>
movsd  %xmm2,(%r14,%rcx,8)
jmp    1416 <flsa+0x2a6>
nopl   (%rax)
movsd  %xmm1,(%r14,%rcx,8)
jmp    1416 <flsa+0x2a6>
mov    0x10(%rsp),%rsi
movslq %esi,%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x21,%rcx
add    %edx,%ecx
lea    (%rcx,%rcx,4),%edx
mov    %esi,%ecx
sub    %edx,%ecx
xorpd  %xmm0,%xmm0
test   %ecx,%ecx
jle    14ff <flsa+0x38f>
addsd  (%rbx),%xmm0
cmp    $0x1,%ecx
movapd 0x60(%rsp),%xmm3
mov    0x48(%rsp),%rbp
je     150a <flsa+0x39a>
addsd  0x8(%rbx),%xmm0
cmp    $0x2,%ecx
je     150a <flsa+0x39a>
addsd  0x10(%rbx),%xmm0
cmp    $0x3,%ecx
je     150a <flsa+0x39a>
addsd  0x18(%rbx),%xmm0
cmp    $0x4,%ecx
je     150a <flsa+0x39a>
addsd  0x20(%rbx),%xmm0
addsd  0x28(%rbx),%xmm0
addsd  0x30(%rbx),%xmm0
jmp    150a <flsa+0x39a>
movsd  0x28(%rsp),%xmm1
mulsd  0xb48(%rip),%xmm1
movapd 0x50(%rsp),%xmm0
ucomisd %xmm1,%xmm0
jae    1672 <flsa+0x502>
cmpl   $0x2,0x10(%rsp)
jl     16bb <flsa+0x54b>
mov    (%rsp),%edx
shl    $0x3,%rdx
mov    %r14,%rdi
xor    %esi,%esi
call   1050 <memset@plt>
movapd 0x50(%rsp),%xmm0
jmp    16bb <flsa+0x54b>
movapd 0x60(%rsp),%xmm3
mov    0x48(%rsp),%rbp
cmp    %esi,%ecx
jge    154a <flsa+0x3da>
movslq %ecx,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rbx,%rcx,8),%xmm1
addsd  0x8(%rbx,%rcx,8),%xmm1
addsd  0x10(%rbx,%rcx,8),%xmm1
addsd  0x18(%rbx,%rcx,8),%xmm1
addsd  0x20(%rbx,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x5,%rcx
cmp    %rax,%rcx
jl     1520 <flsa+0x3b0>
xorps  %xmm1,%xmm1
cvtsi2sd %esi,%xmm1
divsd  %xmm1,%xmm0
ucomisd %xmm3,%xmm0
jbe    1561 <flsa+0x3f1>
subsd  %xmm3,%xmm0
jmp    157b <flsa+0x40b>
movapd 0xa97(%rip),%xmm2
xorpd  %xmm3,%xmm2
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm2
jbe    157f <flsa+0x40f>
addsd  %xmm3,%xmm0
movapd %xmm0,%xmm1
imul   $0xffffffff92492493,%rax,%rcx
shr    $0x20,%rcx
add    %esi,%ecx
mov    %ecx,%edx
shr    $0x1f,%edx
sar    $0x2,%ecx
add    %edx,%ecx
lea    0x0(,%rcx,8),%edx
sub    %edx,%ecx
add    %esi,%ecx
test   %ecx,%ecx
jle    15ed <flsa+0x47d>
movsd  %xmm1,0x0(%r13)
cmp    $0x1,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x8(%r13)
cmp    $0x2,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x10(%r13)
cmp    $0x3,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x18(%r13)
cmp    $0x4,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x20(%r13)
cmp    $0x5,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x28(%r13)
cmp    $0x6,%ecx
je     15ed <flsa+0x47d>
movsd  %xmm1,0x30(%r13)
cmp    %esi,%ecx
jge    163a <flsa+0x4ca>
movslq %ecx,%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  %xmm1,0x0(%r13,%rcx,8)
movsd  %xmm1,0x8(%r13,%rcx,8)
movsd  %xmm1,0x10(%r13,%rcx,8)
movsd  %xmm1,0x18(%r13,%rcx,8)
movsd  %xmm1,0x20(%r13,%rcx,8)
movsd  %xmm1,0x28(%r13,%rcx,8)
movsd  %xmm1,0x30(%r13,%rcx,8)
add    $0x7,%rcx
cmp    %rax,%rcx
jl     1600 <flsa+0x490>
movq   $0x0,0x18(%rsp)
mov    %r15,%rdi
call   1040 <free@plt>
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x0(%rbp)
movq   $0x0,0x8(%rbp)
movsd  0x28(%rsp),%xmm0
movsd  %xmm0,0x10(%rbp)
xorpd  %xmm0,%xmm0
jmp    1913 <flsa+0x7a3>
cmpl   $0x2,0x10(%rsp)
jl     16bb <flsa+0x54b>
movapd 0x97f(%rip),%xmm3
xorpd  %xmm0,%xmm3
mov    (%rsp),%rax
mov    %eax,%ecx
cmp    $0x1,%eax
jne    1938 <flsa+0x7c8>
xor    %eax,%eax
test   $0x1,%cl
je     16bb <flsa+0x54b>
movsd  (%r14,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
movapd %xmm0,%xmm1
ja     16b5 <flsa+0x545>
ucomisd %xmm2,%xmm3
movapd %xmm3,%xmm1
jbe    16bb <flsa+0x54b>
movsd  %xmm1,(%r14,%rax,8)
movslq %r12d,%rax
imul   $0x66666667,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x22,%rax
add    %ecx,%eax
add    %eax,%eax
lea    (%rax,%rax,4),%eax
mov    %r12d,%ecx
sub    %eax,%r12d
neg    %eax
add    %ecx,%eax
add    $0xffffffff,%eax
cmp    $0x3,%eax
ja     1719 <flsa+0x5a9>
mov    0x24(%rsp),%edi
call   1060 <malloc@plt>
movapd 0x50(%rsp),%xmm0
mov    %rax,%rbp
cmpl   $0x2,0x10(%rsp)
jl     1719 <flsa+0x5a9>
mov    (%rsp),%edx
shl    $0x3,%rdx
mov    %rbp,%rdi
xor    %esi,%esi
call   1050 <memset@plt>
movapd 0x50(%rsp),%xmm0
mov    0xb8(%rsp),%eax
mov    0xb0(%rsp),%r10d
sub    $0x8,%rsp
cmp    $0x5,%r12d
je     176f <flsa+0x5ff>
cmp    $0x6,%r12d
jne    17ad <flsa+0x63d>
lea    0x20(%rsp),%rsi
lea    0x14(%rsp),%rdx
mov    %r13,%rdi
mov    %r14,%rcx
mov    %rbx,%r8
mov    %r15,%r9
movsd  0x48(%rsp),%xmm1
push   %rax
mov    0x48(%rsp),%r12
push   %r12
mov    0x48(%rsp),%rbx
push   %rbx
push   %r10
push   0x28(%rsp)
call   1030 <sfa_one@plt>
jmp    17a4 <flsa+0x634>
lea    0x20(%rsp),%rsi
lea    0x14(%rsp),%rdx
mov    %r13,%rdi
mov    %r14,%rcx
mov    %rbx,%r8
mov    %r15,%r9
movsd  0x48(%rsp),%xmm1
push   %rax
mov    0x48(%rsp),%r12
push   %r12
mov    0x48(%rsp),%rbx
push   %rbx
push   %r10
push   0x28(%rsp)
call   1080 <sfa_special@plt>
add    $0x30,%rsp
mov    %eax,%r14d
jmp    17f5 <flsa+0x685>
lea    0x20(%rsp),%rsi
lea    0x14(%rsp),%rdx
mov    %r13,%rdi
mov    %r14,%rcx
mov    %rbp,%r8
mov    %rbx,%r9
movsd  0x48(%rsp),%xmm1
push   %r12
push   %rax
mov    0x50(%rsp),%r12
push   %r12
mov    0x50(%rsp),%rbx
push   %rbx
push   %r10
push   0x30(%rsp)
push   %r15
call   1070 <sfa@plt>
add    $0x40,%rsp
mov    %eax,%r14d
mov    %rbp,%rdi
call   1040 <free@plt>
mov    0x10(%rsp),%rax
test   %eax,%eax
mov    0x48(%rsp),%rbp
movapd 0x60(%rsp),%xmm3
jle    18cf <flsa+0x75f>
movapd 0x7eb(%rip),%xmm0
xorpd  %xmm3,%xmm0
mov    %eax,%ecx
cmp    $0x1,%eax
jne    1841 <flsa+0x6d1>
xor    %eax,%eax
test   $0x1,%cl
je     18cf <flsa+0x75f>
movsd  0x0(%r13,%rax,8),%xmm1
ucomisd %xmm3,%xmm1
jbe    18b6 <flsa+0x746>
subsd  %xmm3,%xmm1
jmp    18c4 <flsa+0x754>
mov    %ecx,%edx
and    $0xfffffffe,%edx
xor    %eax,%eax
jmp    1868 <flsa+0x6f8>
nopw   0x0(%rax,%rax,1)
subsd  %xmm3,%xmm1
movapd %xmm1,%xmm2
movsd  %xmm2,0x8(%r13,%rax,8)
add    $0x2,%rax
cmp    %rax,%rdx
je     1822 <flsa+0x6b2>
movsd  0x0(%r13,%rax,8),%xmm1
ucomisd %xmm3,%xmm1
jbe    1880 <flsa+0x710>
subsd  %xmm3,%xmm1
jmp    188e <flsa+0x71e>
nopl   0x0(%rax,%rax,1)
xorpd  %xmm2,%xmm2
ucomisd %xmm1,%xmm0
jbe    1892 <flsa+0x722>
addsd  %xmm3,%xmm1
movapd %xmm1,%xmm2
movsd  %xmm2,0x0(%r13,%rax,8)
movsd  0x8(%r13,%rax,8),%xmm1
ucomisd %xmm3,%xmm1
ja     1850 <flsa+0x6e0>
xorpd  %xmm2,%xmm2
ucomisd %xmm1,%xmm0
jbe    1858 <flsa+0x6e8>
addsd  %xmm3,%xmm1
jmp    1854 <flsa+0x6e4>
xorpd  %xmm2,%xmm2
ucomisd %xmm1,%xmm0
jbe    18c8 <flsa+0x758>
addsd  %xmm3,%xmm1
movapd %xmm1,%xmm2
movsd  %xmm2,0x0(%r13,%rax,8)
mov    %r15,%rdi
call   1040 <free@plt>
mov    %r12,%rdi
call   1040 <free@plt>
mov    %rbx,%rdi
call   1040 <free@plt>
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,0x0(%rbp)
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
movsd  %xmm0,0x8(%rbp)
movsd  0x28(%rsp),%xmm0
movsd  %xmm0,0x10(%rbp)
xorps  %xmm0,%xmm0
cvtsi2sdl 0xc(%rsp),%xmm0
movsd  %xmm0,0x18(%rbp)
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %edx,%edx
test   $0x1,%sil
jne    134a <flsa+0x1da>
jmp    1381 <flsa+0x211>
mov    %ecx,%edx
and    $0xfffffffe,%edx
xor    %eax,%eax
jmp    1964 <flsa+0x7f4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  %xmm1,0x8(%r14,%rax,8)
add    $0x2,%rax
cmp    %rax,%rdx
je     1696 <flsa+0x526>
movsd  (%r14,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
movapd %xmm0,%xmm1
ja     197e <flsa+0x80e>
ucomisd %xmm2,%xmm3
movapd %xmm3,%xmm1
jbe    1984 <flsa+0x814>
movsd  %xmm1,(%r14,%rax,8)
movsd  0x8(%r14,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
movapd %xmm0,%xmm1
ja     1950 <flsa+0x7e0>
ucomisd %xmm2,%xmm3
movapd %xmm3,%xmm1
ja     1950 <flsa+0x7e0>
jmp    1957 <flsa+0x7e7>

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

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