void tiled_sgemm_tt(const int M, const int N, const int K, const float alpha,
                    const float *A, const int LDA, const float *B,
                    const int LDB, const float beta, float *C, const int LDC) {
#pragma omp target teams map(to : A[M * K], B[K * N]) map(from : C[M * N])
#pragma omp distribute collapse(2)
  for (int C_row_start = 0; C_row_start < M; C_row_start += 16)
    for (int C_col_start = 0; C_col_start < N; C_col_start += 16) {
      float As[16][16];
      float Bs[16][16];
      float Cs[16][16];
      int C_row, C_col;
#pragma omp parallel for collapse(2)
      for (int row = 0; row < 16; row++)
        for (int col = 0; col < 16; col++) {
          Cs[row][col] = 0.0;
        }
      for (int kblock = 0; kblock < K; kblock += 16) {
#pragma omp parallel for collapse(2)
        for (int row = 0; row < 16; row++)
          for (int col = 0; col < 16; col++) {
            C_row = C_row_start + row;
            C_col = C_col_start + col;
            if ((C_row < M) && (kblock + col < K))
              As[row][col] = A[(C_row * LDA) + kblock + col];
            else
              As[row][col] = 0;
            if ((kblock + row < K) && C_col < N)
              Bs[row][col] = B[((kblock + row) * LDB) + C_col];
            else
              Bs[row][col] = 0;
          }
#pragma omp parallel for collapse(2)
        for (int row = 0; row < 16; row++)
          for (int col = 0; col < 16; col++) {
            for (int e = 0; e < 16; ++e)
              Cs[row][col] += As[row][e] * Bs[e][col];
          }
      }
#pragma omp parallel for collapse(2)
      for (int row = 0; row < 16; row++)
        for (int col = 0; col < 16; col++) {
          C_row = C_row_start + row;
          C_col = C_col_start + col;
          if ((C_row < M) && (C_col < N))
            C[(C_row * LDC) + C_col] =
                alpha * Cs[row][col] + beta * C[(C_row * LDC) + C_col];
        }
    }
}


x86 assembly (clang, -O0):
<tiled_sgemm_tt>:
push   %rbp
mov    %rsp,%rbp
sub    $0xbf0,%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)
movss  %xmm0,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9,-0x28(%rbp)
movss  %xmm1,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    15d1 <tiled_sgemm_tt+0x4d1>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    15be <tiled_sgemm_tt+0x4be>
movl   $0x0,-0xc4c(%rbp)
cmpl   $0x10,-0xc4c(%rbp)
jge    11d9 <tiled_sgemm_tt+0xd9>
movl   $0x0,-0xc50(%rbp)
cmpl   $0x10,-0xc50(%rbp)
jge    11c0 <tiled_sgemm_tt+0xc0>
movslq -0xc4c(%rbp),%rcx
lea    -0xc40(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc50(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0xc50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc50(%rbp)
jmp    117b <tiled_sgemm_tt+0x7b>
jmp    11c5 <tiled_sgemm_tt+0xc5>
mov    -0xc4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc4c(%rbp)
jmp    1164 <tiled_sgemm_tt+0x64>
movl   $0x0,-0xc54(%rbp)
mov    -0xc54(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14a4 <tiled_sgemm_tt+0x3a4>
movl   $0x0,-0xc58(%rbp)
cmpl   $0x10,-0xc58(%rbp)
jge    1390 <tiled_sgemm_tt+0x290>
movl   $0x0,-0xc5c(%rbp)
cmpl   $0x10,-0xc5c(%rbp)
jge    1377 <tiled_sgemm_tt+0x277>
mov    -0x30(%rbp),%eax
add    -0xc58(%rbp),%eax
mov    %eax,-0xc44(%rbp)
mov    -0x34(%rbp),%eax
add    -0xc5c(%rbp),%eax
mov    %eax,-0xc48(%rbp)
mov    -0xc44(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12aa <tiled_sgemm_tt+0x1aa>
mov    -0xc54(%rbp),%eax
add    -0xc5c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12aa <tiled_sgemm_tt+0x1aa>
mov    -0x18(%rbp),%rax
mov    -0xc44(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0xc54(%rbp),%ecx
add    -0xc5c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movslq -0xc58(%rbp),%rcx
lea    -0x440(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc5c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    12ce <tiled_sgemm_tt+0x1ce>
movslq -0xc58(%rbp),%rcx
lea    -0x440(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc5c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0xc54(%rbp),%eax
add    -0xc58(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    133a <tiled_sgemm_tt+0x23a>
mov    -0xc48(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    133a <tiled_sgemm_tt+0x23a>
mov    -0x28(%rbp),%rax
mov    -0xc54(%rbp),%ecx
add    -0xc58(%rbp),%ecx
imul   0x10(%rbp),%ecx
add    -0xc48(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movslq -0xc58(%rbp),%rcx
lea    -0x840(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc5c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    135e <tiled_sgemm_tt+0x25e>
movslq -0xc58(%rbp),%rcx
lea    -0x840(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc5c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    1363 <tiled_sgemm_tt+0x263>
mov    -0xc5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc5c(%rbp)
jmp    1213 <tiled_sgemm_tt+0x113>
jmp    137c <tiled_sgemm_tt+0x27c>
mov    -0xc58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc58(%rbp)
jmp    11fc <tiled_sgemm_tt+0xfc>
movl   $0x0,-0xc60(%rbp)
cmpl   $0x10,-0xc60(%rbp)
jge    148b <tiled_sgemm_tt+0x38b>
movl   $0x0,-0xc64(%rbp)
cmpl   $0x10,-0xc64(%rbp)
jge    1472 <tiled_sgemm_tt+0x372>
movl   $0x0,-0xc68(%rbp)
cmpl   $0x10,-0xc68(%rbp)
jge    1459 <tiled_sgemm_tt+0x359>
movslq -0xc60(%rbp),%rcx
lea    -0x440(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc68(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movslq -0xc68(%rbp),%rcx
lea    -0x840(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc64(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
movslq -0xc60(%rbp),%rcx
lea    -0xc40(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc64(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0xc68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc68(%rbp)
jmp    13c8 <tiled_sgemm_tt+0x2c8>
jmp    145e <tiled_sgemm_tt+0x35e>
mov    -0xc64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc64(%rbp)
jmp    13b1 <tiled_sgemm_tt+0x2b1>
jmp    1477 <tiled_sgemm_tt+0x377>
mov    -0xc60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc60(%rbp)
jmp    139a <tiled_sgemm_tt+0x29a>
jmp    1490 <tiled_sgemm_tt+0x390>
mov    -0xc54(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0xc54(%rbp)
jmp    11e3 <tiled_sgemm_tt+0xe3>
movl   $0x0,-0xc6c(%rbp)
cmpl   $0x10,-0xc6c(%rbp)
jge    15ab <tiled_sgemm_tt+0x4ab>
movl   $0x0,-0xc70(%rbp)
cmpl   $0x10,-0xc70(%rbp)
jge    1592 <tiled_sgemm_tt+0x492>
mov    -0x30(%rbp),%eax
add    -0xc6c(%rbp),%eax
mov    %eax,-0xc44(%rbp)
mov    -0x34(%rbp),%eax
add    -0xc70(%rbp),%eax
mov    %eax,-0xc48(%rbp)
mov    -0xc44(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1579 <tiled_sgemm_tt+0x479>
mov    -0xc48(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1579 <tiled_sgemm_tt+0x479>
movss  -0x10(%rbp),%xmm0
movslq -0xc6c(%rbp),%rcx
lea    -0xc40(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
movslq -0xc70(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
movss  -0x2c(%rbp),%xmm1
mov    0x18(%rbp),%rax
mov    -0xc44(%rbp),%ecx
imul   0x20(%rbp),%ecx
add    -0xc48(%rbp),%ecx
movslq %ecx,%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    0x18(%rbp),%rax
mov    -0xc44(%rbp),%ecx
imul   0x20(%rbp),%ecx
add    -0xc48(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    157e <tiled_sgemm_tt+0x47e>
mov    -0xc70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc70(%rbp)
jmp    14c5 <tiled_sgemm_tt+0x3c5>
jmp    1597 <tiled_sgemm_tt+0x497>
mov    -0xc6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc6c(%rbp)
jmp    14ae <tiled_sgemm_tt+0x3ae>
jmp    15b0 <tiled_sgemm_tt+0x4b0>
mov    -0x34(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x34(%rbp)
jmp    114e <tiled_sgemm_tt+0x4e>
jmp    15c3 <tiled_sgemm_tt+0x4c3>
mov    -0x30(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x30(%rbp)
jmp    113b <tiled_sgemm_tt+0x3b>
add    $0xbf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<tiled_sgemm_tt>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xcd8,%rsp
mov    %r9,0x38(%rsp)
mov    %rcx,0x88(%rsp)
mov    %edx,0x4(%rsp)
mov    %esi,(%rsp)
test   %edi,%edi
jle    1627 <tiled_sgemm_tt+0x517>
mov    0xd18(%rsp),%rax
mov    %rax,0x28(%rsp)
movslq 0x4(%rsp),%r12
movslq (%rsp),%rax
mov    %rax,0x18(%rsp)
mov    %edi,%r14d
movslq 0xd10(%rsp),%rax
movslq 0xd20(%rsp),%rbx
mov    %rax,%rcx
shl    $0x6,%rcx
mov    %rcx,0x60(%rsp)
shl    $0x2,%rax
mov    %rax,0x80(%rsp)
mov    %r8d,%eax
mov    %rax,0x78(%rsp)
shl    $0x4,%r8d
mov    %r8,0x48(%rsp)
mov    %rbx,%rax
shl    $0x6,%rax
mov    %rax,0x40(%rsp)
shl    $0x2,%rbx
xor    %eax,%eax
mov    %rax,0x10(%rsp)
xor    %eax,%eax
mov    %rax,0x8(%rsp)
movss  %xmm1,0x24(%rsp)
movss  %xmm0,0x20(%rsp)
mov    %rbx,0x50(%rsp)
jmp    1203 <tiled_sgemm_tt+0xf3>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x8(%rsp),%rcx
add    $0x10,%rcx
mov    0x10(%rsp),%rax
add    0x48(%rsp),%rax
mov    %rax,0x10(%rsp)
mov    0x40(%rsp),%rax
add    %rax,0x28(%rsp)
mov    %rcx,%rax
mov    %rcx,0x8(%rsp)
cmp    %r14,%rcx
jae    1627 <tiled_sgemm_tt+0x517>
cmpl   $0x0,(%rsp)
jle    11d0 <tiled_sgemm_tt+0xc0>
mov    0x28(%rsp),%r8
mov    0x38(%rsp),%rax
mov    %rax,0x30(%rsp)
xor    %r13d,%r13d
jmp    1235 <tiled_sgemm_tt+0x125>
nopl   (%rax)
add    $0x10,%r13
addq   $0x40,0x30(%rsp)
add    $0x40,%r8
cmp    0x18(%rsp),%r13
jge    11d0 <tiled_sgemm_tt+0xc0>
mov    %r8,0x58(%rsp)
mov    $0x400,%edx
lea    0x8d0(%rsp),%rdi
xor    %esi,%esi
call   1030 <memset@plt>
cmpl   $0x0,0x4(%rsp)
jle    158c <tiled_sgemm_tt+0x47c>
mov    0x10(%rsp),%r9
mov    0x30(%rsp),%r15
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
mov    %r9,0x70(%rsp)
mov    %r15,0x68(%rsp)
lea    0x4d0(%rsp),%rdi
lea    0xd0(%rsp),%rcx
xor    %r10d,%r10d
jmp    12af <tiled_sgemm_tt+0x19f>
nop
add    $0x1,%r10
add    $0x40,%rcx
add    $0x40,%rdi
add    0x80(%rsp),%r15
add    0x78(%rsp),%r9
cmp    $0x10,%r10
je     1320 <tiled_sgemm_tt+0x210>
mov    0x8(%rsp),%rax
lea    (%r10,%rax,1),%rbp
lea    (%r10,%r11,1),%rbx
xor    %edx,%edx
jmp    12cf <tiled_sgemm_tt+0x1bf>
movss  %xmm0,(%rcx,%rdx,4)
add    $0x1,%rdx
cmp    $0x10,%rdx
je     1290 <tiled_sgemm_tt+0x180>
xorps  %xmm0,%xmm0
xorps  %xmm1,%xmm1
cmp    %r14,%rbp
jae    12f9 <tiled_sgemm_tt+0x1e9>
lea    (%r11,%rdx,1),%r8
xorps  %xmm1,%xmm1
cmp    %r12,%r8
jge    12f9 <tiled_sgemm_tt+0x1e9>
lea    (%r9,%rdx,1),%eax
cltq
mov    0x88(%rsp),%rsi
movss  (%rsi,%rax,4),%xmm1
movss  %xmm1,(%rdi,%rdx,4)
cmp    %r12,%rbx
jge    12c0 <tiled_sgemm_tt+0x1b0>
lea    (%rdx,%r13,1),%rax
cmp    0x18(%rsp),%rax
jge    12c0 <tiled_sgemm_tt+0x1b0>
movss  (%r15,%rdx,4),%xmm0
jmp    12c0 <tiled_sgemm_tt+0x1b0>
cs nopw 0x0(%rax,%rax,1)
lea    0x8d0(%rsp),%rsi
xor    %edi,%edi
mov    0x70(%rsp),%r9
mov    0x68(%rsp),%r15
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rdi,%rax
shl    $0x6,%rax
movss  0x4d0(%rsp,%rax,1),%xmm0
movss  0x4d4(%rsp,%rax,1),%xmm1
movss  0x4d8(%rsp,%rax,1),%xmm2
movss  0x4dc(%rsp,%rax,1),%xmm3
shufps $0x0,%xmm0,%xmm0
movaps %xmm0,0xc0(%rsp)
shufps $0x0,%xmm1,%xmm1
movaps %xmm1,0xb0(%rsp)
shufps $0x0,%xmm2,%xmm2
movaps %xmm2,0xa0(%rsp)
shufps $0x0,%xmm3,%xmm3
movaps %xmm3,0x90(%rsp)
movss  0x4e0(%rsp,%rax,1),%xmm12
shufps $0x0,%xmm12,%xmm12
movss  0x4e4(%rsp,%rax,1),%xmm13
shufps $0x0,%xmm13,%xmm13
movss  0x4e8(%rsp,%rax,1),%xmm14
shufps $0x0,%xmm14,%xmm14
movss  0x4ec(%rsp,%rax,1),%xmm15
shufps $0x0,%xmm15,%xmm15
movss  0x4f0(%rsp,%rax,1),%xmm10
shufps $0x0,%xmm10,%xmm10
movss  0x4f4(%rsp,%rax,1),%xmm11
shufps $0x0,%xmm11,%xmm11
movss  0x4f8(%rsp,%rax,1),%xmm2
shufps $0x0,%xmm2,%xmm2
movss  0x4fc(%rsp,%rax,1),%xmm3
shufps $0x0,%xmm3,%xmm3
movss  0x500(%rsp,%rax,1),%xmm4
shufps $0x0,%xmm4,%xmm4
movss  0x504(%rsp,%rax,1),%xmm5
shufps $0x0,%xmm5,%xmm5
movss  0x508(%rsp,%rax,1),%xmm6
shufps $0x0,%xmm6,%xmm6
movss  0x50c(%rsp,%rax,1),%xmm7
shufps $0x0,%xmm7,%xmm7
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movaps 0xd0(%rsp,%rax,4),%xmm8
mulps  0xc0(%rsp),%xmm8
addps  (%rsi,%rax,4),%xmm8
movaps 0x110(%rsp,%rax,4),%xmm9
mulps  0xb0(%rsp),%xmm9
addps  %xmm8,%xmm9
movaps 0x150(%rsp,%rax,4),%xmm0
mulps  0xa0(%rsp),%xmm0
addps  %xmm9,%xmm0
movaps 0x190(%rsp,%rax,4),%xmm1
mulps  0x90(%rsp),%xmm1
addps  %xmm0,%xmm1
movaps 0x1d0(%rsp,%rax,4),%xmm0
mulps  %xmm12,%xmm0
addps  %xmm1,%xmm0
movaps 0x210(%rsp,%rax,4),%xmm1
mulps  %xmm13,%xmm1
addps  %xmm0,%xmm1
movaps 0x250(%rsp,%rax,4),%xmm0
mulps  %xmm14,%xmm0
addps  %xmm1,%xmm0
movaps 0x290(%rsp,%rax,4),%xmm1
mulps  %xmm15,%xmm1
addps  %xmm0,%xmm1
movaps 0x2d0(%rsp,%rax,4),%xmm0
mulps  %xmm10,%xmm0
addps  %xmm1,%xmm0
movaps 0x310(%rsp,%rax,4),%xmm1
mulps  %xmm11,%xmm1
addps  %xmm0,%xmm1
movaps 0x350(%rsp,%rax,4),%xmm0
mulps  %xmm2,%xmm0
addps  %xmm1,%xmm0
movaps 0x390(%rsp,%rax,4),%xmm1
mulps  %xmm3,%xmm1
addps  %xmm0,%xmm1
movaps 0x3d0(%rsp,%rax,4),%xmm0
mulps  %xmm4,%xmm0
addps  %xmm1,%xmm0
movaps 0x410(%rsp,%rax,4),%xmm1
mulps  %xmm5,%xmm1
addps  %xmm0,%xmm1
movaps 0x450(%rsp,%rax,4),%xmm0
mulps  %xmm6,%xmm0
addps  %xmm1,%xmm0
movaps 0x490(%rsp,%rax,4),%xmm1
mulps  %xmm7,%xmm1
addps  %xmm0,%xmm1
movaps %xmm1,(%rsi,%rax,4)
add    $0x4,%rax
cmp    $0x10,%rax
jne    1450 <tiled_sgemm_tt+0x340>
add    $0x1,%rdi
add    $0x40,%rsi
cmp    $0x10,%rdi
jne    1340 <tiled_sgemm_tt+0x230>
add    $0x10,%r11
add    0x60(%rsp),%r15
add    $0x10,%r9
cmp    %r12,%r11
jl     1270 <tiled_sgemm_tt+0x160>
lea    0x8d0(%rsp),%rax
mov    0x58(%rsp),%r8
mov    %r8,%rcx
xor    %edx,%edx
movss  0x24(%rsp),%xmm1
movss  0x20(%rsp),%xmm0
mov    0x50(%rsp),%rbx
jmp    15d5 <tiled_sgemm_tt+0x4c5>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdx
add    %rbx,%rcx
add    $0x40,%rax
cmp    $0x10,%rdx
je     1220 <tiled_sgemm_tt+0x110>
mov    0x8(%rsp),%rsi
add    %rdx,%rsi
xor    %edi,%edi
jmp    15fa <tiled_sgemm_tt+0x4ea>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdi
cmp    $0x10,%rdi
je     15c0 <tiled_sgemm_tt+0x4b0>
cmp    %r14,%rsi
jae    15f0 <tiled_sgemm_tt+0x4e0>
lea    (%rdi,%r13,1),%rbp
cmp    0x18(%rsp),%rbp
jge    15f0 <tiled_sgemm_tt+0x4e0>
movss  (%rcx,%rdi,4),%xmm3
mulss  %xmm1,%xmm3
movss  (%rax,%rdi,4),%xmm2
mulss  %xmm0,%xmm2
addss  %xmm3,%xmm2
movss  %xmm2,(%rcx,%rdi,4)
jmp    15f0 <tiled_sgemm_tt+0x4e0>
add    $0xcd8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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