int main(int argc, char *argv[]) {
  int i, j, k, l, i1, j1, n;
  double **a;
  double **b;
  double **c;
  double *a1;
  double *b1;
  double *c1;
  double sum, alpha, beta;
  double Stime, Etime;
  a = (double **)malloc(sizeof(double *) * 520);
  for (i = 0; i < 520; i++) {
    a[i] = (double *)malloc(sizeof(double) * 520);
  }
  b = (double **)malloc(sizeof(double *) * 520);
  for (i = 0; i < 520; i++) {
    b[i] = (double *)malloc(sizeof(double) * 520);
  }
  c = (double **)malloc(sizeof(double *) * 520);
  for (i = 0; i < 520; i++) {
    c[i] = (double *)malloc(sizeof(double) * 520);
  }
  a1 = (double *)malloc(sizeof(double) * 520 * 520);
  b1 = (double *)malloc(sizeof(double) * 520 * 520);
  c1 = (double *)malloc(sizeof(double) * 520 * 520);
  for (l = 0; l < 5; l++) {
    for (i = 0; i < 520; i++) {
      for (j = 0; j < 520; j++) {
        a[i][j] = rnd(1.0);
        a1[j * 520 + i] = a[i][j];
      }
    }
    for (i = 0; i < 520; i++) {
      for (j = 0; j < 520; j++) {
        b[i][j] = rnd(1.0);
        b1[j * 520 + i] = b[i][j];
      }
    }
    dtime(&Stime);
    n = 520;
    alpha = 1.0;
    beta = 0.0;
    dgemm_("N", "N", &n, &n, &n, &alpha, a1, &n, b1, &n, &beta, c1, &n);
    dtime(&Etime);
    printf("time(s) 3 %10.5f\n", Etime - Stime);
    dtime(&Stime);
    for (i = 0; i < 520; i++) {
      for (j = 0; j < 520; j++) {
        sum = 0.0;
        for (k = 0; k < 520; k++) {
          sum += a[i][k] * b[j][k];
        }
        c[i][j] = sum;
      }
    }
    dtime(&Etime);
    printf("time(s) 1 %10.5f\n", Etime - Stime);
    dtime(&Stime);
    for (i = 0; i < 520; i++) {
      i1 = i * 520;
      for (j = 0; j < 520; j++) {
        j1 = j * 520;
        sum = 0.0;
        for (k = 0; k < 520; k++) {
          sum += a1[i1 + k] * b1[j1 + k];
        }
        c1[j * 520 + i] = sum;
      }
    }
    dtime(&Etime);
    printf("time(s) 2 %10.5f\n", Etime - Stime);
  }
  for (i = 0; i < 520; i++) {
    free(a[i]);
  }
  free(a);
  for (i = 0; i < 520; i++) {
    free(b[i]);
  }
  free(b);
  for (i = 0; i < 520; i++) {
    free(c[i]);
  }
  free(c);
  free(a1);
  free(b1);
  free(c1);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
push   %r14
push   %rbx
sub    $0xc0,%rsp
movl   $0x0,-0x14(%rbp)
mov    %edi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    11c5 <main+0x65>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%rdx
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1191 <main+0x31>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    120e <main+0xae>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%rdx
mov    -0x50(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11da <main+0x7a>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    1257 <main+0xf7>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%rdx
mov    -0x58(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1223 <main+0xc3>
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,-0x60(%rbp)
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,-0x68(%rbp)
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,-0x70(%rbp)
movl   $0x0,-0x30(%rbp)
cmpl   $0x5,-0x30(%rbp)
jge    169d <main+0x53d>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    132e <main+0x1ce>
movl   $0x0,-0x28(%rbp)
cmpl   $0x208,-0x28(%rbp)
jge    131b <main+0x1bb>
movsd  0xd3e(%rip),%xmm0
mov    $0x1,%al
call   1060 <rnd@plt>
cvtsi2sd %eax,%xmm0
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x60(%rbp),%rax
imul   $0x208,-0x28(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    12ad <main+0x14d>
jmp    1320 <main+0x1c0>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1299 <main+0x139>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    13ca <main+0x26a>
movl   $0x0,-0x28(%rbp)
cmpl   $0x208,-0x28(%rbp)
jge    13b7 <main+0x257>
movsd  0xca2(%rip),%xmm0
mov    $0x1,%al
call   1060 <rnd@plt>
cvtsi2sd %eax,%xmm0
mov    -0x50(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x50(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x68(%rbp),%rax
imul   $0x208,-0x28(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1349 <main+0x1e9>
jmp    13bc <main+0x25c>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1335 <main+0x1d5>
lea    -0x90(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movl   $0x208,-0x3c(%rbp)
movsd  0xc19(%rip),%xmm0
movsd  %xmm0,-0x80(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x60(%rbp),%r14
mov    -0x68(%rbp),%rbx
mov    -0x70(%rbp),%r10
lea    0xbfe(%rip),%rsi
lea    -0x3c(%rbp),%rax
lea    -0x80(%rbp),%r9
lea    -0x88(%rbp),%r11
mov    %rsi,%rdi
mov    %rax,%rdx
mov    %rax,%rcx
mov    %rax,%r8
mov    %r14,(%rsp)
mov    %rax,0x8(%rsp)
mov    %rbx,0x10(%rsp)
mov    %rax,0x18(%rsp)
mov    %r11,0x20(%rsp)
mov    %r10,0x28(%rsp)
mov    %rax,0x30(%rsp)
mov    $0x0,%al
call   1040 <dgemm_@plt>
lea    -0x98(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movsd  -0x98(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
lea    0xb97(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
lea    -0x90(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    1551 <main+0x3f1>
movl   $0x0,-0x28(%rbp)
cmpl   $0x208,-0x28(%rbp)
jge    153e <main+0x3de>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0x208,-0x2c(%rbp)
jge    1516 <main+0x3b6>
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x50(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    14bf <main+0x35f>
movsd  -0x78(%rbp),%xmm0
mov    -0x58(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    14a3 <main+0x343>
jmp    1543 <main+0x3e3>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    148f <main+0x32f>
lea    -0x98(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movsd  -0x98(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
lea    0xaa6(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
lea    -0x90(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    1663 <main+0x503>
imul   $0x208,-0x24(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x208,-0x28(%rbp)
jge    1650 <main+0x4f0>
imul   $0x208,-0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0x208,-0x2c(%rbp)
jge    1627 <main+0x4c7>
mov    -0x60(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x68(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    15d6 <main+0x476>
movsd  -0x78(%rbp),%xmm0
mov    -0x70(%rbp),%rax
imul   $0x208,-0x28(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    15b0 <main+0x450>
jmp    1655 <main+0x4f5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1592 <main+0x432>
lea    -0x98(%rbp),%rdi
mov    $0x0,%al
call   1070 <dtime@plt>
movsd  -0x98(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
lea    0x9a6(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1288 <main+0x128>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    16d0 <main+0x570>
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    16a4 <main+0x544>
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    170c <main+0x5ac>
mov    -0x50(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    16e0 <main+0x580>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
movl   $0x0,-0x24(%rbp)
cmpl   $0x208,-0x24(%rbp)
jge    1748 <main+0x5e8>
mov    -0x58(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1030 <free@plt>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    171c <main+0x5bc>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x60(%rbp),%rdi
call   1030 <free@plt>
mov    -0x68(%rbp),%rdi
call   1030 <free@plt>
mov    -0x70(%rbp),%rdi
call   1030 <free@plt>
mov    -0x14(%rbp),%eax
add    $0xc0,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%r12
xor    %ebx,%ebx
nopl   (%rax)
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,(%r12,%rbx,8)
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    1180 <main+0x20>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%r14
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,(%r14,%rbx,8)
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    11b0 <main+0x50>
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,%r15
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    $0x1040,%edi
call   1080 <malloc@plt>
mov    %rax,(%r15,%rbx,8)
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    11e0 <main+0x80>
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,0x10(%rsp)
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,0x28(%rsp)
mov    $0x210200,%edi
call   1080 <malloc@plt>
mov    %rax,0x20(%rsp)
xor    %eax,%eax
mov    %r12,0x38(%rsp)
mov    %r15,0x40(%rsp)
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %eax,0x30(%rsp)
mov    0x10(%rsp),%r13
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
mov    %r13,%r12
xor    %ebx,%ebx
mov    0x38(%rsp),%r15
nopw   0x0(%rax,%rax,1)
movsd  0xd98(%rip),%xmm0
mov    $0x1,%al
call   1060 <rnd@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mov    (%r15,%rbp,8),%rax
movsd  %xmm0,(%rax,%rbx,8)
movsd  %xmm0,(%r12)
add    $0x1,%rbx
add    $0x1040,%r12
cmp    $0x208,%rbx
jne    1260 <main+0x100>
add    $0x1,%rbp
add    $0x8,%r13
cmp    $0x208,%rbp
jne    1250 <main+0xf0>
mov    0x28(%rsp),%r12
xor    %r13d,%r13d
mov    0x40(%rsp),%r15
nopw   0x0(%rax,%rax,1)
mov    %r12,%rbx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0xd28(%rip),%xmm0
mov    $0x1,%al
call   1060 <rnd@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mov    (%r14,%r13,8),%rax
movsd  %xmm0,(%rax,%rbp,8)
movsd  %xmm0,(%rbx)
add    $0x1,%rbp
add    $0x1040,%rbx
cmp    $0x208,%rbp
jne    12d0 <main+0x170>
add    $0x1,%r13
add    $0x8,%r12
cmp    $0x208,%r13
jne    12c0 <main+0x160>
lea    0x18(%rsp),%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
movl   $0x208,0x34(%rsp)
movabs $0x3ff0000000000000,%rax
mov    %rax,0x50(%rsp)
movq   $0x0,0x48(%rsp)
sub    $0x8,%rsp
lea    0xcb6(%rip),%rdi
mov    %rdi,%rsi
lea    0x3c(%rsp),%rcx
mov    %rcx,%rdx
mov    %rcx,%r8
lea    0x58(%rsp),%r9
xor    %eax,%eax
push   %rcx
push   0x30(%rsp)
lea    0x60(%rsp),%rbp
push   %rbp
push   %rcx
mov    0x50(%rsp),%r13
push   %r13
push   %rcx
push   0x48(%rsp)
call   1040 <dgemm_@plt>
add    $0x40,%rsp
lea    0x8(%rsp),%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
movsd  0x8(%rsp),%xmm0
subsd  0x18(%rsp),%xmm0
lea    0xc63(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
xor    %eax,%eax
mov    0x38(%rsp),%r12
nop
mov    (%r12,%rax,8),%rcx
mov    (%r15,%rax,8),%rdx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
mov    (%r14,%rsi,8),%rdi
xorpd  %xmm0,%xmm0
mov    $0x4,%ebp
nopl   (%rax)
movsd  -0x20(%rcx,%rbp,8),%xmm1
movsd  -0x18(%rcx,%rbp,8),%xmm2
mulsd  -0x20(%rdi,%rbp,8),%xmm1
mulsd  -0x18(%rdi,%rbp,8),%xmm2
addsd  %xmm0,%xmm1
movsd  -0x10(%rcx,%rbp,8),%xmm3
mulsd  -0x10(%rdi,%rbp,8),%xmm3
addsd  %xmm1,%xmm2
movsd  -0x8(%rcx,%rbp,8),%xmm1
mulsd  -0x8(%rdi,%rbp,8),%xmm1
addsd  %xmm2,%xmm3
movsd  (%rcx,%rbp,8),%xmm0
mulsd  (%rdi,%rbp,8),%xmm0
addsd  %xmm3,%xmm1
addsd  %xmm1,%xmm0
add    $0x5,%rbp
cmp    $0x20c,%rbp
jne    13e0 <main+0x280>
movsd  %xmm0,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    $0x208,%rsi
jne    13d0 <main+0x270>
add    $0x1,%rax
cmp    $0x208,%rax
jne    13c0 <main+0x260>
lea    0x8(%rsp),%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
movsd  0x8(%rsp),%xmm0
subsd  0x18(%rsp),%xmm0
lea    0xba0(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
lea    0x18(%rsp),%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
mov    0x10(%rsp),%rax
xor    %ecx,%ecx
mov    0x20(%rsp),%rbx
nopl   0x0(%rax,%rax,1)
mov    %r13,%rdx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rsi,%rdi
shl    $0x9,%rdi
lea    (%rdi,%rsi,8),%rdi
xorpd  %xmm0,%xmm0
mov    $0x1,%ebp
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  -0x8(%rax,%rbp,8),%xmm1
movsd  (%rax,%rbp,8),%xmm2
mulsd  -0x8(%rdx,%rbp,8),%xmm1
mulsd  (%rdx,%rbp,8),%xmm2
addsd  %xmm0,%xmm1
movapd %xmm2,%xmm0
addsd  %xmm1,%xmm0
add    $0x2,%rbp
cmp    $0x209,%rbp
jne    14d0 <main+0x370>
add    %rcx,%rdi
movsd  %xmm0,(%rbx,%rdi,8)
add    $0x1,%rsi
add    $0x1040,%rdx
cmp    $0x208,%rsi
jne    14b0 <main+0x350>
add    $0x1,%rcx
add    $0x1040,%rax
cmp    $0x208,%rcx
jne    14a0 <main+0x340>
lea    0x8(%rsp),%rdi
xor    %eax,%eax
call   1070 <dtime@plt>
movsd  0x8(%rsp),%xmm0
subsd  0x18(%rsp),%xmm0
lea    0xadd(%rip),%rdi
mov    $0x1,%al
call   1050 <printf@plt>
mov    0x30(%rsp),%eax
add    $0x1,%eax
cmp    $0x5,%eax
jne    1240 <main+0xe0>
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    (%r12,%rbx,8),%rdi
call   1030 <free@plt>
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    1570 <main+0x410>
mov    %r12,%rdi
call   1030 <free@plt>
xor    %ebx,%ebx
mov    (%r14,%rbx,8),%rdi
call   1030 <free@plt>
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    1590 <main+0x430>
mov    %r14,%rdi
call   1030 <free@plt>
xor    %ebx,%ebx
mov    (%r15,%rbx,8),%rdi
call   1030 <free@plt>
add    $0x1,%rbx
cmp    $0x208,%rbx
jne    15b0 <main+0x450>
mov    %r15,%rdi
call   1030 <free@plt>
mov    0x10(%rsp),%rdi
call   1030 <free@plt>
mov    0x28(%rsp),%rdi
call   1030 <free@plt>
mov    0x20(%rsp),%rdi
call   1030 <free@plt>
xor    %eax,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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