void dgemm2(double *a, double *b, double *c, int n, int BLOCK_SIZE) {
  int i, j, k;
  int ii, jj, kk;
  for (i = 0; i < n; i += BLOCK_SIZE) {
    for (j = 0; j < n; j += BLOCK_SIZE) {
      for (k = 0; k < n; k += BLOCK_SIZE) {
        for (ii = i; ii < i + BLOCK_SIZE; ii += 3) {
          for (jj = j; jj < i + BLOCK_SIZE; jj += 3) {
            register double c11 = c[ii * n + jj];
            register double c12 = c[ii * n + jj + 1];
            register double c13 = c[ii * n + jj + 2];
            register double c21 = c[(ii + 1) * n + jj];
            register double c22 = c[(ii + 1) * n + jj + 1];
            register double c23 = c[(ii + 1) * n + jj + 2];
            register double c31 = c[(ii + 2) * n + jj];
            register double c32 = c[(ii + 2) * n + jj + 1];
            register double c33 = c[(ii + 2) * n + jj + 2];
            for (kk = k; kk < i + BLOCK_SIZE; kk++) {
              register double a1 = a[ii * n + kk];
              register double a2 = a[(ii + 1) * n + kk];
              register double a3 = a[(ii + 2) * n + kk];
              register double b1 = b[kk * n + jj];
              register double b2 = b[kk * n + jj + 1];
              register double b3 = b[kk * n + jj + 2];
              c11 += a1 * b1;
              c12 += a1 * b2;
              c13 += a1 * b3;
              c21 += a2 * b1;
              c22 += a2 * b2;
              c23 += a2 * b3;
              c31 += a3 * b1;
              c32 += a3 * b2;
              c33 += a3 * b3;
            }
            c[ii * n + jj] = c11;
            c[ii * n + jj + 1] = c12;
            c[ii * n + jj + 2] = c13;
            c[(ii + 1) * n + jj] = c21;
            c[(ii + 1) * n + jj + 1] = c22;
            c[(ii + 1) * n + jj + 2] = c23;
            c[(ii + 2) * n + jj] = c31;
            c[(ii + 2) * n + jj + 1] = c32;
            c[(ii + 2) * n + jj + 2] = c33;
          }
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<dgemm2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1621 <dgemm2+0x521>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    160e <dgemm2+0x50e>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    15fb <dgemm2+0x4fb>
mov    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x24(%rbp),%ecx
add    -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    15e8 <dgemm2+0x4e8>
mov    -0x28(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x24(%rbp),%ecx
add    -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    15d5 <dgemm2+0x4d5>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x24(%rbp),%ecx
add    -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    14b0 <dgemm2+0x3b0>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm2
ff
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0xb0(%rbp),%xmm2
ff
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm2
ff
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0xb0(%rbp),%xmm2
ff
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm2
ff
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0xb0(%rbp),%xmm2
ff
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    129f <dgemm2+0x19f>
movsd  -0x40(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
add    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x34(%rbp)
jmp    1171 <dgemm2+0x71>
jmp    15da <dgemm2+0x4da>
mov    -0x30(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x30(%rbp)
jmp    115a <dgemm2+0x5a>
jmp    15ed <dgemm2+0x4ed>
mov    -0x20(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1148 <dgemm2+0x48>
jmp    1600 <dgemm2+0x500>
mov    -0x20(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1135 <dgemm2+0x35>
jmp    1613 <dgemm2+0x513>
mov    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1122 <dgemm2+0x22>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dgemm2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r8d,-0x7c(%rsp)
mov    %rsi,-0x58(%rsp)
mov    %rdi,-0x78(%rsp)
mov    %ecx,-0x80(%rsp)
test   %ecx,%ecx
jle    1450 <dgemm2+0x350>
movslq -0x7c(%rsp),%rax
mov    -0x80(%rsp),%ecx
addq   $0x10,-0x58(%rsp)
lea    0x0(,%rax,8),%rsi
mov    %rsi,-0x38(%rsp)
mov    %rax,-0x70(%rsp)
imul   %rcx,%rax
shl    $0x3,%rax
mov    %rax,-0x40(%rsp)
lea    0x0(,%rcx,8),%rbx
mov    %rcx,%rsi
shl    $0x4,%rsi
mov    -0x78(%rsp),%rax
add    %rax,%rsi
mov    %rsi,-0x48(%rsp)
lea    (%rbx,%rbx,2),%rsi
mov    %rsi,0x8(%rsp)
mov    %rcx,-0x18(%rsp)
lea    (%rax,%rcx,8),%rax
mov    %rax,-0x50(%rsp)
xor    %ecx,%ecx
jmp    11b2 <dgemm2+0xb2>
xchg   %ax,%ax
mov    -0x40(%rsp),%rax
add    %rax,-0x48(%rsp)
add    %rax,-0x50(%rsp)
add    %rax,-0x78(%rsp)
mov    %rbp,%rcx
cmp    -0x18(%rsp),%rbp
jge    1450 <dgemm2+0x350>
mov    -0x70(%rsp),%rax
mov    %rcx,(%rsp)
lea    (%rcx,%rax,1),%rbp
mov    -0x58(%rsp),%rax
xor    %ecx,%ecx
jmp    11ea <dgemm2+0xea>
nopl   0x0(%rax,%rax,1)
mov    -0x10(%rsp),%rcx
add    -0x70(%rsp),%rcx
mov    -0x8(%rsp),%rax
add    -0x38(%rsp),%rax
cmp    -0x80(%rsp),%ecx
jge    1190 <dgemm2+0x90>
mov    %rcx,-0x10(%rsp)
movslq %ecx,%rcx
mov    %rcx,0x10(%rsp)
mov    -0x78(%rsp),%rcx
mov    %rcx,-0x20(%rsp)
mov    -0x50(%rsp),%rcx
mov    %rcx,-0x28(%rsp)
mov    -0x48(%rsp),%rcx
mov    %rcx,-0x30(%rsp)
mov    %rax,-0x8(%rsp)
mov    %rax,-0x68(%rsp)
xor    %r8d,%r8d
jmp    1263 <dgemm2+0x163>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    -0x70(%rsp),%r8
mov    -0x68(%rsp),%rax
add    -0x40(%rsp),%rax
mov    %rax,-0x68(%rsp)
mov    -0x38(%rsp),%rax
add    %rax,-0x30(%rsp)
add    %rax,-0x28(%rsp)
add    %rax,-0x20(%rsp)
cmp    -0x80(%rsp),%r8d
jge    11d0 <dgemm2+0xd0>
cmpl   $0x0,-0x7c(%rsp)
jle    1230 <dgemm2+0x130>
movslq %r8d,%r10
mov    -0x20(%rsp),%r12
mov    -0x28(%rsp),%rsi
mov    -0x30(%rsp),%r13
mov    (%rsp),%rax
mov    %rax,-0x60(%rsp)
mov    %r10,0x18(%rsp)
jmp    12b5 <dgemm2+0x1b5>
nopl   0x0(%rax)
mov    -0x60(%rsp),%rcx
add    $0x3,%rcx
mov    0x8(%rsp),%rax
add    %rax,%r13
add    %rax,%rsi
add    %rax,%r12
mov    %rcx,-0x60(%rsp)
cmp    %rbp,%rcx
jge    1230 <dgemm2+0x130>
cmp    %rbp,0x10(%rsp)
jge    1290 <dgemm2+0x190>
mov    -0x60(%rsp),%rcx
mov    %rcx,%r11
mov    -0x18(%rsp),%rax
imul   %rax,%r11
lea    0x1(%rcx),%rdi
imul   %rax,%rdi
add    $0x2,%rcx
imul   %rax,%rcx
mov    %rcx,0x30(%rsp)
mov    -0x68(%rsp),%r14
mov    -0x10(%rsp),%r15
mov    %r11,0x28(%rsp)
mov    %rdi,0x20(%rsp)
jmp    1336 <dgemm2+0x236>
nopl   0x0(%rax,%rax,1)
movupd %xmm6,(%rdx,%rcx,8)
movsd  %xmm12,0x10(%rdx,%rcx,8)
movupd %xmm0,(%rdx,%r9,8)
movsd  %xmm11,0x10(%rdx,%r9,8)
movupd %xmm5,(%rdx,%rax,8)
movsd  %xmm10,0x10(%rdx,%rax,8)
add    $0x3,%r15
add    $0x18,%r14
cmp    %rbp,%r15
jge    1290 <dgemm2+0x190>
lea    (%r15,%r11,1),%rcx
lea    (%r15,%rdi,1),%r9
mov    0x30(%rsp),%rax
add    %r15,%rax
movupd (%rdx,%rcx,8),%xmm6
movsd  0x10(%rdx,%rcx,8),%xmm12
movupd (%rdx,%r9,8),%xmm0
movsd  0x10(%rdx,%r9,8),%xmm11
movupd (%rdx,%rax,8),%xmm5
movsd  0x10(%rdx,%rax,8),%xmm10
cmp    %rbp,%r10
jge    1300 <dgemm2+0x200>
xor    %r10d,%r10d
mov    %r14,%rdi
cs nopw 0x0(%rax,%rax,1)
movapd %xmm6,%xmm8
movapd %xmm0,%xmm9
movapd %xmm5,%xmm13
movsd  (%r12,%r10,8),%xmm0
movsd  (%rsi,%r10,8),%xmm5
movsd  0x0(%r13,%r10,8),%xmm2
movupd -0x10(%rdi),%xmm1
movsd  (%rdi),%xmm14
movapd %xmm0,%xmm3
unpcklpd %xmm0,%xmm3
mulpd  %xmm1,%xmm3
movapd %xmm3,%xmm6
addpd  %xmm8,%xmm6
mulsd  %xmm14,%xmm0
addsd  %xmm0,%xmm12
movapd %xmm5,%xmm4
unpcklpd %xmm5,%xmm4
mulpd  %xmm1,%xmm4
movapd %xmm4,%xmm0
addpd  %xmm9,%xmm0
mulsd  %xmm14,%xmm5
addsd  %xmm5,%xmm11
movapd %xmm2,%xmm7
unpcklpd %xmm2,%xmm7
mulpd  %xmm1,%xmm7
movapd %xmm7,%xmm5
addpd  %xmm13,%xmm5
mulsd  %xmm14,%xmm2
addsd  %xmm2,%xmm10
add    %rbx,%rdi
lea    (%r8,%r10,1),%r11
add    $0x1,%r11
add    $0x1,%r10
cmp    %rbp,%r11
jl     1380 <dgemm2+0x280>
addpd  %xmm13,%xmm7
addpd  %xmm9,%xmm4
addpd  %xmm8,%xmm3
movapd %xmm7,%xmm5
movapd %xmm4,%xmm0
movapd %xmm3,%xmm6
mov    0x18(%rsp),%r10
mov    0x28(%rsp),%r11
mov    0x20(%rsp),%rdi
jmp    1300 <dgemm2+0x200>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @dgemm2(double* nocapture %0, double* nocapture %1, double* nocapture %2, i32 %3, i32 %4) {
%6 = icmp sgt i32 %3, 0
br i1 %6, label %7, label %124
7: ; preds = %5
%8 = sext i32 %4 to i64
%9 = zext i32 %3 to i64
%10 = icmp sgt i32 %4, 0
br label %11
11: ; preds = %122, %7
%12 = phi i64 [ 0, %7 ], [ %13, %122 ]
%13 = add nsw i64 %12, %8
br label %14
14: ; preds = %118, %11
%15 = phi i64 [ 0, %11 ], [ %119, %118 ]
%16 = shl i64 %15, 32
%17 = ashr exact i64 %16, 32
%18 = icmp slt i64 %17, %13
br label %19
19: ; preds = %14, %114
%20 = phi i64 [ 0, %14 ], [ %115, %114 ]
br i1 %10, label %21, label %114
21: ; preds = %19
%22 = shl i64 %20, 32
%23 = ashr exact i64 %22, 32
%24 = icmp slt i64 %23, %13
br label %25
25: ; preds = %21, %111
%26 = phi i64 [ %12, %21 ], [ %112, %111 ]
br i1 %18, label %27, label %111
27: ; preds = %25
%28 = mul nsw i64 %26, %9
%29 = add nsw i64 %26, 1
%30 = mul nsw i64 %29, %9
%31 = add nsw i64 %26, 2
%32 = mul nsw i64 %31, %9
br label %33
33: ; preds = %27, %99
%34 = phi i64 [ %15, %27 ], [ %109, %99 ]
%35 = add nsw i64 %34, %28
%36 = getelementptr inbounds double, double* %2, i64 %35
%37 = bitcast double* %36 to <2 x double>*
%38 = load <2 x double>, <2 x double>* %37
%39 = add nsw i64 %35, 2
%40 = getelementptr inbounds double, double* %2, i64 %39
%41 = load double, double* %40
%42 = add nsw i64 %34, %30
%43 = getelementptr inbounds double, double* %2, i64 %42
%44 = bitcast double* %43 to <2 x double>*
%45 = load <2 x double>, <2 x double>* %44
%46 = add nsw i64 %42, 2
%47 = getelementptr inbounds double, double* %2, i64 %46
%48 = load double, double* %47
%49 = add nsw i64 %34, %32
%50 = getelementptr inbounds double, double* %2, i64 %49
%51 = bitcast double* %50 to <2 x double>*
%52 = load <2 x double>, <2 x double>* %51
%53 = add nsw i64 %49, 2
%54 = getelementptr inbounds double, double* %2, i64 %53
%55 = load double, double* %54
br i1 %24, label %56, label %99
56: ; preds = %33, %56
%57 = phi i64 [ %93, %56 ], [ %20, %33 ]
%58 = phi double [ %92, %56 ], [ %55, %33 ]
%59 = phi double [ %88, %56 ], [ %48, %33 ]
%60 = phi double [ %84, %56 ], [ %41, %33 ]
%61 = phi <2 x double> [ %91, %56 ], [ %52, %33 ]
%62 = phi <2 x double> [ %87, %56 ], [ %45, %33 ]
%63 = phi <2 x double> [ %83, %56 ], [ %38, %33 ]
%64 = add nsw i64 %57, %28
%65 = getelementptr inbounds double, double* %0, i64 %64
%66 = load double, double* %65
%67 = add nsw i64 %57, %30
%68 = getelementptr inbounds double, double* %0, i64 %67
%69 = load double, double* %68
%70 = add nsw i64 %57, %32
%71 = getelementptr inbounds double, double* %0, i64 %70
%72 = load double, double* %71
%73 = mul nsw i64 %57, %9
%74 = add nsw i64 %73, %34
%75 = getelementptr inbounds double, double* %1, i64 %74
%76 = bitcast double* %75 to <2 x double>*
%77 = load <2 x double>, <2 x double>* %76
%78 = add nsw i64 %74, 2
%79 = getelementptr inbounds double, double* %1, i64 %78
%80 = load double, double* %79
%81 = insertelement <2 x double> poison, double %66, i64 0
%82 = shufflevector <2 x double> %81, <2 x double> poison, <2 x i32> zeroinitializer
%83 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %77, <2 x double> %63)
%84 = tail call double @llvm.fmuladd.f64(double %66, double %80, double %60)
%85 = insertelement <2 x double> poison, double %69, i64 0
%86 = shufflevector <2 x double> %85, <2 x double> poison, <2 x i32> zeroinitializer
%87 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %86, <2 x double> %77, <2 x double> %62)
%88 = tail call double @llvm.fmuladd.f64(double %69, double %80, double %59)
%89 = insertelement <2 x double> poison, double %72, i64 0
%90 = shufflevector <2 x double> %89, <2 x double> poison, <2 x i32> zeroinitializer
%91 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %90, <2 x double> %77, <2 x double> %61)
%92 = tail call double @llvm.fmuladd.f64(double %72, double %80, double %58)
%93 = add nsw i64 %57, 1
%94 = icmp slt i64 %93, %13
br i1 %94, label %56, label %95
95: ; preds = %56
%96 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %90, <2 x double> %77, <2 x double> %61)
%97 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %86, <2 x double> %77, <2 x double> %62)
%98 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %77, <2 x double> %63)
br label %99
99: ; preds = %95, %33
%100 = phi double [ %41, %33 ], [ %84, %95 ]
%101 = phi double [ %48, %33 ], [ %88, %95 ]
%102 = phi double [ %55, %33 ], [ %92, %95 ]
%103 = phi <2 x double> [ %52, %33 ], [ %96, %95 ]
%104 = phi <2 x double> [ %45, %33 ], [ %97, %95 ]
%105 = phi <2 x double> [ %38, %33 ], [ %98, %95 ]
%106 = bitcast double* %36 to <2 x double>*
store <2 x double> %105, <2 x double>* %106
store double %100, double* %40
%107 = bitcast double* %43 to <2 x double>*
store <2 x double> %104, <2 x double>* %107
store double %101, double* %47
%108 = bitcast double* %50 to <2 x double>*
store <2 x double> %103, <2 x double>* %108
store double %102, double* %54
%109 = add nsw i64 %34, 3
%110 = icmp slt i64 %109, %13
br i1 %110, label %33, label %111
111: ; preds = %99, %25
%112 = add nsw i64 %26, 3
%113 = icmp slt i64 %112, %13
br i1 %113, label %25, label %114
114: ; preds = %111, %19
%115 = add i64 %20, %8
%116 = trunc i64 %115 to i32
%117 = icmp slt i32 %116, %3
br i1 %117, label %19, label %118
118: ; preds = %114
%119 = add nsw i64 %15, %8
%120 = trunc i64 %119 to i32
%121 = icmp slt i32 %120, %3
br i1 %121, label %14, label %122
122: ; preds = %118
%123 = icmp slt i64 %13, %9
br i1 %123, label %11, label %124
124: ; preds = %122, %5
ret void
}