#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 DBL_EPSILON;
double fabs(double);
double pythag(int, double);
double sqrt(double);
int svd(double **_w, double *_s, int _nrows, int _ncols) {
  double e2;
  double tol;
  int i;
  int j;
  int col_rank;
  int slimit;
  int sweepi;
  int nrots;
  e2 = 8 * _nrows * DBL_EPSILON * DBL_EPSILON;
  tol = 0.125 * DBL_EPSILON;
  for (i = 0; i < _ncols; i++)
    for (j = 0; j < _ncols; j++)
      _w[i + _nrows][j] = i == j;
  col_rank = _ncols;
  slimit = _ncols > 24 ? _ncols >> 2 : 6;
  sweepi = 0;
  do {
    int k;
    nrots = 0;
    for (j = 0; j < col_rank - 1; j++)
      for (k = j + 1; k < col_rank; k++) {
        double vt;
        double ee;
        double ff;
        double gg;
        double c;
        double s;
        double x;
        double y;
        ff = ee = gg = 0;
        for (i = 0; i < _nrows; i++) {
          ee += _w[i][j] * _w[i][j];
          ff += _w[i][j] * _w[i][k];
          gg += _w[i][k] * _w[i][k];
        }
        _s[j] = ee;
        _s[k] = gg;
        if (ee >= gg) {
          if (ee <= e2 * _s[0] || fabs(ff) <= tol * ee)
            continue;
          ff /= ee;
          gg = 1 - gg / ee;
          vt = pythag(2 * ff, gg);
          c = sqrt(fabs(0.5 * (1 + gg / vt)));
          s = ff / (vt * c);
        } else {
          ff /= gg;
          ee = ee / gg - 1;
          vt = pythag(2 * ff, ee);
          s = sqrt(fabs(0.5 * (1 - ee / vt)));
          if (ff < 0)
            s = -s;
          c = ff / (vt * s);
        }
        for (i = 0; i < _nrows + _ncols; i++) {
          x = _w[i][j];
          y = _w[i][k];
          _w[i][j] = x * c + y * s;
          _w[i][k] = y * c - x * s;
        }
        nrots++;
      }
    while (col_rank > 1 && _s[col_rank - 1] <= _s[0] * tol + tol * tol)
      col_rank--;
  } while (nrots > 0 && ++sweepi <= slimit);
  return col_rank - (col_rank > 0 && _s[0] <= 0);
}


x86 assembly (clang, -O0):
<svd>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x3,%eax
mov    0x2ea2(%rip),%rcx
imul   (%rcx),%eax
mov    0x2e98(%rip),%rcx
imul   (%rcx),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    0x2e85(%rip),%rax
cvtsi2sdl (%rax),%xmm1
movsd  0xe91(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11eb <svd+0xcb>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11d8 <svd+0xb8>
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1192 <svd+0x72>
jmp    11dd <svd+0xbd>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    117f <svd+0x5f>
mov    -0x18(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x18,-0x18(%rbp)
jle    120c <svd+0xec>
mov    -0x18(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x8c(%rbp)
jmp    121c <svd+0xfc>
mov    $0x6,%eax
mov    %eax,-0x8c(%rbp)
jmp    121c <svd+0xfc>
mov    -0x8c(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    163a <svd+0x51a>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    1627 <svd+0x507>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    134d <svd+0x22d>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    127f <svd+0x15f>
movsd  -0x58(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jb     1468 <svd+0x348>
movsd  -0x58(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mulsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jae    13c1 <svd+0x2a1>
movsd  -0x60(%rbp),%xmm1
movaps 0xc77(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     13c6 <svd+0x2a6>
jmp    1619 <svd+0x4f9>
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x68(%rbp),%xmm1
divsd  -0x58(%rbp),%xmm1
movsd  0xc25(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xc1c(%rip),%xmm0
mulsd  -0x60(%rbp),%xmm0
cvttsd2si %xmm0,%edi
movsd  -0x68(%rbp),%xmm0
call   1030 <pythag@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x68(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  0xbea(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  0xbd6(%rip),%xmm0
mulsd  %xmm1,%xmm0
movaps 0xbe3(%rip),%xmm1
pand   %xmm1,%xmm0
call   1040 <sqrt@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
mulsd  -0x70(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1534 <svd+0x414>
movsd  -0x68(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
divsd  -0x68(%rbp),%xmm0
movsd  0xb83(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xb7a(%rip),%xmm0
mulsd  -0x60(%rbp),%xmm0
cvttsd2si %xmm0,%edi
movsd  -0x58(%rbp),%xmm0
call   1030 <pythag@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x58(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  0xb48(%rip),%xmm1
subsd  %xmm0,%xmm1
movsd  0xb34(%rip),%xmm0
mulsd  %xmm1,%xmm0
movaps 0xb41(%rip),%xmm1
pand   %xmm1,%xmm0
call   1040 <sqrt@plt>
movsd  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    151c <svd+0x3fc>
movsd  -0x78(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
mulsd  -0x78(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    1610 <svd+0x4f0>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x70(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  -0x78(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x44(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    153b <svd+0x41b>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1254 <svd+0x134>
jmp    162c <svd+0x50c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    123a <svd+0x11a>
jmp    163f <svd+0x51f>
xor    %eax,%eax
cmpl   $0x1,-0x34(%rbp)
mov    %al,-0x8d(%rbp)
jle    168f <svd+0x56f>
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x28(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm2
mulsd  -0x28(%rbp),%xmm2
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
setae  %al
mov    %al,-0x8d(%rbp)
mov    -0x8d(%rbp),%al
test   $0x1,%al
jne    16a2 <svd+0x582>
jmp    16b0 <svd+0x590>
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    163f <svd+0x51f>
jmp    16b5 <svd+0x595>
xor    %eax,%eax
cmpl   $0x0,-0x40(%rbp)
mov    %al,-0x8e(%rbp)
jle    16dc <svd+0x5bc>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
cmp    -0x38(%rbp),%eax
setle  %al
mov    %al,-0x8e(%rbp)
mov    -0x8e(%rbp),%al
test   $0x1,%al
jne    122c <svd+0x10c>
mov    -0x34(%rbp),%eax
mov    %eax,-0x94(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x34(%rbp)
mov    %al,-0x8f(%rbp)
jle    1719 <svd+0x5f9>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
setae  %al
mov    %al,-0x8f(%rbp)
mov    -0x94(%rbp),%eax
mov    -0x8f(%rbp),%cl
and    $0x1,%cl
movzbl %cl,%ecx
sub    %ecx,%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<svd>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %ecx,%r14d
mov    %rdi,%rbx
mov    0x2eaa(%rip),%rax
mov    (%rax),%eax
mov    %rdx,%rcx
mov    %rdx,0x8(%rsp)
mov    %edx,%r8d
imul   %eax,%r8d
imul   %eax,%r8d
cvtsi2sd %eax,%xmm0
shl    $0x3,%r8d
mulsd  0xe9d(%rip),%xmm0
movsd  %xmm0,0x30(%rsp)
test   %r14d,%r14d
jle    1252 <svd+0x132>
movslq 0x8(%rsp),%r9
mov    %r14d,%r11d
lea    -0x1(%r11),%r10
mov    %r11d,%edi
and    $0x3,%edi
mov    %r11d,%r15d
and    $0xfffffffc,%r15d
xor    %eax,%eax
movsd  0xe73(%rip),%xmm0
jmp    11ad <svd+0x8d>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rax
cmp    %r11,%rax
je     1252 <svd+0x132>
lea    (%rax,%r9,1),%rcx
mov    (%rbx,%rcx,8),%rcx
xor    %edx,%edx
cmp    $0x3,%r10
jae    11ff <svd+0xdf>
test   %rdi,%rdi
je     11a0 <svd+0x80>
lea    (%rcx,%rdx,8),%rcx
mov    %rax,%rbp
sub    %rdx,%rbp
xor    %edx,%edx
jmp    11de <svd+0xbe>
movsd  %xmm1,(%rcx,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rdi
je     11a0 <svd+0x80>
movapd %xmm0,%xmm1
cmp    %rdx,%rbp
je     11d0 <svd+0xb0>
xorpd  %xmm1,%xmm1
jmp    11d0 <svd+0xb0>
nopl   (%rax)
movsd  %xmm1,0x18(%rcx,%rdx,8)
add    $0x4,%rdx
cmp    %r15,%rdx
je     11bd <svd+0x9d>
movapd %xmm0,%xmm1
cmp    %rdx,%rax
je     120c <svd+0xec>
xorpd  %xmm1,%xmm1
movsd  %xmm1,(%rcx,%rdx,8)
lea    0x1(%rdx),%rbp
movapd %xmm0,%xmm1
cmp    %rbp,%rax
je     1222 <svd+0x102>
xorpd  %xmm1,%xmm1
movsd  %xmm1,0x8(%rcx,%rdx,8)
lea    0x2(%rdx),%rbp
movapd %xmm0,%xmm1
cmp    %rbp,%rax
je     1239 <svd+0x119>
xorpd  %xmm1,%xmm1
movsd  %xmm1,0x10(%rcx,%rdx,8)
lea    0x3(%rdx),%rbp
movapd %xmm0,%xmm1
cmp    %rbp,%rax
je     11f0 <svd+0xd0>
xorpd  %xmm1,%xmm1
jmp    11f0 <svd+0xd0>
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
movsd  %xmm0,0x90(%rsp)
mov    %r14d,%eax
sar    $0x2,%eax
cmp    $0x19,%r14d
mov    $0x6,%ecx
cmovge %eax,%ecx
mov    %ecx,0x3c(%rsp)
mov    0x8(%rsp),%r8
lea    (%r14,%r8,1),%ebp
movsd  0x30(%rsp),%xmm0
mulsd  %xmm0,%xmm0
movsd  %xmm0,0x68(%rsp)
mov    %r8d,%r13d
mov    %r13,0x88(%rsp)
and    $0xfffffffe,%r13d
xor    %eax,%eax
movapd 0xd85(%rip),%xmm5
mov    %rsi,0x10(%rsp)
mov    %rax,0x60(%rsp)
mov    $0x0,%r12d
mov    %r14,0x58(%rsp)
cmp    $0x2,%r14d
jl     1660 <svd+0x540>
mov    0x58(%rsp),%rax
lea    -0x1(%rax),%ecx
mov    %rcx,0x70(%rsp)
mov    %eax,%r9d
xor    %r15d,%r15d
mov    $0x1,%r14d
xor    %r12d,%r12d
mov    %r9,0x18(%rsp)
jmp    130c <svd+0x1ec>
nopl   (%rax)
mov    0x78(%rsp),%r14
add    $0x1,%r14
mov    0x80(%rsp),%r15
cmp    0x70(%rsp),%r15
je     1660 <svd+0x540>
lea    0x1(%r15),%rax
mov    %rax,0x80(%rsp)
cmp    %r9,%rax
mov    %r14,0x78(%rsp)
jb     133d <svd+0x21d>
jmp    12f0 <svd+0x1d0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r12d
add    $0x1,%r14
cmp    %r9,%r14
je     12f0 <svd+0x1d0>
test   %r8d,%r8d
jle    1490 <svd+0x370>
xorpd  %xmm6,%xmm6
xorpd  %xmm0,%xmm0
xor    %eax,%eax
cmp    $0x1,%r8d
je     13c6 <svd+0x2a6>
cs nopw 0x0(%rax,%rax,1)
mov    (%rbx,%rax,8),%rcx
mov    0x8(%rbx,%rax,8),%rdx
movsd  (%rcx,%r15,8),%xmm1
movsd  (%rcx,%r14,8),%xmm2
movapd %xmm2,%xmm3
unpcklpd %xmm1,%xmm3
mulsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm6,%xmm2
movsd  (%rdx,%r15,8),%xmm3
movsd  (%rdx,%r14,8),%xmm6
movapd %xmm6,%xmm4
unpcklpd %xmm3,%xmm4
movapd %xmm3,%xmm0
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
unpcklpd %xmm6,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm2,%xmm6
add    $0x2,%rax
cmp    %rax,%r13
jne    1360 <svd+0x240>
testb  $0x1,0x88(%rsp)
01
je     13fc <svd+0x2dc>
mov    (%rbx,%rax,8),%rax
movsd  (%rax,%r15,8),%xmm1
movsd  (%rax,%r14,8),%xmm2
movapd %xmm2,%xmm3
unpcklpd %xmm1,%xmm3
mulsd  %xmm1,%xmm1
addsd  %xmm1,%xmm0
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm2,%xmm6
movsd  %xmm0,(%rsi,%r15,8)
movlpd %xmm6,(%rsi,%r14,8)
ucomisd %xmm6,%xmm0
movapd %xmm6,%xmm1
unpckhpd %xmm6,%xmm1
jae    14b0 <svd+0x390>
divsd  %xmm6,%xmm1
divsd  %xmm6,%xmm0
addsd  0xbee(%rip),%xmm0
movapd %xmm0,0x20(%rsp)
movapd %xmm1,0x40(%rsp)
addsd  %xmm1,%xmm1
cvttsd2si %xmm1,%edi
call   1030 <pythag@plt>
movapd 0xbe5(%rip),%xmm5
movapd %xmm0,%xmm2
movapd 0x20(%rsp),%xmm1
divsd  %xmm0,%xmm1
movsd  0xba7(%rip),%xmm0
subsd  %xmm1,%xmm0
mulsd  0xba3(%rip),%xmm0
andpd  %xmm5,%xmm0
ucomisd 0xba7(%rip),%xmm0
jb     1558 <svd+0x438>
sqrtsd %xmm0,%xmm0
jmp    1571 <svd+0x451>
nopl   0x0(%rax,%rax,1)
movq   $0x0,(%rsi,%r15,8)
movq   $0x0,(%rsi,%r14,8)
xorpd  %xmm6,%xmm6
xorpd  %xmm3,%xmm3
xorpd  %xmm0,%xmm0
jmp    14b4 <svd+0x394>
xchg   %ax,%ax
movapd %xmm1,%xmm3
movsd  (%rsi),%xmm1
mulsd  0x90(%rsp),%xmm1
ucomisd %xmm0,%xmm1
jae    1334 <svd+0x214>
movapd %xmm3,%xmm1
andpd  %xmm5,%xmm1
movsd  0x30(%rsp),%xmm2
mulsd  %xmm0,%xmm2
ucomisd %xmm1,%xmm2
jae    1334 <svd+0x214>
divsd  %xmm0,%xmm3
divsd  %xmm0,%xmm6
movsd  0xb11(%rip),%xmm1
subsd  %xmm6,%xmm1
movapd %xmm1,0x20(%rsp)
movapd %xmm3,0x40(%rsp)
movapd %xmm3,%xmm0
addsd  %xmm3,%xmm0
cvttsd2si %xmm0,%edi
movapd %xmm1,%xmm0
call   1030 <pythag@plt>
movapd 0x20(%rsp),%xmm1
movapd 0xb06(%rip),%xmm5
divsd  %xmm0,%xmm1
addsd  0xad2(%rip),%xmm1
mulsd  0xad2(%rip),%xmm1
andpd  %xmm5,%xmm1
ucomisd 0xad6(%rip),%xmm1
jb     15bc <svd+0x49c>
xorps  %xmm6,%xmm6
sqrtsd %xmm1,%xmm6
jmp    15dd <svd+0x4bd>
movsd  %xmm2,0x20(%rsp)
call   1040 <sqrt@plt>
movsd  0x20(%rsp),%xmm2
movapd 0xabf(%rip),%xmm5
mov    0x8(%rsp),%r8
mov    0x10(%rsp),%rsi
mov    0x18(%rsp),%r9
movapd 0x40(%rsp),%xmm6
movapd %xmm0,%xmm1
xorpd  0xaae(%rip),%xmm1
movapd %xmm6,%xmm4
cmpltsd 0xa81(%rip),%xmm4
andpd  %xmm4,%xmm1
andnpd %xmm0,%xmm4
orpd   %xmm1,%xmm4
mulsd  %xmm4,%xmm2
divsd  %xmm2,%xmm6
test   %ebp,%ebp
jg     1602 <svd+0x4e2>
jmp    1330 <svd+0x210>
movsd  %xmm0,0x20(%rsp)
movapd %xmm1,%xmm0
call   1040 <sqrt@plt>
movapd 0xa5d(%rip),%xmm5
movapd %xmm0,%xmm6
movsd  0x20(%rsp),%xmm0
mov    0x8(%rsp),%r8
mov    0x10(%rsp),%rsi
mov    0x18(%rsp),%r9
movapd 0x40(%rsp),%xmm4
mulsd  %xmm6,%xmm0
divsd  %xmm0,%xmm4
test   %ebp,%ebp
jle    1330 <svd+0x210>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%rbx,%rax,8),%rcx
movsd  (%rcx,%r15,8),%xmm0
movsd  (%rcx,%r14,8),%xmm1
movapd %xmm4,%xmm2
mulsd  %xmm1,%xmm2
movapd %xmm4,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm6,%xmm0
addsd  %xmm2,%xmm0
movsd  %xmm0,(%rcx,%r15,8)
mulsd  %xmm6,%xmm1
subsd  %xmm3,%xmm1
movsd  %xmm1,(%rcx,%r14,8)
add    $0x1,%rax
cmp    %rax,%rbp
jne    1610 <svd+0x4f0>
jmp    1330 <svd+0x210>
nopw   0x0(%rax,%rax,1)
mov    0x58(%rsp),%r14
test   %r14d,%r14d
mov    $0x1,%eax
cmovle %r14d,%eax
lea    -0x1(%r14),%ecx
lea    (%rsi,%rcx,8),%rcx
mov    0x60(%rsp),%rdx
xchg   %ax,%ax
cmp    $0x2,%r14d
jl     16b0 <svd+0x590>
movsd  (%rsi),%xmm0
mulsd  0x30(%rsp),%xmm0
addsd  0x68(%rsp),%xmm0
add    $0xffffffff,%r14d
ucomisd (%rcx),%xmm0
lea    -0x8(%rcx),%rcx
jae    1680 <svd+0x560>
add    $0x1,%r14d
test   %r12d,%r12d
jg     16b8 <svd+0x598>
jmp    16c5 <svd+0x5a5>
nop
mov    %eax,%r14d
test   %r12d,%r12d
jle    16c5 <svd+0x5a5>
lea    0x1(%rdx),%eax
cmp    0x3c(%rsp),%edx
jl     12b0 <svd+0x190>
xor    %eax,%eax
test   %r14d,%r14d
jle    16d7 <svd+0x5b7>
xorpd  %xmm0,%xmm0
ucomisd (%rsi),%xmm0
adc    $0xffffffff,%eax
add    %r14d,%eax
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@DBL_EPSILON = global i32 0
define i32 @svd(double** nocapture %0, double* nocapture %1, i32 %2, i32 %3) {
%5 = shl nsw i32 %2, 3
%6 = load i32, i32* @DBL_EPSILON
%7 = mul nsw i32 %5, %6
%8 = mul nsw i32 %7, %6
%9 = sitofp i32 %8 to double
%10 = sitofp i32 %6 to double
%11 = fmul double %10, 1.250000e-01
%12 = icmp sgt i32 %3, 0
br i1 %12, label %13, label %61
13: ; preds = %4
%14 = sext i32 %2 to i64
%15 = zext i32 %3 to i64
%16 = add nsw i64 %15, -1
%17 = and i64 %15, 3
%18 = icmp ult i64 %16, 3
%19 = and i64 %15, 4294967292
%20 = icmp eq i64 %17, 0
br label %21
21: ; preds = %58, %13
%22 = phi i64 [ 0, %13 ], [ %59, %58 ]
%23 = add nsw i64 %22, %14
%24 = getelementptr inbounds double*, double** %0, i64 %23
%25 = load double*, double** %24
br i1 %18, label %47, label %26
26: ; preds = %21, %26
%27 = phi i64 [ %44, %26 ], [ 0, %21 ]
%28 = phi i64 [ %45, %26 ], [ 0, %21 ]
%29 = icmp eq i64 %22, %27
%30 = uitofp i1 %29 to double
%31 = getelementptr inbounds double, double* %25, i64 %27
store double %30, double* %31
%32 = or i64 %27, 1
%33 = icmp eq i64 %22, %32
%34 = uitofp i1 %33 to double
%35 = getelementptr inbounds double, double* %25, i64 %32
store double %34, double* %35
%36 = or i64 %27, 2
%37 = icmp eq i64 %22, %36
%38 = uitofp i1 %37 to double
%39 = getelementptr inbounds double, double* %25, i64 %36
store double %38, double* %39
%40 = or i64 %27, 3
%41 = icmp eq i64 %22, %40
%42 = uitofp i1 %41 to double
%43 = getelementptr inbounds double, double* %25, i64 %40
store double %42, double* %43
%44 = add nuw nsw i64 %27, 4
%45 = add i64 %28, 4
%46 = icmp eq i64 %45, %19
br i1 %46, label %47, label %26
47: ; preds = %26, %21
%48 = phi i64 [ 0, %21 ], [ %44, %26 ]
br i1 %20, label %58, label %49
49: ; preds = %47, %49
%50 = phi i64 [ %55, %49 ], [ %48, %47 ]
%51 = phi i64 [ %56, %49 ], [ 0, %47 ]
%52 = icmp eq i64 %22, %50
%53 = uitofp i1 %52 to double
%54 = getelementptr inbounds double, double* %25, i64 %50
store double %53, double* %54
%55 = add nuw nsw i64 %50, 1
%56 = add i64 %51, 1
%57 = icmp eq i64 %56, %17
br i1 %57, label %58, label %49
58: ; preds = %49, %47
%59 = add nuw nsw i64 %22, 1
%60 = icmp eq i64 %59, %15
br i1 %60, label %61, label %21
61: ; preds = %58, %4
%62 = icmp sgt i32 %3, 24
%63 = ashr i32 %3, 2
%64 = select i1 %62, i32 %63, i32 6
%65 = icmp sgt i32 %2, 0
%66 = add i32 %3, %2
%67 = icmp sgt i32 %66, 0
%68 = fmul double %11, %11
%69 = zext i32 %2 to i64
%70 = zext i32 %66 to i64
%71 = and i64 %69, 1
%72 = icmp eq i32 %2, 1
%73 = and i64 %69, 4294967294
%74 = icmp eq i64 %71, 0
br label %75
75: ; preds = %242, %61
%76 = phi i32 [ %3, %61 ], [ %243, %242 ]
%77 = phi i32 [ 0, %61 ], [ %245, %242 ]
%78 = icmp sgt i32 %76, 1
br i1 %78, label %79, label %88
79: ; preds = %75
%80 = add nsw i32 %76, -1
%81 = zext i32 %76 to i64
%82 = zext i32 %80 to i64
%83 = zext i32 %76 to i64
br label %92
84: ; preds = %224, %92
%85 = phi i32 [ %95, %92 ], [ %225, %224 ]
%86 = add nuw nsw i64 %94, 1
%87 = icmp eq i64 %96, %82
br i1 %87, label %88, label %92
88: ; preds = %84, %75
%89 = phi i32 [ 0, %75 ], [ %85, %84 ]
%90 = zext i32 %76 to i64
%91 = call i32 @llvm.smin.i32(i32 %76, i32 1)
br label %228
92: ; preds = %79, %84
%93 = phi i64 [ 0, %79 ], [ %96, %84 ]
%94 = phi i64 [ 1, %79 ], [ %86, %84 ]
%95 = phi i32 [ 0, %79 ], [ %85, %84 ]
%96 = add nuw nsw i64 %93, 1
%97 = icmp ult i64 %96, %81
br i1 %97, label %98, label %84
98: ; preds = %92
%99 = getelementptr inbounds double, double* %1, i64 %93
br label %100
100: ; preds = %98, %224
%101 = phi i64 [ %94, %98 ], [ %226, %224 ]
%102 = phi i32 [ %95, %98 ], [ %225, %224 ]
br i1 %65, label %103, label %104
103: ; preds = %100
br i1 %72, label %137, label %106
104: ; preds = %100
store double 0.000000e+00, double* %99
%105 = getelementptr inbounds double, double* %1, i64 %101
store double 0.000000e+00, double* %105
br label %162
106: ; preds = %103, %106
%107 = phi i64 [ %134, %106 ], [ 0, %103 ]
%108 = phi double [ %127, %106 ], [ 0.000000e+00, %103 ]
%109 = phi <2 x double> [ %133, %106 ], [ zeroinitializer, %103 ]
%110 = phi i64 [ %135, %106 ], [ 0, %103 ]
%111 = getelementptr inbounds double*, double** %0, i64 %107
%112 = load double*, double** %111
%113 = getelementptr inbounds double, double* %112, i64 %93
%114 = load double, double* %113
%115 = tail call double @llvm.fmuladd.f64(double %114, double %114, double %108)
%116 = getelementptr inbounds double, double* %112, i64 %101
%117 = load double, double* %116
%118 = insertelement <2 x double> poison, double %117, i64 0
%119 = insertelement <2 x double> %118, double %114, i64 1
%120 = shufflevector <2 x double> %118, <2 x double> poison, <2 x i32> zeroinitializer
%121 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %119, <2 x double> %120, <2 x double> %109)
%122 = or i64 %107, 1
%123 = getelementptr inbounds double*, double** %0, i64 %122
%124 = load double*, double** %123
%125 = getelementptr inbounds double, double* %124, i64 %93
%126 = load double, double* %125
%127 = tail call double @llvm.fmuladd.f64(double %126, double %126, double %115)
%128 = getelementptr inbounds double, double* %124, i64 %101
%129 = load double, double* %128
%130 = insertelement <2 x double> poison, double %129, i64 0
%131 = insertelement <2 x double> %130, double %126, i64 1
%132 = shufflevector <2 x double> %130, <2 x double> poison, <2 x i32> zeroinitializer
%133 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %131, <2 x double> %132, <2 x double> %121)
%134 = add nuw nsw i64 %107, 2
%135 = add i64 %110, 2
%136 = icmp eq i64 %135, %73
br i1 %136, label %137, label %106
137: ; preds = %106, %103
%138 = phi double [ undef, %103 ], [ %127, %106 ]
%139 = phi <2 x double> [ undef, %103 ], [ %133, %106 ]
%140 = phi i64 [ 0, %103 ], [ %134, %106 ]
%141 = phi double [ 0.000000e+00, %103 ], [ %127, %106 ]
%142 = phi <2 x double> [ zeroinitializer, %103 ], [ %133, %106 ]
br i1 %74, label %155, label %143
143: ; preds = %137
%144 = getelementptr inbounds double*, double** %0, i64 %140
%145 = load double*, double** %144
%146 = getelementptr inbounds double, double* %145, i64 %93
%147 = load double, double* %146
%148 = tail call double @llvm.fmuladd.f64(double %147, double %147, double %141)
%149 = getelementptr inbounds double, double* %145, i64 %101
%150 = load double, double* %149
%151 = insertelement <2 x double> poison, double %150, i64 0
%152 = insertelement <2 x double> %151, double %147, i64 1
%153 = shufflevector <2 x double> %151, <2 x double> poison, <2 x i32> zeroinitializer
%154 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %152, <2 x double> %153, <2 x double> %142)
br label %155
155: ; preds = %137, %143
%156 = phi double [ %138, %137 ], [ %148, %143 ]
%157 = phi <2 x double> [ %139, %137 ], [ %154, %143 ]
store double %156, double* %99
%158 = getelementptr inbounds double, double* %1, i64 %101
%159 = extractelement <2 x double> %157, i64 0
store double %159, double* %158
%160 = fcmp ult double %156, %159
%161 = extractelement <2 x double> %157, i64 1
br i1 %160, label %187, label %162
162: ; preds = %104, %155
%163 = phi double [ 0.000000e+00, %104 ], [ %159, %155 ]
%164 = phi double [ 0.000000e+00, %104 ], [ %161, %155 ]
%165 = phi double [ 0.000000e+00, %104 ], [ %156, %155 ]
%166 = load double, double* %1
%167 = fmul double %166, %9
%168 = fcmp ugt double %165, %167
br i1 %168, label %169, label %224
169: ; preds = %162
%170 = tail call double @llvm.fabs.f64(double %164)
%171 = fmul double %11, %165
%172 = fcmp ugt double %170, %171
br i1 %172, label %173, label %224
173: ; preds = %169
%174 = fdiv double %164, %165
%175 = fdiv double %163, %165
%176 = fsub double 1.000000e+00, %175
%177 = fmul double %174, 2.000000e+00
%178 = fptosi double %177 to i32
%179 = tail call double @pythag(i32 %178, double %176)
%180 = fdiv double %176, %179
%181 = fadd double %180, 1.000000e+00
%182 = fmul double %181, 5.000000e-01
%183 = tail call double @llvm.fabs.f64(double %182)
%184 = tail call double @sqrt(double %183)
%185 = fmul double %179, %184
%186 = fdiv double %174, %185
br label %204
187: ; preds = %155
%188 = fdiv double %161, %159
%189 = fdiv double %156, %159
%190 = fadd double %189, -1.000000e+00
%191 = fmul double %188, 2.000000e+00
%192 = fptosi double %191 to i32
%193 = tail call double @pythag(i32 %192, double %190)
%194 = fdiv double %190, %193
%195 = fsub double 1.000000e+00, %194
%196 = fmul double %195, 5.000000e-01
%197 = tail call double @llvm.fabs.f64(double %196)
%198 = tail call double @sqrt(double %197)
%199 = fcmp olt double %188, 0.000000e+00
%200 = fneg double %198
%201 = select i1 %199, double %200, double %198
%202 = fmul double %193, %201
%203 = fdiv double %188, %202
br label %204
204: ; preds = %187, %173
%205 = phi double [ %184, %173 ], [ %203, %187 ]
%206 = phi double [ %186, %173 ], [ %201, %187 ]
br i1 %67, label %207, label %222
207: ; preds = %204, %207
%208 = phi i64 [ %220, %207 ], [ 0, %204 ]
%209 = getelementptr inbounds double*, double** %0, i64 %208
%210 = load double*, double** %209
%211 = getelementptr inbounds double, double* %210, i64 %93
%212 = load double, double* %211
%213 = getelementptr inbounds double, double* %210, i64 %101
%214 = load double, double* %213
%215 = fmul double %206, %214
%216 = tail call double @llvm.fmuladd.f64(double %212, double %205, double %215)
store double %216, double* %211
%217 = fneg double %212
%218 = fmul double %206, %217
%219 = tail call double @llvm.fmuladd.f64(double %214, double %205, double %218)
store double %219, double* %213
%220 = add nuw nsw i64 %208, 1
%221 = icmp eq i64 %220, %70
br i1 %221, label %222, label %207
222: ; preds = %207, %204
%223 = add nsw i32 %102, 1
br label %224
224: ; preds = %162, %169, %222
%225 = phi i32 [ %223, %222 ], [ %102, %169 ], [ %102, %162 ]
%226 = add nuw nsw i64 %101, 1
%227 = icmp eq i64 %226, %83
br i1 %227, label %84, label %100
228: ; preds = %88, %232
%229 = phi i64 [ %90, %88 ], [ %233, %232 ]
%230 = trunc i64 %229 to i32
%231 = icmp sgt i32 %230, 1
br i1 %231, label %232, label %242
232: ; preds = %228
%233 = add nsw i64 %229, -1
%234 = and i64 %233, 4294967295
%235 = getelementptr inbounds double, double* %1, i64 %234
%236 = load double, double* %235
%237 = load double, double* %1
%238 = tail call double @llvm.fmuladd.f64(double %237, double %11, double %68)
%239 = fcmp ugt double %236, %238
br i1 %239, label %240, label %228
240: ; preds = %232
%241 = trunc i64 %229 to i32
br label %242
242: ; preds = %228, %240
%243 = phi i32 [ %241, %240 ], [ %91, %228 ]
%244 = icmp sgt i32 %89, 0
%245 = add nuw nsw i32 %77, 1
%246 = icmp slt i32 %77, %64
%247 = select i1 %244, i1 %246, i1 false
br i1 %247, label %75, label %248
248: ; preds = %242
%249 = icmp sgt i32 %243, 0
br i1 %249, label %250, label %254
250: ; preds = %248
%251 = load double, double* %1
%252 = fcmp ole double %251, 0.000000e+00
%253 = sext i1 %252 to i32
br label %254
254: ; preds = %250, %248
%255 = phi i32 [ 0, %248 ], [ %253, %250 ]
%256 = add i32 %255, %243
ret i32 %256
}