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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ printf(char *);
double **lu(double **a, int n, double **lum) {
  int i, j, k;
  if (a[1 - 1][1 - 1] == 0.0) {
    printf("\n\tCan't do LU\n");
    exit(1);
  }
  lum[1 - 1][1 - 1] = a[1 - 1][1 - 1];
  for (j = 2; j <= n; j++) {
    lum[1 - 1][j - 1] = a[1 - 1][j - 1];
    lum[j - 1][1 - 1] = a[j - 1][1 - 1] / lum[1 - 1][1 - 1];
  }
  for (i = 2; i <= n - 1; i++) {
    lum[i - 1][i - 1] = a[i - 1][i - 1];
    for (k = 1; k <= i - 1; k++)
      lum[i - 1][i - 1] -= lum[i - 1][k - 1] * lum[k - 1][i - 1];
    if (lum[i - 1][i - 1] == 0.0) {
      printf("\n\tCan't do LU\n");
      exit(1);
    }
    for (j = i + 1; j <= n; j++) {
      lum[i - 1][j - 1] = a[i - 1][j - 1];
      lum[j - 1][i - 1] = a[j - 1][i - 1];
      for (k = 1; k <= i - 1; k++) {
        lum[i - 1][j - 1] -= lum[i - 1][k - 1] * lum[k - 1][j - 1];
        lum[j - 1][i - 1] -= lum[j - 1][k - 1] * lum[k - 1][i - 1];
      }
      lum[j - 1][i - 1] /= lum[i - 1][i - 1];
    }
  }
  lum[n - 1][n - 1] = a[n - 1][n - 1];
  for (k = 1; k <= n - 1; k++)
    lum[n - 1][n - 1] -= lum[n - 1][k - 1] * lum[k - 1][n - 1];
  return lum;
}


x86 assembly (clang, -O0):
<lu>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1167 <lu+0x47>
jp     1167 <lu+0x47>
lea    0xea8(%rip),%rdi
call   1030 <printf@plt>
mov    $0x1,%edi
call   1040 <exit@plt>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
movsd  %xmm0,(%rax)
movl   $0x2,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     11fd <lu+0xdd>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
divsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1184 <lu+0x64>
movl   $0x2,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1563 <lu+0x443>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     12fa <lu+0x1da>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%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    125a <lu+0x13a>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1342 <lu+0x222>
jp     1342 <lu+0x222>
lea    0xccd(%rip),%rdi
call   1030 <printf@plt>
mov    $0x1,%edi
call   1040 <exit@plt>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1550 <lu+0x430>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     14fb <lu+0x3db>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%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    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%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    13da <lu+0x2ba>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    134b <lu+0x22b>
jmp    1555 <lu+0x435>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1204 <lu+0xe4>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1648 <lu+0x528>
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%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    15a8 <lu+0x488>
mov    -0x18(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lu>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    (%rdi),%r9
movsd  (%r9),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1143 <lu+0x23>
jnp    1419 <lu+0x2f9>
mov    (%rdx),%rcx
movsd  %xmm0,(%rcx)
mov    %rsi,(%rsp)
cmp    $0x2,%esi
jl     1365 <lu+0x245>
mov    (%rsp),%r8
mov    %r8d,%esi
lea    -0x1(%rsi),%rbp
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  0x8(%r9,%rbx,8),%xmm0
movsd  %xmm0,0x8(%rcx,%rbx,8)
mov    0x8(%rdi,%rbx,8),%rax
movsd  (%rax),%xmm0
divsd  (%rcx),%xmm0
mov    0x8(%rdx,%rbx,8),%rax
movsd  %xmm0,(%rax)
add    $0x1,%rbx
cmp    %rbx,%rbp
jne    1170 <lu+0x50>
cmp    $0x3,%r8d
jl     1365 <lu+0x245>
mov    (%rsp),%rax
lea    0x1(%rax),%r11d
mov    $0x3,%r9d
mov    $0x2,%r13d
mov    $0x1,%r12d
xor    %r10d,%r10d
xorpd  %xmm0,%xmm0
nopw   0x0(%rax,%rax,1)
mov    %r10,%rax
add    $0x1,%r10
mov    -0x8(%rdi,%r13,8),%r14
movsd  -0x8(%r14,%r13,8),%xmm1
mov    -0x8(%rdx,%r13,8),%rbx
movsd  %xmm1,-0x8(%rbx,%r13,8)
test   %rax,%rax
je     1350 <lu+0x230>
mov    %r12,%rax
and    $0xfffffffffffffffe,%rax
neg    %rax
mov    $0x1,%r15d
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rbx,%r15,8),%xmm2
mov    -0x8(%rdx,%r15,8),%rcx
mulsd  -0x8(%rcx,%r13,8),%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,-0x8(%rbx,%r13,8)
movsd  (%rbx,%r15,8),%xmm2
mov    (%rdx,%r15,8),%rcx
mulsd  -0x8(%rcx,%r13,8),%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,-0x8(%rbx,%r13,8)
lea    (%rax,%r15,1),%rcx
add    $0x2,%rcx
add    $0x2,%r15
cmp    $0x1,%rcx
jne    1210 <lu+0xf0>
test   $0x1,%r10b
je     1280 <lu+0x160>
movsd  -0x8(%rbx,%r15,8),%xmm2
mov    -0x8(%rdx,%r15,8),%rax
mulsd  -0x8(%rax,%r13,8),%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,-0x8(%rbx,%r13,8)
ucomisd %xmm0,%xmm1
jne    128c <lu+0x16c>
jnp    1419 <lu+0x2f9>
lea    0x1(%r13),%r15
mov    %r9,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  -0x8(%r14,%rax,8),%xmm1
movsd  %xmm1,-0x8(%rbx,%rax,8)
mov    -0x8(%rdi,%rax,8),%rcx
movsd  -0x8(%rcx,%r13,8),%xmm1
mov    -0x8(%rdx,%rax,8),%rcx
movsd  %xmm1,-0x8(%rcx,%r13,8)
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
movsd  (%rbx,%rbp,8),%xmm1
mov    (%rdx,%rbp,8),%r8
movsd  -0x8(%rbx,%rax,8),%xmm2
mulsd  -0x8(%r8,%rax,8),%xmm1
subsd  %xmm1,%xmm2
movsd  %xmm2,-0x8(%rbx,%rax,8)
movsd  (%rcx,%rbp,8),%xmm2
movsd  -0x8(%rcx,%r13,8),%xmm1
mulsd  -0x8(%r8,%r13,8),%xmm2
subsd  %xmm2,%xmm1
movsd  %xmm1,-0x8(%rcx,%r13,8)
add    $0x1,%rbp
cmp    %rbp,%r12
jne    12d0 <lu+0x1b0>
divsd  -0x8(%rbx,%r13,8),%xmm1
movsd  %xmm1,-0x8(%rcx,%r13,8)
add    $0x1,%rax
cmp    %r11,%rax
jne    12a0 <lu+0x180>
add    $0x1,%r9
add    $0x1,%r12
mov    %r15,%r13
cmp    %rsi,%r15
jne    11d0 <lu+0xb0>
jmp    1365 <lu+0x245>
nopl   0x0(%rax,%rax,1)
mov    $0x1,%r15d
test   $0x1,%r10b
jne    1262 <lu+0x142>
jmp    1280 <lu+0x160>
mov    (%rsp),%rsi
movslq %esi,%rax
mov    -0x8(%rdi,%rax,8),%rcx
movsd  -0x8(%rcx,%rax,8),%xmm0
mov    -0x8(%rdx,%rax,8),%rcx
movsd  %xmm0,-0x8(%rcx,%rax,8)
cmp    $0x2,%esi
jl     1407 <lu+0x2e7>
add    $0xffffffffffffffff,%rax
mov    %esi,%ebx
add    $0xffffffffffffffff,%rbx
cmp    $0x2,%esi
jne    139e <lu+0x27e>
xor    %esi,%esi
jmp    13eb <lu+0x2cb>
mov    %rbx,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movsd  (%rcx,%rsi,8),%xmm1
mov    (%rdx,%rsi,8),%rbp
mulsd  0x0(%rbp,%rax,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rcx,%rax,8)
movsd  0x8(%rcx,%rsi,8),%xmm1
mov    0x8(%rdx,%rsi,8),%rbp
mulsd  0x0(%rbp,%rax,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rcx,%rax,8)
add    $0x2,%rsi
cmp    %rsi,%rdi
jne    13b0 <lu+0x290>
test   $0x1,%bl
je     1407 <lu+0x2e7>
movsd  (%rcx,%rsi,8),%xmm1
mov    (%rdx,%rsi,8),%rsi
mulsd  (%rsi,%rax,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rcx,%rax,8)
mov    %rdx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xbe0(%rip),%rdi
call   1030 <puts@plt>
mov    $0x1,%edi
call   1040 <exit@plt>

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

LLVM IR (-O2):
@str.1 = [14 x i8] c"\0A\09Can't do LU\00"
define double** @lu(double** nocapture %0, i32 %1, double** returned %2) {
%4 = load double*, double** %0
%5 = load double, double* %4
%6 = fcmp oeq double %5, 0.000000e+00
br i1 %6, label %7, label %10
7: ; preds = %3
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @str.1, i64 0, i64 0))
%9 = tail call i32 @exit(i32 1)
unreachable
10: ; preds = %3
%11 = load double*, double** %2
store double %5, double* %11
%12 = icmp slt i32 %1, 2
br i1 %12, label %144, label %13
13: ; preds = %10
%14 = add nuw i32 %1, 1
%15 = zext i32 %14 to i64
br label %22
16: ; preds = %22
%17 = icmp sgt i32 %1, 2
br i1 %17, label %18, label %144
18: ; preds = %16
%19 = add nuw i32 %1, 1
%20 = zext i32 %1 to i64
%21 = zext i32 %19 to i64
br label %41
22: ; preds = %13, %22
%23 = phi i64 [ 2, %13 ], [ %35, %22 ]
%24 = add nsw i64 %23, -1
%25 = getelementptr inbounds double, double* %4, i64 %24
%26 = load double, double* %25
%27 = getelementptr inbounds double, double* %11, i64 %24
store double %26, double* %27
%28 = getelementptr inbounds double*, double** %0, i64 %24
%29 = load double*, double** %28
%30 = load double, double* %29
%31 = load double, double* %11
%32 = fdiv double %30, %31
%33 = getelementptr inbounds double*, double** %2, i64 %24
%34 = load double*, double** %33
store double %32, double* %34
%35 = add nuw nsw i64 %23, 1
%36 = icmp eq i64 %35, %15
br i1 %36, label %16, label %22
37: ; preds = %139
%38 = add nuw nsw i64 %44, 1
%39 = icmp eq i64 %104, %20
%40 = add i64 %42, 1
br i1 %39, label %144, label %41
41: ; preds = %18, %37
%42 = phi i64 [ 0, %18 ], [ %40, %37 ]
%43 = phi i64 [ 2, %18 ], [ %104, %37 ]
%44 = phi i64 [ 3, %18 ], [ %38, %37 ]
%45 = add i64 %42, 1
%46 = add nsw i64 %43, -1
%47 = getelementptr inbounds double*, double** %0, i64 %46
%48 = load double*, double** %47
%49 = getelementptr inbounds double, double* %48, i64 %46
%50 = load double, double* %49
%51 = getelementptr inbounds double*, double** %2, i64 %46
%52 = load double*, double** %51
%53 = getelementptr inbounds double, double* %52, i64 %46
store double %50, double* %53
%54 = and i64 %45, 1
%55 = icmp eq i64 %42, 0
br i1 %55, label %82, label %56
56: ; preds = %41
%57 = and i64 %45, -2
br label %58
58: ; preds = %58, %56
%59 = phi double [ %50, %56 ], [ %78, %58 ]
%60 = phi i64 [ 1, %56 ], [ %79, %58 ]
%61 = phi i64 [ 0, %56 ], [ %80, %58 ]
%62 = add nsw i64 %60, -1
%63 = getelementptr inbounds double, double* %52, i64 %62
%64 = load double, double* %63
%65 = getelementptr inbounds double*, double** %2, i64 %62
%66 = load double*, double** %65
%67 = getelementptr inbounds double, double* %66, i64 %46
%68 = load double, double* %67
%69 = fneg double %64
%70 = tail call double @llvm.fmuladd.f64(double %69, double %68, double %59)
store double %70, double* %53
%71 = getelementptr inbounds double, double* %52, i64 %60
%72 = load double, double* %71
%73 = getelementptr inbounds double*, double** %2, i64 %60
%74 = load double*, double** %73
%75 = getelementptr inbounds double, double* %74, i64 %46
%76 = load double, double* %75
%77 = fneg double %72
%78 = tail call double @llvm.fmuladd.f64(double %77, double %76, double %70)
store double %78, double* %53
%79 = add nuw nsw i64 %60, 2
%80 = add i64 %61, 2
%81 = icmp eq i64 %80, %57
br i1 %81, label %82, label %58
82: ; preds = %58, %41
%83 = phi double [ undef, %41 ], [ %78, %58 ]
%84 = phi double [ %50, %41 ], [ %78, %58 ]
%85 = phi i64 [ 1, %41 ], [ %79, %58 ]
%86 = icmp eq i64 %54, 0
br i1 %86, label %97, label %87
87: ; preds = %82
%88 = add nsw i64 %85, -1
%89 = getelementptr inbounds double, double* %52, i64 %88
%90 = load double, double* %89
%91 = getelementptr inbounds double*, double** %2, i64 %88
%92 = load double*, double** %91
%93 = getelementptr inbounds double, double* %92, i64 %46
%94 = load double, double* %93
%95 = fneg double %90
%96 = tail call double @llvm.fmuladd.f64(double %95, double %94, double %84)
store double %96, double* %53
br label %97
97: ; preds = %82, %87
%98 = phi double [ %83, %82 ], [ %96, %87 ]
%99 = fcmp oeq double %98, 0.000000e+00
br i1 %99, label %100, label %103
100: ; preds = %97
%101 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @str.1, i64 0, i64 0))
%102 = tail call i32 @exit(i32 1)
unreachable
103: ; preds = %97
%104 = add nuw nsw i64 %43, 1
br label %105
105: ; preds = %103, %139
%106 = phi i64 [ %44, %103 ], [ %142, %139 ]
%107 = add nsw i64 %106, -1
%108 = getelementptr inbounds double, double* %48, i64 %107
%109 = load double, double* %108
%110 = getelementptr inbounds double, double* %52, i64 %107
store double %109, double* %110
%111 = getelementptr inbounds double*, double** %0, i64 %107
%112 = load double*, double** %111
%113 = getelementptr inbounds double, double* %112, i64 %46
%114 = load double, double* %113
%115 = getelementptr inbounds double*, double** %2, i64 %107
%116 = load double*, double** %115
%117 = getelementptr inbounds double, double* %116, i64 %46
store double %114, double* %117
br label %118
118: ; preds = %105, %118
%119 = phi i64 [ 1, %105 ], [ %137, %118 ]
%120 = add nsw i64 %119, -1
%121 = getelementptr inbounds double, double* %52, i64 %120
%122 = load double, double* %121
%123 = getelementptr inbounds double*, double** %2, i64 %120
%124 = load double*, double** %123
%125 = getelementptr inbounds double, double* %124, i64 %107
%126 = load double, double* %125
%127 = load double, double* %110
%128 = fneg double %122
%129 = tail call double @llvm.fmuladd.f64(double %128, double %126, double %127)
store double %129, double* %110
%130 = getelementptr inbounds double, double* %116, i64 %120
%131 = load double, double* %130
%132 = getelementptr inbounds double, double* %124, i64 %46
%133 = load double, double* %132
%134 = load double, double* %117
%135 = fneg double %131
%136 = tail call double @llvm.fmuladd.f64(double %135, double %133, double %134)
store double %136, double* %117
%137 = add nuw nsw i64 %119, 1
%138 = icmp eq i64 %137, %43
br i1 %138, label %139, label %118
139: ; preds = %118
%140 = load double, double* %53
%141 = fdiv double %136, %140
store double %141, double* %117
%142 = add nuw nsw i64 %106, 1
%143 = icmp eq i64 %142, %21
br i1 %143, label %37, label %105
144: ; preds = %37, %10, %16
%145 = add nsw i32 %1, -1
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds double*, double** %0, i64 %146
%148 = load double*, double** %147
%149 = getelementptr inbounds double, double* %148, i64 %146
%150 = load double, double* %149
%151 = getelementptr inbounds double*, double** %2, i64 %146
%152 = load double*, double** %151
%153 = getelementptr inbounds double, double* %152, i64 %146
store double %150, double* %153
%154 = icmp sgt i32 %1, 1
br i1 %154, label %155, label %201
155: ; preds = %144
%156 = zext i32 %1 to i64
%157 = add nsw i64 %156, -1
%158 = and i64 %157, 1
%159 = icmp eq i32 %1, 2
br i1 %159, label %188, label %160
160: ; preds = %155
%161 = and i64 %157, -2
br label %162
162: ; preds = %162, %160
%163 = phi double [ %150, %160 ], [ %182, %162 ]
%164 = phi i64 [ 1, %160 ], [ %183, %162 ]
%165 = phi i64 [ 0, %160 ], [ %184, %162 ]
%166 = add nsw i64 %164, -1
%167 = getelementptr inbounds double, double* %152, i64 %166
%168 = load double, double* %167
%169 = getelementptr inbounds double*, double** %2, i64 %166
%170 = load double*, double** %169
%171 = getelementptr inbounds double, double* %170, i64 %146
%172 = load double, double* %171
%173 = fneg double %168
%174 = tail call double @llvm.fmuladd.f64(double %173, double %172, double %163)
store double %174, double* %153
%175 = getelementptr inbounds double, double* %152, i64 %164
%176 = load double, double* %175
%177 = getelementptr inbounds double*, double** %2, i64 %164
%178 = load double*, double** %177
%179 = getelementptr inbounds double, double* %178, i64 %146
%180 = load double, double* %179
%181 = fneg double %176
%182 = tail call double @llvm.fmuladd.f64(double %181, double %180, double %174)
store double %182, double* %153
%183 = add nuw nsw i64 %164, 2
%184 = add i64 %165, 2
%185 = icmp eq i64 %184, %161
br i1 %185, label %186, label %162
186: ; preds = %162
%187 = add nuw i64 %164, 1
br label %188
188: ; preds = %186, %155
%189 = phi double [ %150, %155 ], [ %182, %186 ]
%190 = phi i64 [ 0, %155 ], [ %187, %186 ]
%191 = icmp eq i64 %158, 0
br i1 %191, label %201, label %192
192: ; preds = %188
%193 = getelementptr inbounds double, double* %152, i64 %190
%194 = load double, double* %193
%195 = getelementptr inbounds double*, double** %2, i64 %190
%196 = load double*, double** %195
%197 = getelementptr inbounds double, double* %196, i64 %146
%198 = load double, double* %197
%199 = fneg double %194
%200 = tail call double @llvm.fmuladd.f64(double %199, double %198, double %189)
store double %200, double* %153
br label %201
201: ; preds = %192, %188, %144
ret double** %2
}