#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 chol(double *, int, double *, int *, double *);
int syminv(double a[], int nrow, double c[], double w[], int *nullty,
           double *log_det) {
  double x;
  int i, j, k, l, irow, icol, jcol, mdiag, ndiag, last_cell, last_row;
  if (nrow <= 0)
    return (1);
  i = chol(a, nrow, c, nullty, log_det);
  if (i != 0)
    return (i);
  last_cell = ((nrow * (nrow + 1)) / 2) - 1;
  last_row = nrow - 1;
  for (ndiag = last_cell, irow = last_row; irow >= 0;
       ndiag -= irow, ndiag--, irow--) {
    if (c[ndiag] != 0.0) {
      for (l = ndiag, i = irow; i < nrow; i++, l += i)
        w[i] = c[l];
      for (icol = last_row, mdiag = jcol = last_cell; icol >= irow;
           mdiag -= icol, mdiag--, icol--, jcol--) {
        if (icol == irow)
          x = 1.0 / w[irow];
        else
          x = 0.0;
        for (k = last_row, l = jcol; k > irow; k--) {
          x -= (w[k] * c[l]);
          if (l > mdiag)
            l -= k;
          else
            l--;
        }
        c[l] = x / w[irow];
      }
    } else
      for (j = irow, l = ndiag; j < nrow; j++, l += j)
        c[l] = 0.0;
  }
  return (0);
}


x86 assembly (clang, -O0):
<syminv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
cmpl   $0x0,-0x14(%rbp)
jg     1145 <syminv+0x35>
movl   $0x1,-0x4(%rbp)
jmp    13be <syminv+0x2ae>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x30(%rbp),%rcx
mov    -0x38(%rbp),%r8
call   1030 <chol@plt>
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x44(%rbp)
je     1175 <syminv+0x65>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    13be <syminv+0x2ae>
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
sub    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x68(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x6c(%rbp),%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x0,-0x54(%rbp)
jl     13b7 <syminv+0x2a7>
mov    -0x20(%rbp),%rax
movslq -0x64(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11d3 <syminv+0xc3>
jp     11d3 <syminv+0xc3>
jmp    134c <syminv+0x23c>
mov    -0x64(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    121c <syminv+0x10c>
mov    -0x20(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    11df <syminv+0xcf>
mov    -0x6c(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x68(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    %eax,-0x60(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x54(%rbp),%eax
jl     1347 <syminv+0x237>
mov    -0x58(%rbp),%eax
cmp    -0x54(%rbp),%eax
jne    1262 <syminv+0x152>
mov    -0x28(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  0xdad(%rip),%xmm0
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    126a <syminv+0x15a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x6c(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    12fd <syminv+0x1ed>
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x60(%rbp),%eax
jle    12e1 <syminv+0x1d1>
mov    -0x4c(%rbp),%ecx
mov    -0x50(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x50(%rbp)
jmp    12ea <syminv+0x1da>
mov    -0x50(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x50(%rbp)
jmp    12ef <syminv+0x1df>
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
jmp    1276 <syminv+0x166>
movsd  -0x40(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x54(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x58(%rbp),%ecx
mov    -0x60(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x60(%rbp)
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
mov    -0x5c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x5c(%rbp)
jmp    122b <syminv+0x11b>
jmp    1390 <syminv+0x280>
mov    -0x54(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x64(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    138b <syminv+0x27b>
mov    -0x20(%rbp),%rax
movslq -0x50(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    1358 <syminv+0x248>
jmp    1390 <syminv+0x280>
jmp    1395 <syminv+0x285>
mov    -0x54(%rbp),%ecx
mov    -0x64(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x64(%rbp)
mov    -0x64(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x64(%rbp)
mov    -0x54(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x54(%rbp)
jmp    11a4 <syminv+0x94>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<syminv>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
test   %esi,%esi
jle    145c <syminv+0x34c>
mov    %rcx,%r14
mov    %rdx,%r13
mov    %esi,%ebx
mov    %r8,%rcx
mov    %r9,%r8
call   1030 <chol@plt>
test   %eax,%eax
jne    1465 <syminv+0x355>
lea    0x1(%rbx),%r15d
mov    %r15d,%eax
imul   %ebx,%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
add    $0xffffffff,%ecx
lea    -0x1(%rbx),%eax
mov    %rax,0x28(%rsp)
mov    %ebx,%eax
lea    -0x1(%rax),%r9
mov    %rax,%rdx
neg    %rdx
mov    %rdx,0x20(%rsp)
mov    %rax,0x8(%rsp)
lea    (%r14,%rax,8),%r10
mov    $0x1,%eax
sub    %ebx,%eax
mov    %eax,0x1c(%rsp)
movb   $0x1,0x7(%rsp)
xor    %eax,%eax
mov    %rax,0x10(%rsp)
xorpd  %xmm0,%xmm0
movsd  0xe64(%rip),%xmm1
mov    %r9,0x30(%rsp)
mov    %ecx,0x18(%rsp)
mov    %ecx,%r11d
mov    %rbx,%r8
jmp    11df <syminv+0xcf>
nopl   (%rax)
mov    %r9d,%eax
not    %eax
add    %eax,%r11d
lea    -0x1(%r9),%rax
add    $0xffffffff,%r8d
addb   $0x1,0x7(%rsp)
addq   $0x1,0x20(%rsp)
add    $0xffffffffffffffff,%r15
add    $0xfffffffffffffff8,%r10
test   %r9,%r9
mov    %rax,%r9
jle    1463 <syminv+0x353>
mov    0x10(%rsp),%r12
lea    0x1(%r12),%rax
mov    %rax,0x10(%rsp)
movslq %r11d,%rax
movsd  0x0(%r13,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
jne    1204 <syminv+0xf4>
jnp    13a0 <syminv+0x290>
cmp    0x8(%rsp),%r9
jge    11b0 <syminv+0xa0>
mov    %r8,%rsi
movsd  %xmm2,(%r14,%r9,8)
lea    0x1(%r9),%r8
mov    0x8(%rsp),%rdi
cmp    %rdi,%r8
je     12de <syminv+0x1ce>
lea    -0x1(%r12),%rdx
lea    (%r11,%r8,1),%ecx
test   $0x3,%r12b
je     1264 <syminv+0x154>
and    $0x3,%r12d
xor    %r8d,%r8d
nopl   0x0(%rax)
movslq %ecx,%rcx
movsd  0x0(%r13,%rcx,8),%xmm2
movsd  %xmm2,(%r10,%r8,8)
add    %r15d,%ecx
add    %r8d,%ecx
add    $0x1,%r8
cmp    %r8,%r12
jne    1240 <syminv+0x130>
sub    0x20(%rsp),%r8
cmp    $0x3,%rdx
jb     12de <syminv+0x1ce>
nopw   0x0(%rax,%rax,1)
movslq %ecx,%rax
movsd  0x0(%r13,%rax,8),%xmm2
movsd  %xmm2,(%r14,%r8,8)
lea    (%r8,%rax,1),%ecx
add    %r8d,%eax
add    $0x1,%eax
cltq
movsd  0x0(%r13,%rax,8),%xmm2
movsd  %xmm2,0x8(%r14,%r8,8)
lea    0x1(%r8,%rcx,1),%eax
lea    0x3(%r8,%rcx,1),%ecx
movslq %ecx,%rcx
movsd  0x0(%r13,%rcx,8),%xmm2
movsd  %xmm2,0x10(%r14,%r8,8)
lea    0x2(%r8,%rax,1),%ecx
lea    0x5(%r8,%rax,1),%eax
cltq
movsd  0x0(%r13,%rax,8),%xmm2
movsd  %xmm2,0x18(%r14,%r8,8)
add    $0x4,%r8
add    %r8d,%ecx
add    $0x3,%ecx
cmp    %r8,%rdi
jne    1270 <syminv+0x160>
mov    0x18(%rsp),%ebx
mov    %ebx,%edx
mov    0x28(%rsp),%rax
mov    %eax,%ecx
cmp    %rdi,%r9
mov    %rsi,%r8
jl     132a <syminv+0x21a>
jmp    11b0 <syminv+0xa0>
nopl   0x0(%rax,%rax,1)
mov    %ebx,%esi
divsd  (%r14,%r9,8),%xmm2
movslq %esi,%rax
movsd  %xmm2,0x0(%r13,%rax,8)
mov    %ecx,%eax
not    %eax
add    %eax,%edx
add    $0xffffffff,%ebx
movslq %ecx,%rax
add    $0xffffffff,%ecx
cmp    %rax,%r9
jge    11b0 <syminv+0xa0>
mov    %ecx,%eax
xorpd  %xmm2,%xmm2
cmp    %rax,%r9
jne    133f <syminv+0x22f>
movapd %xmm1,%xmm2
divsd  (%r14,%r9,8),%xmm2
cmp    0x28(%rsp),%r9
jge    1300 <syminv+0x1f0>
mov    0x1c(%rsp),%eax
mov    0x30(%rsp),%rdi
mov    %ebx,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%r14,%rdi,8),%xmm3
movslq %esi,%rbp
mulsd  0x0(%r13,%rbp,8),%xmm3
subsd  %xmm3,%xmm2
cmp    %edx,%ebp
mov    $0xffffffff,%esi
cmovg  %eax,%esi
add    %ebp,%esi
add    $0xffffffffffffffff,%rdi
add    $0x1,%eax
cmp    %r9,%rdi
jg     1360 <syminv+0x250>
jmp    1302 <syminv+0x1f2>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    0x8(%rsp),%r9
jge    11b0 <syminv+0xa0>
mov    %r9,%rcx
mov    %r11d,%edx
testb  $0x3,0x10(%rsp)
je     13f0 <syminv+0x2e0>
movzbl 0x7(%rsp),%eax
and    $0x3,%eax
neg    %rax
mov    %r8d,%ecx
xor    %esi,%esi
mov    %r11d,%edx
nopl   0x0(%rax,%rax,1)
movslq %edx,%rdx
movq   $0x0,0x0(%r13,%rdx,8)
add    %ecx,%edx
add    $0xffffffffffffffff,%rsi
add    $0x1,%ecx
cmp    %rsi,%rax
jne    13d0 <syminv+0x2c0>
mov    %r9,%rcx
sub    %rsi,%rcx
cmp    $0x3,%r12
jb     11b0 <syminv+0xa0>
nopw   0x0(%rax,%rax,1)
movslq %edx,%rax
movq   $0x0,0x0(%r13,%rax,8)
lea    (%rcx,%rax,1),%edx
add    %ecx,%eax
add    $0x1,%eax
cltq
movq   $0x0,0x0(%r13,%rax,8)
lea    0x1(%rcx,%rdx,1),%eax
lea    0x3(%rcx,%rdx,1),%edx
movslq %edx,%rdx
movq   $0x0,0x0(%r13,%rdx,8)
lea    0x2(%rcx,%rax,1),%edx
add    %ecx,%eax
add    $0x5,%eax
cltq
movq   $0x0,0x0(%r13,%rax,8)
add    $0x4,%rcx
add    %ecx,%edx
add    $0x3,%edx
cmp    %rcx,0x8(%rsp)
jne    1400 <syminv+0x2f0>
jmp    11b0 <syminv+0xa0>
mov    $0x1,%eax
jmp    1465 <syminv+0x355>
xor    %eax,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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