int main(int argc, char *argv[]) {
  int i, j, k;
  double **a = (double **)malloc(sizeof(double *) * 800);
  for (i = 0; i < 800; i++)
    a[i] = (double *)malloc(sizeof(double) * 800);
  double **b = (double **)malloc(sizeof(double *) * 800);
  for (i = 0; i < 800; i++)
    b[i] = (double *)malloc(sizeof(double) * 800);
  double **c = (double **)malloc(sizeof(double *) * 800);
  for (i = 0; i < 800; i++)
    c[i] = (double *)malloc(sizeof(double) * 800);
  printf("Initializing matrices...\n");
  for (i = 0; i < 800; i++)
    for (j = 0; j < 800; j++)
      a[i][j] = i + j;
  for (i = 0; i < 800; i++)
    for (j = 0; j < 800; j++)
      b[i][j] = i * j;
  for (i = 0; i < 800; i++)
    for (j = 0; j < 800; j++)
      c[i][j] = 0;
  for (i = 0; i < 800; i++)
    for (j = 0; j < 800; j++)
      for (k = 0; k < 800; k++)
        c[i][j] += a[i][k] * b[k][j];
  for (i = 0; i < 800; i++)
    free(a[i]);
  free(a);
  for (i = 0; i < 800; i++)
    free(b[i]);
  free(b);
  for (i = 0; i < 800; i++)
    free(c[i]);
  free(c);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    118f <main+0x5f>
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,%rdx
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    115b <main+0x2b>
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    11d8 <main+0xa8>
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,%rdx
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11a4 <main+0x74>
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    1221 <main+0xf1>
mov    $0x1900,%edi
call   1050 <malloc@plt>
mov    %rax,%rdx
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11ed <main+0xbd>
lea    0xdd8(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    1297 <main+0x167>
movl   $0x0,-0x18(%rbp)
cmpl   $0x320,-0x18(%rbp)
jge    1284 <main+0x154>
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
cvtsi2sd %eax,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    124a <main+0x11a>
jmp    1289 <main+0x159>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1236 <main+0x106>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    1300 <main+0x1d0>
movl   $0x0,-0x18(%rbp)
cmpl   $0x320,-0x18(%rbp)
jge    12ed <main+0x1bd>
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
cvtsi2sd %eax,%xmm0
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12b2 <main+0x182>
jmp    12f2 <main+0x1c2>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    129e <main+0x16e>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    1361 <main+0x231>
movl   $0x0,-0x18(%rbp)
cmpl   $0x320,-0x18(%rbp)
jge    134e <main+0x21e>
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    131b <main+0x1eb>
jmp    1353 <main+0x223>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1307 <main+0x1d7>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    141d <main+0x2ed>
movl   $0x0,-0x18(%rbp)
cmpl   $0x320,-0x18(%rbp)
jge    140a <main+0x2da>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x320,-0x1c(%rbp)
jge    13f7 <main+0x2c7>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1390 <main+0x260>
jmp    13fc <main+0x2cc>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    137c <main+0x24c>
jmp    140f <main+0x2df>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1368 <main+0x238>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    1450 <main+0x320>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1424 <main+0x2f4>
mov    -0x28(%rbp),%rdi
call   1030 <free@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    148c <main+0x35c>
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1460 <main+0x330>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x320,-0x14(%rbp)
jge    14c8 <main+0x398>
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    149c <main+0x36c>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,%r14
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,(%r14,%rbx,8)
add    $0x1,%rbx
cmp    $0x320,%rbx
jne    1160 <main+0x20>
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,%rbx
xor    %r15d,%r15d
nopl   0x0(%rax,%rax,1)
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,(%rbx,%r15,8)
add    $0x1,%r15
cmp    $0x320,%r15
jne    1190 <main+0x50>
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,%r15
xor    %r12d,%r12d
nopl   0x0(%rax,%rax,1)
mov    $0x1900,%edi
call   1060 <malloc@plt>
mov    %rax,(%r15,%r12,8)
add    $0x1,%r12
cmp    $0x320,%r12
jne    11c0 <main+0x80>
lea    0xe3e(%rip),%rdi
call   1040 <puts@plt>
xor    %eax,%eax
movdqa 0xe0f(%rip),%xmm0
movdqa 0xe17(%rip),%xmm1
nopl   0x0(%rax)
mov    (%r14,%rax,8),%rcx
movq   %rax,%xmm2
pshufd $0x44,%xmm2,%xmm2
lea    0x2(%rax),%rdx
movq   %rdx,%xmm3
pshufd $0x44,%xmm3,%xmm3
mov    $0x2,%edx
movdqa %xmm0,%xmm4
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm4,%xmm5
paddq  %xmm2,%xmm5
movdqa %xmm3,%xmm6
paddq  %xmm4,%xmm6
pshufd $0xe8,%xmm5,%xmm5
cvtdq2pd %xmm5,%xmm5
pshufd $0xe8,%xmm6,%xmm6
cvtdq2pd %xmm6,%xmm6
movups %xmm5,-0x10(%rcx,%rdx,8)
movups %xmm6,(%rcx,%rdx,8)
paddq  %xmm1,%xmm4
add    $0x4,%rdx
cmp    $0x322,%rdx
jne    1230 <main+0xf0>
add    $0x1,%rax
cmp    $0x320,%rax
jne    1200 <main+0xc0>
xor    %r8d,%r8d
xor    %r9d,%r9d
xchg   %ax,%ax
mov    (%rbx,%r9,8),%rdx
mov    $0x4,%esi
xor    %edi,%edi
xor    %eax,%eax
nopl   (%rax)
xorps  %xmm0,%xmm0
cvtsi2sd %edi,%xmm0
movsd  %xmm0,-0x20(%rdx,%rsi,8)
lea    0x1(%rax),%ecx
imul   %r9d,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
lea    0x2(%rax),%ecx
imul   %r9d,%ecx
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
movsd  %xmm0,-0x18(%rdx,%rsi,8)
movsd  %xmm1,-0x10(%rdx,%rsi,8)
lea    0x3(%rax),%ecx
imul   %r9d,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
movsd  %xmm0,-0x8(%rdx,%rsi,8)
lea    0x4(%rax),%ecx
imul   %r9d,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x5,%rax
add    $0x5,%rsi
add    %r8d,%edi
cmp    $0x324,%rsi
jne    1290 <main+0x150>
add    $0x1,%r9
add    $0x5,%r8d
cmp    $0x320,%r9
jne    1280 <main+0x140>
mov    $0x7,%r12d
nopl   0x0(%rax,%rax,1)
mov    -0x38(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x30(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x28(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x20(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x18(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x10(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    -0x8(%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
mov    (%r15,%r12,8),%rdi
mov    $0x1900,%edx
xor    %esi,%esi
call   1050 <memset@plt>
add    $0x8,%r12
cmp    $0x327,%r12
jne    1320 <main+0x1e0>
xor    %r8d,%r8d
nopl   0x0(%rax,%rax,1)
mov    (%r14,%r8,8),%rcx
mov    (%r15,%r8,8),%rdx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movsd  (%rdx,%rsi,8),%xmm0
mov    $0x1,%edi
nopw   0x0(%rax,%rax,1)
movsd  -0x8(%rcx,%rdi,8),%xmm1
mov    -0x8(%rbx,%rdi,8),%rax
mulsd  (%rax,%rsi,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%rsi,8)
movsd  (%rcx,%rdi,8),%xmm0
mov    (%rbx,%rdi,8),%rax
mulsd  (%rax,%rsi,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x2,%rdi
cmp    $0x321,%rdi
jne    13e0 <main+0x2a0>
add    $0x1,%rsi
cmp    $0x320,%rsi
jne    13d0 <main+0x290>
add    $0x1,%r8
cmp    $0x320,%r8
jne    13c0 <main+0x280>
xor    %r12d,%r12d
nopw   0x0(%rax,%rax,1)
mov    (%r14,%r12,8),%rdi
call   1030 <free@plt>
add    $0x1,%r12
cmp    $0x320,%r12
jne    1440 <main+0x300>
mov    %r14,%rdi
call   1030 <free@plt>
xor    %r14d,%r14d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rbx,%r14,8),%rdi
call   1030 <free@plt>
add    $0x1,%r14
cmp    $0x320,%r14
jne    1470 <main+0x330>
mov    %rbx,%rdi
call   1030 <free@plt>
xor    %ebx,%ebx
mov    (%r15,%rbx,8),%rdi
call   1030 <free@plt>
add    $0x1,%rbx
cmp    $0x320,%rbx
jne    1490 <main+0x350>
mov    %r15,%rdi
call   1030 <free@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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