void reduction(a, n) double **a;
int n;
{
  int m, j, i;
  double y, x;
  for (m = 2; m < n; m++) {
    x = 0.0;
    i = m;
    for (j = m; j <= n; j++) {
      if (fabs(a[j][m - 1]) > fabs(x)) {
        x = a[j][m - 1];
        i = j;
      }
    }
    if (i != m) {
      for (j = m - 1; j <= n; j++) {
        y = (a[i][j]);
        (a[i][j]) = (a[m][j]);
        (a[m][j]) = y;
      }
      for (j = 1; j <= n; j++) {
        y = (a[j][i]);
        (a[j][i]) = (a[j][m]);
        (a[j][m]) = y;
      }
      a[j][i] = a[j][i];
    }
    if (x) {
      for (i = m + 1; i <= n; i++) {
        if (y = a[i][m - 1]) {
          y /= x;
          a[i][m - 1] = y;
          for (j = m; j <= n; j++)
            a[i][j] -= y * a[m][j];
          for (j = 1; j <= n; j++)
            a[j][m] += y * a[j][i];
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<reduction>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x2,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1486 <reduction+0x386>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     11b5 <reduction+0xb5>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xea1(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
movaps 0xe91(%rip),%xmm2
pand   %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    11a2 <reduction+0xa2>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    11a7 <reduction+0xa7>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1132 <reduction+0x32>
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
je     12eb <reduction+0x1eb>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1242 <reduction+0x142>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11ca <reduction+0xca>
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     12c1 <reduction+0x1c1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x10(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1249 <reduction+0x149>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1308 <reduction+0x208>
jp     1308 <reduction+0x208>
jmp    1473 <reduction+0x373>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     146e <reduction+0x36e>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1354 <reduction+0x254>
jp     1354 <reduction+0x254>
jmp    145b <reduction+0x35b>
movsd  -0x28(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     13f9 <reduction+0x2f9>
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movq   %xmm0,%rdx
movabs $0x8000000000000000,%rsi
xor    %rsi,%rdx
movq   %rdx,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    138c <reduction+0x28c>
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1456 <reduction+0x356>
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1400 <reduction+0x300>
jmp    145b <reduction+0x35b>
jmp    1460 <reduction+0x360>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1311 <reduction+0x211>
jmp    1473 <reduction+0x373>
jmp    1478 <reduction+0x378>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1112 <reduction+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<reduction>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
cmp    $0x3,%esi
jl     1749 <reduction+0x649>
mov    %rsi,%rax
mov    %eax,%r8d
lea    0x1(%r8),%r15
add    $0xffffffff,%eax
mov    %rax,-0x48(%rsp)
lea    -0x1(%r8),%r12
mov    %r8,%rbp
not    %rbp
lea    -0x4(%r8),%r14
mov    %r8d,%eax
and    $0xfffffffe,%eax
neg    %rax
lea    -0x5(%r8),%rcx
mov    $0x2,%r13d
mov    $0x1,%r9d
mov    $0x7,%edx
mov    %rdx,-0x60(%rsp)
mov    $0x8,%r10d
xor    %ebx,%ebx
movapd 0xe99(%rip),%xmm10
xorpd  %xmm9,%xmm9
movapd 0xe9b(%rip),%xmm8
mov    %r12,-0x78(%rsp)
mov    %rbp,-0x58(%rsp)
jmp    11cd <reduction+0xcd>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13
mov    -0x30(%rsp),%r9
add    $0x1,%r9
mov    -0x40(%rsp),%rbx
add    $0x1,%rbx
addq   $0x1,-0x60(%rsp)
mov    -0x20(%rsp),%r14
add    $0xffffffffffffffff,%r14
add    $0x1,%r10
mov    -0x28(%rsp),%rcx
add    $0xffffffffffffffff,%rcx
cmp    -0x48(%rsp),%r9
je     1749 <reduction+0x649>
mov    %r10,-0x38(%rsp)
mov    %rcx,-0x28(%rsp)
shr    $0x2,%rcx
add    $0x1,%rcx
and    $0xfffffffffffffffe,%rcx
mov    %rcx,-0x18(%rsp)
mov    %r14,-0x20(%rsp)
shr    $0x2,%r14
add    $0x1,%r14
and    $0xfffffffffffffffe,%r14
sub    %rbx,%r12
mov    %r12,-0x68(%rsp)
lea    -0x4(%r12),%rcx
mov    %rcx,-0x8(%rsp)
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rsp)
mov    %rbx,%r10
not    %r10
lea    (%r10,%r15,1),%r11
add    $0xfffffffffffffffc,%r11
add    %r15,%r10
mov    %r11,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %r13,%rsi
xorpd  %xmm4,%xmm4
mov    %r13d,%ecx
movapd %xmm4,%xmm11
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdi,%rsi,8),%rbp
movsd  -0x8(%rbp,%r13,8),%xmm5
movapd %xmm5,%xmm6
andpd  %xmm10,%xmm6
andpd  %xmm10,%xmm11
ucomisd %xmm11,%xmm6
cmova  %esi,%ecx
cmpltsd %xmm6,%xmm11
andpd  %xmm11,%xmm5
andnpd %xmm4,%xmm11
orpd   %xmm5,%xmm11
add    $0x1,%rsi
movapd %xmm11,%xmm4
cmp    %rsi,%r15
jne    1250 <reduction+0x150>
mov    %rbx,-0x40(%rsp)
mov    %ecx,%esi
cmp    %rsi,%r13
je     14b7 <reduction+0x3b7>
mov    %r11,-0x50(%rsp)
mov    %rdx,-0x70(%rsp)
movslq %ecx,%rbx
mov    (%rdi,%rbx,8),%r11
mov    (%rdi,%r13,8),%rsi
mov    %r9,%r12
cmp    $0x4,%r10
jb     13c0 <reduction+0x2c0>
lea    (%r11,%r9,8),%rcx
lea    (%rsi,%r15,8),%rbp
cmp    %rbp,%rcx
jae    12e7 <reduction+0x1e7>
lea    (%r11,%r15,8),%rcx
lea    (%rsi,%r9,8),%rbp
mov    %r9,%r12
cmp    %rcx,%rbp
jb     13c0 <reduction+0x2c0>
cmpq   $0x4,-0x50(%rsp)
jae    12f3 <reduction+0x1f3>
xor    %edx,%edx
jmp    1370 <reduction+0x270>
mov    -0x60(%rsp),%rdx
lea    (%rsi,%rdx,8),%rcx
lea    (%r11,%rdx,8),%rbp
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x30(%rbp,%rdx,8),%xmm4
movups -0x20(%rbp,%rdx,8),%xmm5
movups -0x30(%rcx,%rdx,8),%xmm6
movups -0x20(%rcx,%rdx,8),%xmm7
movups %xmm6,-0x30(%rbp,%rdx,8)
movups %xmm7,-0x20(%rbp,%rdx,8)
movups %xmm4,-0x30(%rcx,%rdx,8)
movups %xmm5,-0x20(%rcx,%rdx,8)
movupd -0x10(%rbp,%rdx,8),%xmm4
movupd 0x0(%rbp,%rdx,8),%xmm5
movupd -0x10(%rcx,%rdx,8),%xmm6
movupd (%rcx,%rdx,8),%xmm7
movupd %xmm6,-0x10(%rbp,%rdx,8)
movupd %xmm7,0x0(%rbp,%rdx,8)
movupd %xmm4,-0x10(%rcx,%rdx,8)
movupd %xmm5,(%rcx,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%r14
jne    1310 <reduction+0x210>
mov    %r10,%r12
and    $0xfffffffffffffffc,%r12
testb  $0x1,-0x70(%rsp)
je     13b1 <reduction+0x2b1>
add    %r9,%rdx
movupd (%r11,%rdx,8),%xmm4
movupd 0x10(%r11,%rdx,8),%xmm5
movupd (%rsi,%rdx,8),%xmm6
movupd 0x10(%rsi,%rdx,8),%xmm7
movupd %xmm6,(%r11,%rdx,8)
movupd %xmm7,0x10(%r11,%rdx,8)
movupd %xmm4,(%rsi,%rdx,8)
movupd %xmm5,0x10(%rsi,%rdx,8)
cmp    %r12,%r10
mov    -0x78(%rsp),%rdx
je     1439 <reduction+0x339>
add    %r9,%r12
xchg   %ax,%ax
mov    %r15d,%edx
sub    %r12d,%edx
mov    %r12,%rcx
test   $0x1,%dl
je     13eb <reduction+0x2eb>
movsd  (%r11,%r12,8),%xmm4
movsd  (%rsi,%r12,8),%xmm5
movsd  %xmm5,(%r11,%r12,8)
movsd  %xmm4,(%rsi,%r12,8)
lea    0x1(%r12),%rcx
cmp    %r12,%r8
mov    -0x78(%rsp),%rdx
je     1439 <reduction+0x339>
cs nopw 0x0(%rax,%rax,1)
nop
movsd  (%r11,%rcx,8),%xmm4
movsd  (%rsi,%rcx,8),%xmm5
movsd  %xmm5,(%r11,%rcx,8)
movsd  %xmm4,(%rsi,%rcx,8)
movsd  0x8(%r11,%rcx,8),%xmm4
movsd  0x8(%rsi,%rcx,8),%xmm5
movsd  %xmm5,0x8(%r11,%rcx,8)
movsd  %xmm4,0x8(%rsi,%rcx,8)
add    $0x2,%rcx
cmp    %rcx,%r15
jne    1400 <reduction+0x300>
mov    $0x1,%ecx
test   %rdx,%rdx
je     1497 <reduction+0x397>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%rdi,%rcx,8),%rdx
movsd  (%rdx,%rbx,8),%xmm4
movsd  (%rdx,%r13,8),%xmm5
movsd  %xmm5,(%rdx,%rbx,8)
movsd  %xmm4,(%rdx,%r13,8)
mov    0x8(%rdi,%rcx,8),%rdx
movsd  (%rdx,%rbx,8),%xmm4
movsd  (%rdx,%r13,8),%xmm5
movsd  %xmm5,(%rdx,%rbx,8)
movsd  %xmm4,(%rdx,%r13,8)
lea    (%rax,%rcx,1),%rdx
add    $0x2,%rdx
add    $0x2,%rcx
cmp    $0x1,%rdx
jne    1450 <reduction+0x350>
test   $0x1,%r8b
je     14b7 <reduction+0x3b7>
mov    (%rdi,%rcx,8),%rcx
movsd  (%rcx,%rbx,8),%xmm4
movsd  (%rcx,%r13,8),%xmm5
movsd  %xmm5,(%rcx,%rbx,8)
movsd  %xmm4,(%rcx,%r13,8)
mov    %r9,-0x30(%rsp)
ucomisd %xmm9,%xmm11
mov    -0x78(%rsp),%r12
mov    -0x58(%rsp),%rbp
mov    -0x38(%rsp),%r10
jne    14d8 <reduction+0x3d8>
jnp    1190 <reduction+0x90>
mov    -0x68(%rsp),%r9
and    $0xfffffffffffffffc,%r9
lea    (%r9,%r13,1),%rcx
mov    %rcx,-0x70(%rsp)
mov    %r13,%rbx
jmp    14f9 <reduction+0x3f9>
nop
cmp    %r8,%rbx
je     1190 <reduction+0x90>
mov    0x8(%rdi,%rbx,8),%r14
add    $0x1,%rbx
movsd  -0x8(%r14,%r13,8),%xmm4
ucomisd %xmm9,%xmm4
jne    1512 <reduction+0x412>
jnp    14f0 <reduction+0x3f0>
divsd  %xmm11,%xmm4
movsd  %xmm4,-0x8(%r14,%r13,8)
mov    (%rdi,%r13,8),%r11
movapd %xmm4,%xmm5
xorpd  %xmm8,%xmm5
mov    %r13,%rcx
cmpq   $0x4,-0x68(%rsp)
jb     1660 <reduction+0x560>
lea    (%r14,%r13,8),%rcx
lea    (%r11,%r15,8),%rdx
cmp    %rdx,%rcx
jae    155b <reduction+0x45b>
lea    (%r14,%r15,8),%rdx
lea    (%r11,%r13,8),%rsi
mov    %r13,%rcx
cmp    %rdx,%rsi
jb     1660 <reduction+0x560>
movapd %xmm5,%xmm6
unpcklpd %xmm5,%xmm6
cmpq   $0x4,-0x8(%rsp)
jae    1572 <reduction+0x472>
xor    %edx,%edx
jmp    1600 <reduction+0x500>
lea    (%r14,%r10,8),%rsi
lea    (%r11,%r10,8),%rbp
mov    -0x18(%rsp),%rcx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movupd -0x30(%rbp,%rdx,8),%xmm7
movupd -0x20(%rbp,%rdx,8),%xmm2
mulpd  %xmm6,%xmm7
movupd -0x30(%rsi,%rdx,8),%xmm1
addpd  %xmm7,%xmm1
movupd -0x20(%rsi,%rdx,8),%xmm7
movupd -0x10(%rsi,%rdx,8),%xmm0
movupd (%rsi,%rdx,8),%xmm3
mulpd  %xmm6,%xmm2
addpd  %xmm7,%xmm2
movupd %xmm1,-0x30(%rsi,%rdx,8)
movupd %xmm2,-0x20(%rsi,%rdx,8)
movupd -0x10(%rbp,%rdx,8),%xmm1
movupd 0x0(%rbp,%rdx,8),%xmm2
mulpd  %xmm6,%xmm1
addpd  %xmm0,%xmm1
mulpd  %xmm6,%xmm2
addpd  %xmm3,%xmm2
movupd %xmm1,-0x10(%rsi,%rdx,8)
movupd %xmm2,(%rsi,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rcx
jne    1590 <reduction+0x490>
testb  $0x1,-0x10(%rsp)
mov    -0x58(%rsp),%rbp
je     1646 <reduction+0x546>
add    %r13,%rdx
movupd (%r11,%rdx,8),%xmm0
movupd 0x10(%r11,%rdx,8),%xmm1
movupd (%r14,%rdx,8),%xmm2
movupd 0x10(%r14,%rdx,8),%xmm3
mulpd  %xmm6,%xmm0
addpd  %xmm2,%xmm0
mulpd  %xmm6,%xmm1
addpd  %xmm3,%xmm1
movupd %xmm0,(%r14,%rdx,8)
movupd %xmm1,0x10(%r14,%rdx,8)
mov    -0x70(%rsp),%rcx
cmp    %r9,-0x68(%rsp)
je     16c8 <reduction+0x5c8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r15d,%esi
sub    %ecx,%esi
mov    %rcx,%rdx
test   $0x1,%sil
je     1688 <reduction+0x588>
movsd  (%r11,%rcx,8),%xmm0
mulsd  %xmm5,%xmm0
addsd  (%r14,%rcx,8),%xmm0
movsd  %xmm0,(%r14,%rcx,8)
lea    0x1(%rcx),%rdx
not    %rcx
cmp    %rbp,%rcx
je     16c8 <reduction+0x5c8>
movsd  (%r11,%rdx,8),%xmm0
mulsd  %xmm5,%xmm0
addsd  (%r14,%rdx,8),%xmm0
movsd  %xmm0,(%r14,%rdx,8)
movsd  0x8(%r11,%rdx,8),%xmm0
mulsd  %xmm5,%xmm0
addsd  0x8(%r14,%rdx,8),%xmm0
movsd  %xmm0,0x8(%r14,%rdx,8)
add    $0x2,%rdx
cmp    %rdx,%r15
jne    1690 <reduction+0x590>
mov    $0x1,%ecx
test   %r12,%r12
je     1725 <reduction+0x625>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    (%rdi,%rcx,8),%rdx
movsd  (%rdx,%rbx,8),%xmm0
mulsd  %xmm4,%xmm0
addsd  (%rdx,%r13,8),%xmm0
movsd  %xmm0,(%rdx,%r13,8)
mov    0x8(%rdi,%rcx,8),%rdx
movsd  (%rdx,%rbx,8),%xmm0
mulsd  %xmm4,%xmm0
addsd  (%rdx,%r13,8),%xmm0
movsd  %xmm0,(%rdx,%r13,8)
lea    (%rax,%rcx,1),%rdx
add    $0x2,%rdx
add    $0x2,%rcx
cmp    $0x1,%rdx
jne    16e0 <reduction+0x5e0>
test   $0x1,%r8b
je     14f0 <reduction+0x3f0>
mov    (%rdi,%rcx,8),%rcx
mulsd  (%rcx,%rbx,8),%xmm4
addsd  (%rcx,%r13,8),%xmm4
movsd  %xmm4,(%rcx,%r13,8)
jmp    14f0 <reduction+0x3f0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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