void dgemm(const int M, const int N, const int K, const double alpha,
           const double *A, const int lda, const double *B, const int ldb,
           const double beta, double *C, const int ldc) {
  int ib, jb, kb;
  int i, j, k;
  double Ab[240 * 240];
  double Bb[240 * 3000];
  double Cb[240 * 3000];
  double copytime = 0.;
  double computetime = 0.;
  for (kb = 0; kb < K; kb += 240) {
    int Kb = (((240) < (K - kb)) ? (240) : (K - kb));
    for (ib = 0; ib < M; ib += 240) {
      int Mb = (((240) < (M - ib)) ? (240) : (M - ib));
      for (k = 0; k < Kb; ++k)
        for (i = 0; i < Mb; ++i) {
          Ab[i * 240 + k] = A[(k + kb) * lda + (i + ib)];
        }
      for (jb = 0; jb < N; jb += 3000) {
        int Nb = (((3000) < (N - jb)) ? (3000) : (N - jb));
        for (j = 0; j < Nb; j = j + 1)
          for (k = 0; k < Kb - Kb % 1; k = k + 1) {
            Bb[j * 240 + k + 0] = B[(jb + j) * ldb + k + kb + 0];
          }
        for (i = 0; i < Mb; i = i + 1)
          for (j = 0; j < Nb; j = j + 1) {
            double c11 = 0.;
            for (k = 0; k < Kb; k = k + 1) {
              c11 += Ab[(i + 0) * 240 + k] * B[(j + jb) * ldb + (k + kb)];
            }
            C[(j + jb) * ldc + (i + ib)] += alpha * c11;
          }
      }
    }
  }
}


x86 assembly (clang, -O0):
<dgemm>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb6d010,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm1,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb6d058(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb6d060(%rbp)
ff
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1499 <dgemm+0x399>
mov    -0xc(%rbp),%ecx
sub    -0x44(%rbp),%ecx
mov    $0xf0,%eax
cmp    %ecx,%eax
jge    1180 <dgemm+0x80>
mov    $0xf0,%eax
mov    %eax,-0xb6d07c(%rbp)
jmp    118c <dgemm+0x8c>
mov    -0xc(%rbp),%eax
sub    -0x44(%rbp),%eax
mov    %eax,-0xb6d07c(%rbp)
mov    -0xb6d07c(%rbp),%eax
mov    %eax,-0xb6d064(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1484 <dgemm+0x384>
mov    -0x4(%rbp),%ecx
sub    -0x3c(%rbp),%ecx
mov    $0xf0,%eax
cmp    %ecx,%eax
jge    11ce <dgemm+0xce>
mov    $0xf0,%eax
mov    %eax,-0xb6d080(%rbp)
jmp    11da <dgemm+0xda>
mov    -0x4(%rbp),%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0xb6d080(%rbp)
mov    -0xb6d080(%rbp),%eax
mov    %eax,-0xb6d068(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0xb6d064(%rbp),%eax
jge    1266 <dgemm+0x166>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0xb6d068(%rbp),%eax
jge    1253 <dgemm+0x153>
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    -0x44(%rbp),%ecx
imul   -0x24(%rbp),%ecx
mov    -0x48(%rbp),%edx
add    -0x3c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
imul   $0xf0,-0x48(%rbp),%eax
add    -0x50(%rbp),%eax
cltq
movsd  %xmm0,-0x70850(%rbp,%rax,8)
f8 ff
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1203 <dgemm+0x103>
jmp    1258 <dgemm+0x158>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    11ed <dgemm+0xed>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    146f <dgemm+0x36f>
mov    -0x8(%rbp),%ecx
sub    -0x40(%rbp),%ecx
mov    $0xbb8,%eax
cmp    %ecx,%eax
jge    129c <dgemm+0x19c>
mov    $0xbb8,%eax
mov    %eax,-0xb6d084(%rbp)
jmp    12a8 <dgemm+0x1a8>
mov    -0x8(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0xb6d084(%rbp)
mov    -0xb6d084(%rbp),%eax
mov    %eax,-0xb6d06c(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0xb6d06c(%rbp),%eax
jge    1356 <dgemm+0x256>
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0xb6d088(%rbp)
mov    -0xb6d064(%rbp),%ecx
mov    -0xb6d064(%rbp),%eax
mov    $0x1,%esi
cltd
idiv   %esi
mov    -0xb6d088(%rbp),%eax
sub    %edx,%ecx
cmp    %ecx,%eax
jge    1343 <dgemm+0x243>
mov    -0x30(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    -0x4c(%rbp),%ecx
imul   0x10(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    -0x44(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
imul   $0xf0,-0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
add    $0x0,%eax
cltq
movsd  %xmm0,-0x5eec50(%rbp,%rax,8)
a1 ff
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    12d1 <dgemm+0x1d1>
jmp    1348 <dgemm+0x248>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12bb <dgemm+0x1bb>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0xb6d068(%rbp),%eax
jge    145a <dgemm+0x35a>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0xb6d06c(%rbp),%eax
jge    1447 <dgemm+0x347>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb6d078(%rbp)
ff
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0xb6d064(%rbp),%eax
jge    1401 <dgemm+0x301>
mov    -0x48(%rbp),%eax
add    $0x0,%eax
imul   $0xf0,%eax,%eax
add    -0x50(%rbp),%eax
cltq
movsd  -0x70850(%rbp,%rax,8),%xmm0
f8 ff
mov    -0x30(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    -0x40(%rbp),%ecx
imul   0x10(%rbp),%ecx
mov    -0x50(%rbp),%edx
add    -0x44(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0xb6d078(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb6d078(%rbp)
ff
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1394 <dgemm+0x294>
movsd  -0x18(%rbp),%xmm0
movsd  -0xb6d078(%rbp),%xmm2
ff
mov    0x18(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    -0x40(%rbp),%ecx
imul   0x20(%rbp),%ecx
mov    -0x48(%rbp),%edx
add    -0x3c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1373 <dgemm+0x273>
jmp    144c <dgemm+0x34c>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    135d <dgemm+0x25d>
jmp    145f <dgemm+0x35f>
mov    -0x40(%rbp),%eax
add    $0xbb8,%eax
mov    %eax,-0x40(%rbp)
jmp    126d <dgemm+0x16d>
jmp    1474 <dgemm+0x374>
mov    -0x3c(%rbp),%eax
add    $0xf0,%eax
mov    %eax,-0x3c(%rbp)
jmp    119f <dgemm+0x9f>
jmp    1489 <dgemm+0x389>
mov    -0x44(%rbp),%eax
add    $0xf0,%eax
mov    %eax,-0x44(%rbp)
jmp    1151 <dgemm+0x51>
add    $0xb6d010,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dgemm>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x70868,%rsp
mov    %r8d,-0x7c(%rsp)
mov    %rcx,-0x58(%rsp)
mov    %esi,-0x68(%rsp)
mov    %edi,-0x6c(%rsp)
test   %edx,%edx
jle    161c <dgemm+0x51c>
mov    0x708a8(%rsp),%rbp
mov    0x708a0(%rsp),%eax
movslq 0x708b0(%rsp),%rcx
mov    %rcx,0x58(%rsp)
movslq -0x68(%rsp),%rcx
mov    %rcx,-0x30(%rsp)
movslq -0x6c(%rsp),%rsi
mov    %edx,%ecx
imul   $0xf0,-0x7c(%rsp),%edx
mov    %edx,-0x44(%rsp)
imul   $0xbb8,%eax,%edx
mov    %rdx,0x28(%rsp)
mov    %eax,%r12d
movl   $0x1,-0x80(%rsp)
xor    %edx,%edx
mov    %rcx,%rdi
mov    $0x1,%eax
mov    %rax,-0x38(%rsp)
xor    %eax,%eax
mov    %rax,-0x78(%rsp)
mov    %rsi,0x10(%rsp)
mov    %rcx,-0x40(%rsp)
jmp    11eb <dgemm+0xeb>
nopl   0x0(%rax)
mov    -0x78(%rsp),%rbx
add    $0xf0,%rbx
mov    0x8(%rsp),%rdx
add    $0x1,%rdx
mov    -0x80(%rsp),%eax
add    -0x44(%rsp),%eax
mov    %eax,-0x80(%rsp)
addq   $0xf0,-0x38(%rsp)
mov    (%rsp),%rdi
add    $0xffffffffffffff10,%rdi
mov    -0x40(%rsp),%rcx
mov    %rbx,%rax
mov    %rbx,-0x78(%rsp)
cmp    %rcx,%rbx
jae    161c <dgemm+0x51c>
cmp    $0xf0,%rdi
mov    $0xf0,%eax
mov    %rdi,(%rsp)
cmovl  %rdi,%rax
movslq %eax,%rdi
cmp    $0x2,%rdi
mov    $0x1,%eax
cmovl  %rax,%rdi
mov    %rdx,0x8(%rsp)
imul   $0xffffffffffffff10,%rdx,%rdx
add    %rcx,%rdx
cmp    $0xf0,%rdx
mov    $0xf0,%ecx
cmovge %rcx,%rdx
mov    %rdx,-0x10(%rsp)
movslq %edx,%rcx
cmp    $0x2,%rcx
cmovl  %rax,%rcx
mov    %rcx,0x50(%rsp)
cmpl   $0x0,-0x6c(%rsp)
jle    11a0 <dgemm+0xa0>
movabs $0x7ffffffffffffffe,%rax
ff ff 7f
and    %rax,%rdi
shlq   $0x20,-0x10(%rsp)
mov    -0x40(%rsp),%rcx
sub    -0x78(%rsp),%rcx
cmp    $0xf0,%rcx
mov    $0xf0,%eax
mov    %rcx,-0x8(%rsp)
cmovl  %rcx,%rax
cltq
mov    %rax,0x30(%rsp)
mov    %rsi,%rcx
mov    -0x80(%rsp),%eax
mov    %eax,-0x64(%rsp)
xor    %edx,%edx
xor    %ebx,%ebx
jmp    12d7 <dgemm+0x1d7>
nopl   0x0(%rax,%rax,1)
mov    -0x60(%rsp),%rbx
add    $0xf0,%rbx
mov    0x18(%rsp),%rdx
add    $0x1,%rdx
addl   $0xf0,-0x64(%rsp)
mov    0x20(%rsp),%rcx
add    $0xffffffffffffff10,%rcx
mov    0x10(%rsp),%rsi
cmp    %rsi,%rbx
jge    11a0 <dgemm+0xa0>
cmp    $0xf0,%rcx
mov    $0xf0,%eax
mov    %rcx,0x20(%rsp)
cmovl  %rcx,%rax
movslq %eax,%rcx
cmp    $0x2,%rcx
mov    $0x1,%eax
cmovl  %rax,%rcx
mov    %rdx,0x18(%rsp)
imul   $0xffffffffffffff10,%rdx,%r11
add    %rsi,%r11
cmp    $0xf0,%r11
mov    $0xf0,%edx
cmovge %rdx,%r11
movslq %r11d,%r10
cmp    $0x2,%r10
cmovl  %rax,%r10
mov    %rbx,%rax
mov    %rbx,-0x60(%rsp)
sub    %rbx,%rsi
cmp    $0xf0,%rsi
mov    $0xf0,%r8d
mov    %rsi,-0x28(%rsp)
cmovl  %rsi,%r8
cmpq   $0x0,-0x8(%rsp)
mov    -0x58(%rsp),%rdx
jle    1450 <dgemm+0x350>
movabs $0x7ffffffffffffffe,%rax
ff ff 7f
and    %rax,%rcx
shl    $0x20,%r11
lea    0x60(%rsp),%r14
mov    -0x64(%rsp),%r15d
xor    %r13d,%r13d
jmp    1398 <dgemm+0x298>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13
add    -0x7c(%rsp),%r15d
add    $0x8,%r14
cmp    0x30(%rsp),%r13
jge    1450 <dgemm+0x350>
cmpq   $0x0,-0x28(%rsp)
jle    1380 <dgemm+0x280>
movabs $0x200000000,%rax
cmp    %rax,%r11
jge    13c0 <dgemm+0x2c0>
xor    %ebx,%ebx
jmp    140c <dgemm+0x30c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r14,%rax
mov    %r15d,%esi
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
lea    -0x1(%rsi),%edx
movslq %edx,%rdx
mov    -0x58(%rsp),%rbp
movsd  0x0(%rbp,%rdx,8),%xmm1
mov    -0x58(%rsp),%rdx
movsd  %xmm1,(%rax)
movslq %esi,%rsi
movsd  (%rdx,%rsi,8),%xmm1
movsd  %xmm1,0x780(%rax)
add    $0x2,%rbx
add    $0x2,%esi
add    $0xf00,%rax
cmp    %rbx,%rcx
jne    13d0 <dgemm+0x2d0>
test   $0x1,%r10b
mov    0x708a8(%rsp),%rbp
je     1380 <dgemm+0x280>
mov    -0x78(%rsp),%rax
add    %r13d,%eax
imul   -0x7c(%rsp),%eax
add    -0x60(%rsp),%eax
add    %ebx,%eax
cltq
movsd  (%rdx,%rax,8),%xmm1
imul   $0xf0,%rbx,%rax
add    %r13,%rax
movsd  %xmm1,0x60(%rsp,%rax,8)
jmp    1380 <dgemm+0x280>
nopl   (%rax)
cmpl   $0x0,-0x68(%rsp)
jle    12a0 <dgemm+0x1a0>
movslq %r8d,%rax
mov    %rax,0x38(%rsp)
mov    -0x78(%rsp),%rax
mov    %rax,-0x18(%rsp)
mov    -0x38(%rsp),%rax
mov    %rax,-0x20(%rsp)
xor    %r8d,%r8d
jmp    14a1 <dgemm+0x3a1>
nopl   0x0(%rax)
add    $0xbb8,%r8
mov    0x28(%rsp),%rax
add    %rax,-0x20(%rsp)
add    %rax,-0x18(%rsp)
cmp    -0x30(%rsp),%r8
jge    12a0 <dgemm+0x1a0>
cmpq   $0x0,-0x28(%rsp)
jle    1480 <dgemm+0x380>
mov    -0x30(%rsp),%rcx
sub    %r8,%rcx
cmp    $0xbb8,%rcx
mov    $0xbb8,%eax
mov    %rcx,0x40(%rsp)
cmovl  %rcx,%rax
movslq %eax,%r14
lea    0x68(%rsp),%rdx
xor    %eax,%eax
mov    %rax,-0x50(%rsp)
jmp    14ff <dgemm+0x3ff>
nopw   0x0(%rax,%rax,1)
mov    -0x50(%rsp),%rcx
add    $0x1,%rcx
add    $0x780,%rdx
mov    %rcx,%rax
mov    %rcx,-0x50(%rsp)
cmp    0x38(%rsp),%rcx
jge    1480 <dgemm+0x380>
cmpq   $0x0,0x40(%rsp)
jle    14e0 <dgemm+0x3e0>
mov    -0x50(%rsp),%rcx
imul   $0xf0,%rcx,%rax
mov    %rax,0x48(%rsp)
mov    -0x60(%rsp),%rax
lea    (%rcx,%rax,1),%r11
mov    -0x18(%rsp),%r13
mov    -0x20(%rsp),%rsi
xor    %r15d,%r15d
jmp    155c <dgemm+0x45c>
xorpd  %xmm1,%xmm1
imul   0x58(%rsp),%rax
add    %r11,%rax
mulsd  %xmm0,%xmm1
addsd  0x0(%rbp,%rax,8),%xmm1
movsd  %xmm1,0x0(%rbp,%rax,8)
add    $0x1,%r15
add    %r12,%rsi
add    %r12,%r13
cmp    %r14,%r15
jge    14e0 <dgemm+0x3e0>
lea    (%r15,%r8,1),%rax
cmpq   $0x0,-0x8(%rsp)
jle    1530 <dgemm+0x430>
movabs $0x200000000,%rcx
cmp    %rcx,-0x10(%rsp)
jge    1590 <dgemm+0x490>
xorpd  %xmm1,%xmm1
xor    %ebx,%ebx
jmp    15d9 <dgemm+0x4d9>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorpd  %xmm2,%xmm2
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
lea    (%rbx,%r13,1),%r10d
movslq %r10d,%rcx
movsd  -0x8(%rdx,%rbx,8),%xmm3
movsd  (%rdx,%rbx,8),%xmm1
mulsd  (%r9,%rcx,8),%xmm3
lea    (%rsi,%rbx,1),%ecx
movslq %ecx,%rcx
mulsd  (%r9,%rcx,8),%xmm1
addsd  %xmm2,%xmm3
addsd  %xmm3,%xmm1
add    $0x2,%rbx
movapd %xmm1,%xmm2
cmp    %rbx,%rdi
jne    15a0 <dgemm+0x4a0>
testb  $0x1,0x50(%rsp)
je     1534 <dgemm+0x434>
mov    %eax,%ecx
imul   0x708a0(%rsp),%ecx
add    -0x78(%rsp),%ecx
mov    0x48(%rsp),%rbp
add    %rbx,%rbp
movsd  0x60(%rsp,%rbp,8),%xmm2
mov    0x708a8(%rsp),%rbp
add    %ecx,%ebx
movslq %ebx,%rcx
mulsd  (%r9,%rcx,8),%xmm2
addsd  %xmm2,%xmm1
jmp    1534 <dgemm+0x434>
add    $0x70868,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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