#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 */
scalar_t__ calloc(int, int);
int /*<<< orphan*/ free(double *);
void ldumat(double *a, double *u, int m, int n) {
  double *p0, *q0, *p, *q, *w;
  int i, j, k, mm;
  double s, h;
  w = (double *)calloc(m, sizeof(double));
  for (i = 0, mm = m * m, q = u; i < mm; ++i)
    *q++ = 0.;
  p0 = a + n * n - 1;
  q0 = u + m * m - 1;
  mm = m - n;
  i = n - 1;
  for (j = 0; j < mm; ++j, q0 -= m + 1)
    *q0 = 1.;
  if (mm == 0) {
    p0 -= n + 1;
    *q0 = 1.;
    q0 -= m + 1;
    --i;
    ++mm;
  }
  for (; i >= 0; --i, ++mm, p0 -= n + 1, q0 -= m + 1) {
    if (*p0 != 0.) {
      for (j = 0, p = p0 + n, h = 1.; j < mm; p += n)
        w[j++] = *p;
      h = *p0;
      *q0 = 1. - h;
      for (j = 0, q = q0 + m; j < mm; q += m)
        *q = -h * w[j++];
      for (k = i + 1, q = q0 + 1; k < m; ++k) {
        for (j = 0, p = q + m, s = 0.; j < mm; p += m)
          s += w[j++] * *p;
        s *= h;
        for (j = 0, p = q + m; j < mm; p += m)
          *p -= s * w[j++];
        *q++ = -s;
      }
    } else {
      *q0 = 1.;
      for (j = 0, p = q0 + 1, q = q0 + m; j < mm; ++j, q += m)
        *q = *p++ = 0.;
    }
  }
  free(w);
}


x86 assembly (clang, -O0):
<ldumat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%edi
mov    $0x8,%esi
call   1040 <calloc@plt>
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    1190 <ldumat+0x70>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1160 <ldumat+0x40>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
imul   -0x18(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   -0x14(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    122a <ldumat+0x10a>
mov    -0x28(%rbp),%rax
movsd  0xe05(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    11e3 <ldumat+0xc3>
cmpl   $0x0,-0x50(%rbp)
jne    1290 <ldumat+0x170>
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
movsd  0xda3(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x44(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1295 <ldumat+0x175>
cmpl   $0x0,-0x44(%rbp)
jl     161b <ldumat+0x4fb>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12bf <ldumat+0x19f>
jp     12bf <ldumat+0x19f>
jmp    153a <ldumat+0x41a>
movl   $0x0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x18(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
movsd  0xd1f(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    132b <ldumat+0x20b>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x48(%rbp)
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    12e6 <ldumat+0x1c6>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xcc0(%rip),%xmm0
subsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    13c8 <ldumat+0x2a8>
movsd  -0x60(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x48(%rbp)
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x14(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
jmp    1367 <ldumat+0x247>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1535 <ldumat+0x415>
movl   $0x0,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    1462 <ldumat+0x342>
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x48(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    140b <ldumat+0x2eb>
movsd  -0x60(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    14f8 <ldumat+0x3d8>
movsd  -0x58(%rbp),%xmm0
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x48(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm1
movq   %xmm0,%rcx
movabs $0x8000000000000000,%rdx
xor    %rdx,%rcx
movq   %rcx,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x14(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    148b <ldumat+0x36b>
movsd  -0x58(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x38(%rbp)
movsd  %xmm0,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    13dd <ldumat+0x2bd>
jmp    15c5 <ldumat+0x4a5>
mov    -0x28(%rbp),%rax
movsd  0xaba(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    15c0 <ldumat+0x4a0>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
jmp    1570 <ldumat+0x450>
jmp    15c5 <ldumat+0x4a5>
jmp    15ca <ldumat+0x4aa>
mov    -0x44(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    1295 <ldumat+0x175>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ldumat>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xd8,%rsp
mov    %ecx,%r12d
mov    %edx,%ebx
mov    %rsi,%r13
mov    %rdi,%rbp
mov    %edx,%edi
mov    $0x8,%esi
call   1050 <calloc@plt>
mov    %rbx,%rdx
mov    %rax,%rbx
mov    %edx,%eax
imul   %edx,%eax
test   %eax,%eax
mov    %rdx,0x8(%rsp)
mov    %rbp,0x18(%rsp)
je     118c <ldumat+0x5c>
mov    %eax,%ebp
lea    0x0(,%rbp,8),%rdx
mov    %r13,%rdi
xor    %esi,%esi
call   1040 <memset@plt>
mov    0x8(%rsp),%rdx
jmp    118e <ldumat+0x5e>
xor    %ebp,%ebp
mov    %r12d,%r15d
imul   %r15d,%r15d
lea    -0x8(,%rbp,8),%rcx
ff
add    %r13,%rcx
mov    %edx,%r9d
sub    %r12d,%r9d
mov    %edx,%r13d
not    %r13d
mov    %r12d,%r11d
not    %r11d
movabs $0x3ff0000000000000,%rsi
test   %r9d,%r9d
jle    11d4 <ldumat+0xa4>
movslq %r13d,%rdi
add    %r11d,%edx
mov    %r9d,%eax
and    $0x7,%eax
cmp    $0x7,%edx
jae    11e1 <ldumat+0xb1>
jmp    1245 <ldumat+0x115>
mov    %rcx,%r14
mov    0x18(%rsp),%rdx
jmp    126b <ldumat+0x13b>
mov    %r9d,%ebp
and    $0xfffffff8,%ebp
mov    %rdi,%r10
shl    $0x6,%r10
lea    0x0(,%rdi,8),%rdx
cs nopw 0x0(%rax,%rax,1)
mov    %rcx,%r14
mov    %rsi,(%rcx)
add    %rdx,%rcx
mov    %rsi,(%r14,%rdx,1)
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
mov    %rsi,(%rdx,%rcx,1)
add    %rdx,%rcx
add    %rdx,%rcx
add    $0xfffffff8,%ebp
jne    1200 <ldumat+0xd0>
add    %r10,%r14
mov    %r14,%rcx
test   %eax,%eax
mov    0x18(%rsp),%rdx
je     126b <ldumat+0x13b>
shl    $0x3,%rdi
mov    %rcx,%r14
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rsi,(%r14)
add    %rdi,%r14
add    $0xffffffff,%eax
jne    1260 <ldumat+0x130>
lea    (%rdx,%r15,8),%r10
add    $0xfffffffffffffff8,%r10
test   %r9d,%r9d
je     127f <ldumat+0x14f>
lea    -0x1(%r12),%eax
jmp    129b <ldumat+0x16b>
movslq %r11d,%rax
lea    (%r10,%rax,8),%r10
mov    %rsi,(%r14)
movslq %r13d,%rax
lea    (%r14,%rax,8),%r14
lea    -0x2(%r12),%eax
mov    $0x1,%r9d
mov    0x8(%rsp),%r8
test   %eax,%eax
js     1947 <ldumat+0x817>
mov    %rax,0x10(%rsp)
movslq %r8d,%rcx
movslq %r12d,%rdx
movslq %r11d,%r11
movslq %r13d,%rax
lea    -0x1(%r9),%ebp
mov    %rbp,0x90(%rsp)
mov    %rax,0xc0(%rsp)
lea    0x0(,%rax,8),%rax
mov    %rax,0xb8(%rsp)
mov    %rcx,%r15
shl    $0x5,%r15
lea    0x0(,%rcx,8),%rax
lea    (%rax,%rax,2),%r13
mov    %rcx,%r12
shl    $0x4,%r12
lea    0x0(,%rcx,4),%rbp
mov    %rbp,0x78(%rsp)
shl    $0x3,%r11
mov    %r11,0xc8(%rsp)
mov    %rdx,%rbp
shl    $0x5,%rbp
mov    %rbp,0x88(%rsp)
lea    0x0(,%rdx,8),%rbp
mov    %rbp,0x98(%rsp)
lea    0x0(,%rbp,2),%rdi
add    %rbp,%rdi
mov    %rdx,0x40(%rsp)
shl    $0x4,%rdx
xorpd  %xmm0,%xmm0
movsd  0xcb1(%rip),%xmm1
movapd 0xcb9(%rip),%xmm2
lea    (%r14,%rcx,8),%rbp
add    $0x8,%rbp
mov    %rbp,0x70(%rsp)
xor    %ebp,%ebp
mov    %rbp,0x68(%rsp)
mov    %r14,(%rsp)
mov    %rcx,0x18(%rsp)
mov    %rcx,0x30(%rsp)
mov    %r12,0xa0(%rsp)
mov    %r12,0x60(%rsp)
mov    %r13,0x80(%rsp)
mov    %r13,0x58(%rsp)
mov    %r15,0x28(%rsp)
mov    %r15,0x50(%rsp)
xor    %ecx,%ecx
mov    %rcx,0x48(%rsp)
xor    %ecx,%ecx
mov    %rcx,0x38(%rsp)
mov    0x10(%rsp),%rcx
mov    %rdi,0xb0(%rsp)
mov    %rdx,0xa8(%rsp)
jmp    1457 <ldumat+0x327>
cs nopw 0x0(%rax,%rax,1)
nop
lea    0x1(%r11),%r9d
mov    0xd0(%rsp),%r10
add    0xc8(%rsp),%r10
mov    0xb8(%rsp),%rcx
add    %rcx,(%rsp)
mov    0x38(%rsp),%rdx
add    $0x1,%edx
mov    %rdx,0x38(%rsp)
sub    %rcx,0x48(%rsp)
add    %rcx,0x50(%rsp)
add    %rcx,0x58(%rsp)
add    %rcx,0x60(%rsp)
mov    0x30(%rsp),%rdx
add    0xc0(%rsp),%rdx
mov    %rdx,0x30(%rsp)
add    %rcx,0x68(%rsp)
add    %rcx,0x70(%rsp)
mov    0x10(%rsp),%rcx
test   %ecx,%ecx
lea    -0x1(%rcx),%ecx
movabs $0x3ff0000000000000,%rsi
mov    0xb0(%rsp),%rdi
mov    0xa8(%rsp),%rdx
jle    1947 <ldumat+0x817>
mov    %r9d,%r12d
and    $0x3,%r12d
mov    %r9d,%r11d
movsd  (%r10),%xmm3
ucomisd %xmm0,%xmm3
mov    %r10,0xd0(%rsp)
mov    %rcx,0x10(%rsp)
jne    147b <ldumat+0x34b>
jnp    14b0 <ldumat+0x380>
mov    %r11d,%ebp
and    $0xfffffffc,%ebp
lea    -0x1(%r11),%r15
test   %r11d,%r11d
mov    %r15,0x20(%rsp)
jle    15c0 <ldumat+0x490>
cmp    $0x3,%r15
jae    15d8 <ldumat+0x4a8>
xor    %edx,%edx
mov    %r10,%rcx
mov    0x40(%rsp),%rsi
jmp    1629 <ldumat+0x4f9>
nopl   0x0(%rax)
mov    (%rsp),%rcx
mov    %rsi,(%rcx)
test   %r11d,%r11d
jle    13d0 <ldumat+0x2a0>
mov    0x90(%rsp),%rcx
mov    0x38(%rsp),%rdx
add    %ecx,%edx
mov    (%rsp),%rsi
mov    %rsi,%rcx
cmp    $0x3,%edx
jb     157b <ldumat+0x44b>
and    $0xfffffffc,%r9d
mov    0x68(%rsp),%rsi
mov    0x30(%rsp),%rcx
mov    0x60(%rsp),%rdx
mov    0x58(%rsp),%rbp
mov    0x50(%rsp),%rdi
mov    0x48(%rsp),%r8
mov    0x78(%rsp),%r10
mov    0x28(%rsp),%r15
nopl   0x0(%rax,%rax,1)
movq   $0x0,0x8(%r14,%rsi,1)
movq   $0x0,(%r14,%rcx,8)
movq   $0x0,0x10(%r14,%rsi,1)
movq   $0x0,(%r14,%rdx,1)
movq   $0x0,0x18(%r14,%rsi,1)
movq   $0x0,(%r14,%rbp,1)
movq   $0x0,0x20(%r14,%rsi,1)
movq   $0x0,(%r14,%rdi,1)
sub    %r15,%r8
add    %r15,%rdi
add    %r15,%rbp
add    %r15,%rdx
add    %r10,%rcx
add    $0x20,%rsi
add    $0xfffffffc,%r9d
jne    1510 <ldumat+0x3e0>
mov    %r14,%rcx
sub    %r8,%rcx
add    %r14,%rsi
mov    0x8(%rsp),%r8
test   $0x3,%r11b
je     13d0 <ldumat+0x2a0>
mov    0x18(%rsp),%rdx
lea    (%rcx,%rdx,8),%rcx
xor    %edx,%edx
movq   $0x0,0x8(%rsi,%rdx,8)
movq   $0x0,(%rcx)
add    %rax,%rcx
add    $0x1,%rdx
cmp    %edx,%r12d
jne    1590 <ldumat+0x460>
jmp    13d0 <ldumat+0x2a0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
mov    %rcx,%r13
mov    (%rsp),%rcx
movsd  %xmm4,(%rcx)
jmp    1743 <ldumat+0x613>
mov    %r10,%rcx
mov    %rdx,%r9
xor    %edx,%edx
mov    0x40(%rsp),%rsi
mov    0x88(%rsp),%r13
nopl   (%rax)
movsd  (%rcx,%rsi,8),%xmm3
movsd  %xmm3,(%rbx,%rdx,8)
movsd  (%rcx,%r9,1),%xmm3
movsd  %xmm3,0x8(%rbx,%rdx,8)
movsd  (%rcx,%rdi,1),%xmm3
movsd  %xmm3,0x10(%rbx,%rdx,8)
movsd  (%rcx,%r13,1),%xmm3
add    %r13,%rcx
movsd  %xmm3,0x18(%rbx,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%rbp
jne    15f0 <ldumat+0x4c0>
test   $0x3,%r11b
mov    0x98(%rsp),%rdi
mov    0x28(%rsp),%r9
je     1665 <ldumat+0x535>
lea    (%rbx,%rdx,8),%rdx
lea    (%rcx,%rsi,8),%rcx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movsd  (%rcx),%xmm3
movsd  %xmm3,(%rdx,%rsi,8)
add    $0x1,%rsi
add    %rdi,%rcx
cmp    %rsi,%r12
jne    1650 <ldumat+0x520>
movsd  (%r10),%xmm3
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
mov    (%rsp),%rcx
movsd  %xmm4,(%rcx)
test   %r11d,%r11d
mov    0xa0(%rsp),%rsi
jle    1739 <ldumat+0x609>
movapd %xmm3,%xmm4
xorpd  %xmm2,%xmm4
mov    0x20(%rsp),%r15
cmp    $0x3,%r15
jae    16a6 <ldumat+0x576>
xor    %edx,%edx
mov    (%rsp),%rcx
jmp    1708 <ldumat+0x5d8>
mov    (%rsp),%rcx
xor    %edx,%edx
mov    0x80(%rsp),%rdi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rbx,%rdx,8),%xmm5
mulsd  %xmm4,%xmm5
movsd  %xmm5,(%rcx,%rax,1)
movsd  0x8(%rbx,%rdx,8),%xmm5
mulsd  %xmm4,%xmm5
movsd  %xmm5,(%rcx,%rsi,1)
movsd  0x10(%rbx,%rdx,8),%xmm5
mulsd  %xmm4,%xmm5
movsd  %xmm5,(%rcx,%rdi,1)
movsd  0x18(%rbx,%rdx,8),%xmm5
mulsd  %xmm4,%xmm5
add    $0x4,%rdx
movsd  %xmm5,(%rcx,%r9,1)
add    %r9,%rcx
cmp    %rdx,%rbp
jne    16c0 <ldumat+0x590>
test   $0x3,%r11b
je     173e <ldumat+0x60e>
lea    (%rbx,%rdx,8),%rdx
mov    0x18(%rsp),%rsi
lea    (%rcx,%rsi,8),%rcx
xor    %esi,%esi
nopl   (%rax)
movsd  (%rdx,%rsi,8),%xmm5
mulsd  %xmm4,%xmm5
movsd  %xmm5,(%rcx)
add    $0x1,%rsi
add    %rax,%rcx
cmp    %rsi,%r12
jne    1720 <ldumat+0x5f0>
mov    0x20(%rsp),%r15
mov    0x10(%rsp),%r13
add    $0x1,%r13d
cmp    %r8d,%r13d
jge    13d0 <ldumat+0x2a0>
movapd %xmm3,%xmm4
mulsd  %xmm0,%xmm4
mov    0x70(%rsp),%r9
mov    (%rsp),%r10
jmp    178f <ldumat+0x65f>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0x8(%rsp),%r8
xorpd  %xmm2,%xmm5
movsd  %xmm5,(%r10)
add    $0x1,%r13d
add    $0x8,%r9
cmp    %r8d,%r13d
jge    13d0 <ldumat+0x2a0>
mov    %r10,%rcx
add    $0x8,%r10
movapd %xmm4,%xmm5
test   %r11d,%r11d
jle    1775 <ldumat+0x645>
mov    0x18(%rsp),%rdx
lea    (%rcx,%rdx,8),%rdx
add    $0x8,%rdx
xorpd  %xmm5,%xmm5
cmp    $0x3,%r15
jae    17d0 <ldumat+0x6a0>
xor    %ecx,%ecx
mov    %rdx,%r8
test   $0x3,%r11b
jne    183e <ldumat+0x70e>
jmp    186a <ldumat+0x73a>
cs nopw 0x0(%rax,%rax,1)
mov    %r9,%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rdi,%r8
movsd  (%rbx,%rcx,8),%xmm6
movsd  0x8(%rbx,%rcx,8),%xmm7
mulsd  (%rdi),%xmm6
addsd  %xmm5,%xmm6
add    %rax,%rdi
mulsd  (%r8,%rax,1),%xmm7
addsd  %xmm6,%xmm7
movsd  0x10(%rbx,%rcx,8),%xmm6
mulsd  (%rax,%rdi,1),%xmm6
add    %rax,%rdi
addsd  %xmm7,%xmm6
movsd  0x18(%rbx,%rcx,8),%xmm5
add    $0x4,%rcx
mulsd  (%rax,%rdi,1),%xmm5
add    %rax,%rdi
addsd  %xmm6,%xmm5
add    %rax,%rdi
cmp    %rcx,%rbp
jne    17e0 <ldumat+0x6b0>
add    0x28(%rsp),%r8
test   $0x3,%r11b
je     186a <ldumat+0x73a>
lea    (%rbx,%rcx,8),%rcx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rcx,%rdi,8),%xmm6
mulsd  (%r8),%xmm6
addsd  %xmm6,%xmm5
add    $0x1,%rdi
add    %rax,%r8
cmp    %rdi,%r12
jne    1850 <ldumat+0x720>
mulsd  %xmm3,%xmm5
test   %r11d,%r11d
jle    1770 <ldumat+0x640>
xorpd  %xmm2,%xmm5
cmp    $0x3,%r15
jae    1892 <ldumat+0x762>
xor    %ecx,%ecx
test   $0x3,%r11b
jne    1917 <ldumat+0x7e7>
jmp    193d <ldumat+0x80d>
mov    %r9,%rdi
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %rdi,%rdx
movsd  (%rbx,%rcx,8),%xmm6
mulsd  %xmm5,%xmm6
addsd  (%rdi),%xmm6
movsd  %xmm6,(%rdi)
add    %rax,%rdi
movsd  0x8(%rbx,%rcx,8),%xmm6
mulsd  %xmm5,%xmm6
addsd  (%rdx,%rax,1),%xmm6
movsd  %xmm6,(%rdx,%rax,1)
lea    (%rdi,%rax,1),%rsi
movsd  0x10(%rbx,%rcx,8),%xmm6
mulsd  %xmm5,%xmm6
addsd  (%rax,%rdi,1),%xmm6
movsd  %xmm6,(%rax,%rdi,1)
lea    (%rsi,%rax,1),%rdi
movsd  0x18(%rbx,%rcx,8),%xmm6
mulsd  %xmm5,%xmm6
addsd  (%rax,%rsi,1),%xmm6
add    $0x4,%rcx
movsd  %xmm6,(%rax,%rsi,1)
add    %rax,%rdi
cmp    %rcx,%rbp
jne    18a0 <ldumat+0x770>
add    0x28(%rsp),%rdx
mov    0x20(%rsp),%r15
test   $0x3,%r11b
je     193d <ldumat+0x80d>
lea    (%rbx,%rcx,8),%rcx
xor    %edi,%edi
nopl   (%rax)
movsd  (%rcx,%rdi,8),%xmm6
mulsd  %xmm5,%xmm6
addsd  (%rdx),%xmm6
movsd  %xmm6,(%rdx)
add    $0x1,%rdi
add    %rax,%rdx
cmp    %rdi,%r12
jne    1920 <ldumat+0x7f0>
mov    0x8(%rsp),%r8
jmp    1779 <ldumat+0x649>
mov    %rbx,%rdi
add    $0xd8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

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

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