double *cholesky(double *A, int n) {
  register int i, j, k;
  double s, a;
  double *L = (double *)calloc(n * (n + 1), sizeof(double));
  for (i = 0; i < n; ++i) {
    for (j = 0; j < i; ++j) {
      a = A[((i)*n + (j))];
      for (k = 0; k < j; k += 4) {
        a -=
            L[((((i) * (i + 1)) / 2) + (k))] * L[((((j) * (j + 1)) / 2) + (k))];
        a -= L[((((i) * (i + 1)) / 2) + (k + 1))] *
             L[((((j) * (j + 1)) / 2) + (k + 1))];
        a -= L[((((i) * (i + 1)) / 2) + (k + 2))] *
             L[((((j) * (j + 1)) / 2) + (k + 2))];
        a -= L[((((i) * (i + 1)) / 2) + (k + 3))] *
             L[((((j) * (j + 1)) / 2) + (k + 3))];
      }
      L[((((i) * (i + 1)) / 2) + (j))] = a / L[((((j) * (j + 1)) / 2) + (j))];
    }
    a = A[((i)*n + (i))];
    for (k = 0; k < i; k += 4) {
      a -= L[((((i) * (i + 1)) / 2) + (k))] * L[((((i) * (i + 1)) / 2) + (k))];
      a -= L[((((i) * (i + 1)) / 2) + (k + 1))] *
           L[((((i) * (i + 1)) / 2) + (k + 1))];
      a -= L[((((i) * (i + 1)) / 2) + (k + 2))] *
           L[((((i) * (i + 1)) / 2) + (k + 2))];
      a -= L[((((i) * (i + 1)) / 2) + (k + 3))] *
           L[((((i) * (i + 1)) / 2) + (k + 3))];
    }
    L[((((i) * (i + 1)) / 2) + (i))] = sqrt(a);
  }
  return L;
}


x86 assembly (clang, -O0):
<cholesky>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
movslq %eax,%rdi
mov    $0x8,%esi
call   1030 <calloc@plt>
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1729 <cholesky+0x609>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1448 <cholesky+0x328>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13db <cholesky+0x2bb>
mov    -0x30(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x70(%rbp),%rax
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x68(%rbp),%rax
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x60(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x58(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x50(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x2,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x48(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x2,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x40(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x3,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x38(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x3,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
jmp    1197 <cholesky+0x77>
movsd  -0x28(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x80(%rbp),%rax
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x78(%rbp),%rax
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1169 <cholesky+0x49>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x10(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    16de <cholesky+0x5be>
mov    -0x30(%rbp),%rax
mov    %rax,-0xc0(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xc0(%rbp),%rax
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xb8(%rbp),%rax
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0xb0(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xb0(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xa8(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xa0(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x2,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x98(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x2,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x90(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x3,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x88(%rbp),%rax
mov    -0x18(%rbp),%edx
add    $0x3,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x28(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x18(%rbp)
jmp    146a <cholesky+0x34a>
movsd  -0x28(%rbp),%xmm0
call   1040 <sqrt@plt>
mov    -0x30(%rbp),%rax
mov    %rax,-0xc8(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xc8(%rbp),%rax
add    -0x10(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1156 <cholesky+0x36>
mov    -0x30(%rbp),%rax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cholesky>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %esi,%ebx
mov    %rdi,%r15
lea    0x1(%rbx),%eax
imul   %esi,%eax
movslq %eax,%rdi
mov    $0x8,%esi
call   1030 <calloc@plt>
mov    %rbx,%r9
mov    %rax,%r13
test   %r9d,%r9d
jle    1333 <cholesky+0x213>
mov    %r9d,%r10d
mov    %r13,%r14
add    $0x18,%r14
mov    $0x2,%r11d
xor    %ecx,%ecx
xorpd  %xmm3,%xmm3
xor    %r12d,%r12d
jmp    11be <cholesky+0x9e>
mov    %r9,%rbx
mov    %r10,%rbp
mov    %r11d,0xc(%rsp)
call   1040 <sqrt@plt>
xorpd  %xmm3,%xmm3
mov    0xc(%rsp),%r11d
mov    %rbp,%r10
mov    %rbx,%r9
lea    0x1(%r12),%rax
mov    %r12d,%ecx
imul   %eax,%ecx
shr    %ecx
add    %r12d,%ecx
movsd  %xmm0,0x0(%r13,%rcx,8)
mov    0x10(%rsp),%rcx
add    %r11d,%ecx
add    $0x2,%r11d
mov    %rax,%r12
cmp    %r10,%rax
je     1333 <cholesky+0x213>
test   %r12,%r12
mov    %rcx,0x10(%rsp)
je     1310 <cholesky+0x1f0>
mov    %ecx,%eax
and    $0xfffffffe,%eax
shl    $0x2,%rax
add    %r14,%rax
mov    %r12,%r8
imul   %r10,%r8
lea    0x1(%r12),%edx
imul   %r12d,%edx
shr    %edx
mov    $0x2,%esi
xor    %edi,%edi
xor    %ebp,%ebp
jmp    122e <cholesky+0x10e>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbp,%rbx
add    $0x1,%rbx
mov    %ebx,%ecx
imul   %ebp,%ecx
shr    %ecx
add    %ebp,%ecx
divsd  0x0(%r13,%rcx,8),%xmm0
lea    (%rdx,%rbp,1),%ecx
movsd  %xmm0,0x0(%r13,%rcx,8)
add    %esi,%edi
add    $0x2,%esi
mov    %rbx,%rbp
cmp    %r12,%rbx
je     12a0 <cholesky+0x180>
lea    (%r8,%rbp,1),%rcx
movsd  (%r15,%rcx,8),%xmm0
test   %rbp,%rbp
je     1200 <cholesky+0xe0>
mov    %edi,%ecx
and    $0xfffffffe,%ecx
lea    (%r14,%rcx,4),%rbx
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movsd  -0x18(%rax,%rcx,8),%xmm1
movsd  -0x10(%rax,%rcx,8),%xmm2
mulsd  -0x18(%rbx,%rcx,8),%xmm1
mulsd  -0x10(%rbx,%rcx,8),%xmm2
subsd  %xmm1,%xmm0
movsd  -0x8(%rax,%rcx,8),%xmm1
mulsd  -0x8(%rbx,%rcx,8),%xmm1
subsd  %xmm2,%xmm0
movsd  (%rax,%rcx,8),%xmm2
mulsd  (%rbx,%rcx,8),%xmm2
subsd  %xmm1,%xmm0
subsd  %xmm2,%xmm0
add    $0x4,%rcx
cmp    %rbp,%rcx
jb     1250 <cholesky+0x130>
jmp    1200 <cholesky+0xe0>
nopl   0x0(%rax)
mov    %r12d,%ecx
imul   %r9d,%ecx
movslq %ecx,%rcx
add    %r12,%rcx
movsd  (%r15,%rcx,8),%xmm0
test   %r12,%r12
je     1300 <cholesky+0x1e0>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movsd  -0x18(%rax,%rcx,8),%xmm1
movsd  -0x10(%rax,%rcx,8),%xmm2
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
mulsd  %xmm2,%xmm2
subsd  %xmm2,%xmm0
movsd  -0x8(%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
add    $0x4,%rcx
cmp    %r12,%rcx
jb     12c0 <cholesky+0x1a0>
ucomisd %xmm3,%xmm0
jb     1170 <cholesky+0x50>
jmp    132a <cholesky+0x20a>
nopl   0x0(%rax)
mov    %r12d,%eax
imul   %r9d,%eax
add    %r12,%rax
movsd  (%r15,%rax,8),%xmm0
ucomisd %xmm3,%xmm0
jb     1170 <cholesky+0x50>
sqrtsd %xmm0,%xmm0
jmp    118f <cholesky+0x6f>
mov    %r13,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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