int DiagMatrix(double *mat, int n) {
  int N = n + 1;
  int i, j, k;
  double im;
  for (i = 0; i < n; i++) {
    if (mat[i * N + i] == 0.)
      for (j = i + 1; j < n; j++) {
        if (mat[j * N + i] == 0. && j == (n - 1))
          return 1;
        if (mat[j * N + i] != 0.) {
          j = n;
          for (k = i; k < N; k++) {
            im = mat[j * N + k];
            mat[j * N + k] = mat[i * N + k];
            mat[i * N + k] = im;
          }
        }
      }
    for (j = 0; j < n; j++)
      if (i != j && mat[j * N + i] != 0.) {
        im = mat[j * N + i] / mat[i * N + i];
        for (k = i + 1; k < N; k++)
          mat[j * N + k] -= mat[i * N + k] * im;
      }
  }
  for (i = 0; i < n; i++)
    mat[i] = mat[i * N + n] / mat[i * N + i];
  return 0;
}


x86 assembly (clang, -O0):
<DiagMatrix>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    139f <DiagMatrix+0x29f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    127e <DiagMatrix+0x17e>
jp     127e <DiagMatrix+0x17e>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1279 <DiagMatrix+0x179>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11ab <DiagMatrix+0xab>
jp     11ab <DiagMatrix+0xab>
mov    -0x20(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    11ab <DiagMatrix+0xab>
movl   $0x1,-0x4(%rbp)
jmp    1400 <DiagMatrix+0x300>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11d9 <DiagMatrix+0xd9>
jp     11d9 <DiagMatrix+0xd9>
jmp    1266 <DiagMatrix+0x166>
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1261 <DiagMatrix+0x161>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x30(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11e5 <DiagMatrix+0xe5>
jmp    1266 <DiagMatrix+0x166>
jmp    126b <DiagMatrix+0x16b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1159 <DiagMatrix+0x59>
jmp    127e <DiagMatrix+0x17e>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    138c <DiagMatrix+0x28c>
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
je     1379 <DiagMatrix+0x279>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12cb <DiagMatrix+0x1cb>
jp     12cb <DiagMatrix+0x1cb>
jmp    1379 <DiagMatrix+0x279>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1374 <DiagMatrix+0x274>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x30(%rbp),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%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    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1305 <DiagMatrix+0x205>
jmp    1379 <DiagMatrix+0x279>
jmp    137e <DiagMatrix+0x27e>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1285 <DiagMatrix+0x185>
jmp    1391 <DiagMatrix+0x291>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    111b <DiagMatrix+0x1b>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13f9 <DiagMatrix+0x2f9>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    13a6 <DiagMatrix+0x2a6>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<DiagMatrix>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
test   %esi,%esi
jle    176b <DiagMatrix+0x66b>
lea    0x1(%rsi),%ebx
lea    -0x1(%rsi),%r8d
mov    %ebx,%eax
imul   %esi,%eax
movslq %eax,%rcx
movslq %ebx,%rax
mov    %esi,%r15d
mov    %eax,%r11d
lea    0x1(%r15),%rdx
mov    %rdx,(%rsp)
lea    0x8(%rdi),%rdx
lea    0x0(,%rax,8),%r9
mov    %rax,0x8(%rsp)
lea    0x8(,%rax,8),%rbp
lea    (%rcx,%r11,1),%rax
lea    (%rdi,%rax,8),%rax
mov    %rax,0x10(%rsp)
mov    %r11,%rax
neg    %rax
mov    %rax,0x48(%rsp)
mov    %r15,%rax
neg    %rax
mov    %rax,0x58(%rsp)
lea    0x30(%rdi),%r12
mov    %rcx,-0x50(%rsp)
lea    (%rdi,%rcx,8),%r13
add    $0x30,%r13
xorpd  %xmm0,%xmm0
lea    -0x4(%r11),%rax
mov    %rax,-0x20(%rsp)
lea    0x18(%rdi),%r14
lea    0x10(%rdi),%r10
xor    %ecx,%ecx
mov    %r14,-0x10(%rsp)
mov    %r15,-0x18(%rsp)
mov    %rdx,0x28(%rsp)
mov    %r13,0x40(%rsp)
mov    %rdi,-0x68(%rsp)
mov    %r11,-0x58(%rsp)
mov    %ebx,-0x24(%rsp)
mov    %r9,0x50(%rsp)
mov    %rsi,0x30(%rsp)
mov    %r8d,-0x28(%rsp)
mov    %rbp,0x20(%rsp)
jmp    1230 <DiagMatrix+0x130>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x20(%rsp),%rbp
add    %rbp,%r12
add    $0x8,%r13
addq   $0xffffffffffffffff,-0x20(%rsp)
mov    -0x8(%rsp),%rdx
add    %r9,%rdx
addq   $0xffffffffffffffff,-0x18(%rsp)
addq   $0x8,-0x10(%rsp)
add    %rbp,%r14
add    %r9,%r10
mov    -0x70(%rsp),%rax
mov    %rax,%rcx
cmp    %r15,%rax
mov    -0x24(%rsp),%ebx
mov    0x30(%rsp),%rsi
mov    -0x28(%rsp),%r8d
mov    -0x58(%rsp),%r11
je     172b <DiagMatrix+0x62b>
mov    %rdx,-0x8(%rsp)
imul   %rcx,%rbp
mov    %rbp,-0x30(%rsp)
mov    %rcx,%rdx
mov    0x8(%rsp),%rax
imul   %rax,%rdx
mov    %rdx,-0x60(%rsp)
imul   %ecx,%eax
cltq
add    %rcx,%rax
mov    %rax,0x60(%rsp)
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
mov    %rcx,%rbp
mov    %rcx,%rax
mov    %rcx,-0x80(%rsp)
jne    1520 <DiagMatrix+0x420>
jp     1520 <DiagMatrix+0x420>
lea    0x1(%rbp),%rax
cmp    %r15,%rax
jae    1520 <DiagMatrix+0x420>
mov    -0x20(%rsp),%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
and    $0xfffffffffffffffe,%rcx
mov    %rcx,0x18(%rsp)
sub    %rbp,%r11
lea    -0x4(%r11),%rcx
mov    %rcx,-0x38(%rsp)
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %rcx,-0x40(%rsp)
mov    -0x50(%rsp),%rcx
add    %rbp,%rcx
lea    (%rdi,%rcx,8),%rcx
mov    -0x30(%rsp),%rdx
add    %rdi,%rdx
mov    %rdx,-0x78(%rsp)
mov    -0x58(%rsp),%rdx
mov    -0x60(%rsp),%rbp
add    %rdx,%rbp
lea    (%rdi,%rbp,8),%rbp
cmp    %rbp,%rcx
mov    -0x80(%rsp),%rbp
setb   -0x70(%rsp)
mov    -0x78(%rsp),%rcx
cmp    0x10(%rsp),%rcx
mov    -0x58(%rsp),%rdx
setb   %cl
and    -0x70(%rsp),%cl
mov    %cl,-0x70(%rsp)
mov    %r11,-0x78(%rsp)
and    $0xfffffffffffffffc,%r11
mov    %r11,-0x48(%rsp)
lea    (%r11,%rbp,1),%rcx
mov    %rcx,0x38(%rsp)
jmp    1348 <DiagMatrix+0x248>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
ucomisd %xmm0,%xmm1
jne    1370 <DiagMatrix+0x270>
jp     1370 <DiagMatrix+0x270>
add    $0x1,%eax
cmp    %esi,%eax
mov    -0x80(%rsp),%rbp
jge    1520 <DiagMatrix+0x420>
mov    %eax,%ecx
imul   %ebx,%ecx
movslq %ecx,%rcx
add    %rbp,%rcx
movsd  (%rdi,%rcx,8),%xmm1
ucomisd %xmm0,%xmm1
jne    1330 <DiagMatrix+0x230>
jp     1330 <DiagMatrix+0x230>
cmp    %r8d,%eax
jne    1330 <DiagMatrix+0x230>
jmp    1724 <DiagMatrix+0x624>
nopw   0x0(%rax,%rax,1)
cmpq   $0x4,-0x78(%rsp)
setb   %al
or     -0x70(%rsp),%al
jne    147a <DiagMatrix+0x37a>
cmpq   $0x4,-0x38(%rsp)
jae    1397 <DiagMatrix+0x297>
xor    %eax,%eax
mov    -0x80(%rsp),%rbp
jmp    1420 <DiagMatrix+0x320>
mov    0x18(%rsp),%rcx
xor    %eax,%eax
mov    -0x80(%rsp),%rbp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x30(%r13,%rax,8),%xmm1
movups -0x20(%r13,%rax,8),%xmm2
movups -0x30(%r12,%rax,8),%xmm3
movups -0x20(%r12,%rax,8),%xmm4
movups %xmm3,-0x30(%r13,%rax,8)
movups %xmm4,-0x20(%r13,%rax,8)
movups %xmm1,-0x30(%r12,%rax,8)
movups %xmm2,-0x20(%r12,%rax,8)
movupd -0x10(%r13,%rax,8),%xmm1
movupd 0x0(%r13,%rax,8),%xmm2
movupd -0x10(%r12,%rax,8),%xmm3
movupd (%r12,%rax,8),%xmm4
movupd %xmm3,-0x10(%r13,%rax,8)
movupd %xmm4,0x0(%r13,%rax,8)
movupd %xmm1,-0x10(%r12,%rax,8)
movupd %xmm2,(%r12,%rax,8)
add    $0x8,%rax
add    $0xfffffffffffffffe,%rcx
jne    13b0 <DiagMatrix+0x2b0>
testb  $0x1,-0x40(%rsp)
je     1463 <DiagMatrix+0x363>
add    %rbp,%rax
mov    -0x50(%rsp),%rcx
add    %rax,%rcx
movupd (%rdi,%rcx,8),%xmm1
movupd 0x10(%rdi,%rcx,8),%xmm2
add    -0x60(%rsp),%rax
movupd (%rdi,%rax,8),%xmm3
movupd 0x10(%rdi,%rax,8),%xmm4
movupd %xmm3,(%rdi,%rcx,8)
movupd %xmm4,0x10(%rdi,%rcx,8)
movupd %xmm1,(%rdi,%rax,8)
movupd %xmm2,0x10(%rdi,%rax,8)
mov    0x38(%rsp),%rbp
mov    %ebx,%eax
mov    -0x48(%rsp),%rcx
cmp    %rcx,-0x78(%rsp)
je     133b <DiagMatrix+0x23b>
mov    %edx,%eax
sub    %ebp,%eax
mov    %rbp,%rcx
test   $0x1,%al
je     14ad <DiagMatrix+0x3ad>
mov    -0x50(%rsp),%rax
add    %rbp,%rax
movsd  (%rdi,%rax,8),%xmm1
mov    -0x60(%rsp),%rcx
add    %rbp,%rcx
movsd  (%rdi,%rcx,8),%xmm2
movsd  %xmm2,(%rdi,%rax,8)
movsd  %xmm1,(%rdi,%rcx,8)
lea    0x1(%rbp),%rcx
not    %rbp
mov    %ebx,%eax
cmp    0x48(%rsp),%rbp
mov    0x40(%rsp),%rbp
mov    -0x8(%rsp),%r11
je     133b <DiagMatrix+0x23b>
nopw   0x0(%rax,%rax,1)
movsd  -0x30(%rbp,%rcx,8),%xmm1
movsd  -0x8(%r11,%rcx,8),%xmm2
movsd  %xmm2,-0x30(%rbp,%rcx,8)
movsd  %xmm1,-0x8(%r11,%rcx,8)
movsd  -0x28(%rbp,%rcx,8),%xmm1
movsd  (%r11,%rcx,8),%xmm2
movsd  %xmm2,-0x28(%rbp,%rcx,8)
movsd  %xmm1,(%r11,%rcx,8)
add    $0x2,%rcx
cmp    %rcx,%rdx
jne    14d0 <DiagMatrix+0x3d0>
mov    %ebx,%eax
jmp    133b <DiagMatrix+0x23b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rbp,%rcx
mov    -0x18(%rsp),%rbp
and    $0xfffffffffffffffc,%rbp
mov    %r15,%rsi
sub    %rcx,%rsi
lea    0x1(%rcx),%rax
mov    %rax,-0x70(%rsp)
mov    0x28(%rsp),%rbx
add    %rbx,-0x30(%rsp)
mov    (%rsp),%rax
mov    -0x60(%rsp),%rdx
add    %rdx,%rax
lea    (%rdi,%rax,8),%rax
mov    %rax,-0x38(%rsp)
mov    %rsi,-0x78(%rsp)
and    $0xfffffffffffffffc,%rsi
mov    %rsi,-0x40(%rsp)
lea    (%rcx,%rsi,1),%rax
mov    %rax,-0x48(%rsp)
mov    -0x10(%rsp),%r11
xor    %eax,%eax
jmp    1593 <DiagMatrix+0x493>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rax
add    %r9,%r11
add    %r9,%rbx
cmp    %r15,%rax
je     11e0 <DiagMatrix+0xe0>
cmp    %rax,-0x80(%rsp)
je     1580 <DiagMatrix+0x480>
mov    %rax,%r8
imul   0x8(%rsp),%r8
mov    -0x80(%rsp),%rcx
add    %r8,%rcx
movsd  (%rdi,%rcx,8),%xmm1
ucomisd %xmm0,%xmm1
jne    15b8 <DiagMatrix+0x4b8>
jnp    1580 <DiagMatrix+0x480>
mov    0x60(%rsp),%rcx
divsd  (%rdi,%rcx,8),%xmm1
mov    -0x80(%rsp),%rsi
cmpq   $0x4,-0x78(%rsp)
jb     1670 <DiagMatrix+0x570>
mov    -0x70(%rsp),%rcx
add    %r8,%rcx
lea    (%rdi,%rcx,8),%rcx
cmp    -0x38(%rsp),%rcx
jae    15fd <DiagMatrix+0x4fd>
mov    (%rsp),%rcx
add    %r8,%rcx
lea    (%rdi,%rcx,8),%rcx
mov    -0x80(%rsp),%rsi
cmp    %rcx,-0x30(%rsp)
jb     1670 <DiagMatrix+0x570>
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movupd -0x10(%r14,%rcx,8),%xmm3
movupd (%r14,%rcx,8),%xmm4
movupd -0x10(%r11,%rcx,8),%xmm5
movupd (%r11,%rcx,8),%xmm6
mulpd  %xmm2,%xmm3
subpd  %xmm3,%xmm5
mulpd  %xmm2,%xmm4
subpd  %xmm4,%xmm6
movupd %xmm5,-0x10(%r11,%rcx,8)
movupd %xmm6,(%r11,%rcx,8)
add    $0x4,%rcx
cmp    %rcx,%rbp
jne    1610 <DiagMatrix+0x510>
mov    -0x48(%rsp),%rsi
mov    -0x40(%rsp),%rcx
cmp    %rcx,-0x78(%rsp)
je     1580 <DiagMatrix+0x480>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r15d,%edx
sub    %esi,%edx
mov    %rsi,%rcx
test   $0x1,%dl
je     16c4 <DiagMatrix+0x5c4>
lea    0x1(%rsi),%rcx
mov    -0x60(%rsp),%rdx
lea    (%rsi,%rdx,1),%r9
add    $0x1,%r9
lea    0x1(%rsi,%r8,1),%rdi
mov    -0x68(%rsp),%rdx
movsd  (%rdx,%rdi,8),%xmm2
mov    -0x68(%rsp),%rdx
movsd  (%rdx,%r9,8),%xmm3
mov    0x50(%rsp),%r9
mulsd  %xmm1,%xmm3
subsd  %xmm3,%xmm2
mov    -0x68(%rsp),%rdx
movsd  %xmm2,(%rdx,%rdi,8)
mov    -0x68(%rsp),%rdi
not    %rsi
cmp    0x58(%rsp),%rsi
je     1580 <DiagMatrix+0x480>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  -0x8(%r10,%rcx,8),%xmm2
mulsd  %xmm1,%xmm2
movsd  (%rbx,%rcx,8),%xmm3
subsd  %xmm2,%xmm3
movsd  0x8(%rbx,%rcx,8),%xmm2
movsd  %xmm3,(%rbx,%rcx,8)
movsd  (%r10,%rcx,8),%xmm3
mulsd  %xmm1,%xmm3
subsd  %xmm3,%xmm2
movsd  %xmm2,0x8(%rbx,%rcx,8)
lea    0x2(%rcx),%rdx
mov    %rdx,%rcx
cmp    %rdx,%r15
jne    16e0 <DiagMatrix+0x5e0>
jmp    1580 <DiagMatrix+0x480>
mov    $0x1,%eax
jmp    176d <DiagMatrix+0x66d>
test   %esi,%esi
jle    176b <DiagMatrix+0x66b>
lea    (%rdi,%r15,8),%rcx
xor    %eax,%eax
xor    %esi,%esi
xor    %edx,%edx
mov    -0x68(%rsp),%rbp
xchg   %ax,%ax
movslq %esi,%rsi
lea    (%rdx,%rsi,1),%rdi
movsd  (%rcx),%xmm0
divsd  0x0(%rbp,%rdi,8),%xmm0
mov    -0x68(%rsp),%rdi
movsd  %xmm0,(%rdi,%rdx,8)
add    $0x1,%rdx
add    %ebx,%esi
add    %r9,%rcx
cmp    %rdx,%r15
jne    1740 <DiagMatrix+0x640>
jmp    176d <DiagMatrix+0x66d>
xor    %eax,%eax
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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