void matmult_vp_notrans(double *C, const double *A, const double *B,
                        double alpha, int M, int N, int P, int S, int L, int R,
                        int E, int vlen) {
  int j, k, vpS, vpL;
  const double *Bc, *Br, *Ac, *AvpS;
  double *Cc;
  register const double *Ar;
  register int i;
  register double *Cr;
  register double coeff;
  if (vlen == 0) {
    vlen = 30;
  }
  vpS = 0;
  vpL = vlen < P ? vlen : P;
  while (vpS < P) {
    Cc = &C[S * M + R];
    Bc = &B[S * P + vpS];
    AvpS = &A[vpS * M + R];
    for (j = S; j < L; j++) {
      Ac = AvpS;
      Br = Bc;
      for (k = vpS; k < vpL; k++) {
        Cr = Cc;
        Ar = Ac;
        if (*Br != 0.0) {
          coeff = (*Br) * alpha;
          for (i = R; i < E; i++) {
            *Cr += (*Ar) * coeff;
            Cr++;
            Ar++;
          }
        }
        Br++;
        Ac += M;
      }
      Cc += M;
      Bc += P;
    }
    vpS = vpL;
    vpL += vlen;
    if (vpL > P) {
      vpL = P;
    }
  }
}


x86 assembly (clang, -O0):
<matmult_vp_notrans>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
cmpl   $0x0,0x30(%rbp)
jne    1144 <matmult_vp_notrans+0x44>
movl   $0x1e,0x30(%rbp)
movl   $0x0,-0x38(%rbp)
mov    0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1165 <matmult_vp_notrans+0x65>
mov    0x30(%rbp),%eax
mov    %eax,-0x8c(%rbp)
jmp    116e <matmult_vp_notrans+0x6e>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    133e <matmult_vp_notrans+0x23e>
mov    -0x8(%rbp),%rax
mov    0x10(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x18(%rbp),%rax
mov    0x10(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x24(%rbp),%ecx
add    0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    0x10(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1318 <matmult_vp_notrans+0x218>
mov    -0x60(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    12e0 <matmult_vp_notrans+0x1e0>
mov    -0x68(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123b <matmult_vp_notrans+0x13b>
jp     123b <matmult_vp_notrans+0x13b>
jmp    12b1 <matmult_vp_notrans+0x1b1>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    0x20(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
cmp    0x28(%rbp),%eax
jge    12ac <matmult_vp_notrans+0x1ac>
mov    -0x70(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
mov    -0x80(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x80(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x80(%rbp)
mov    -0x70(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x70(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1256 <matmult_vp_notrans+0x156>
jmp    12b1 <matmult_vp_notrans+0x1b1>
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x58(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11ff <matmult_vp_notrans+0xff>
mov    -0x24(%rbp),%ecx
mov    -0x68(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11dd <matmult_vp_notrans+0xdd>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    0x30(%rbp),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    1339 <matmult_vp_notrans+0x239>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    1177 <matmult_vp_notrans+0x77>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<matmult_vp_notrans>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x40,%rsp
mov    %ecx,-0x80(%rsp)
mov    %rdx,-0x18(%rsp)
mov    %rsi,-0x38(%rsp)
mov    %rdi,-0x50(%rsp)
mov    0x98(%rsp),%eax
test   %eax,%eax
mov    $0x1e,%ecx
cmovne %eax,%ecx
mov    %rcx,-0x58(%rsp)
mov    %r9d,-0x7c(%rsp)
test   %r9d,%r9d
jle    1570 <matmult_vp_notrans+0x470>
mov    0x90(%rsp),%r15d
mov    0x88(%rsp),%ecx
mov    0x78(%rsp),%ebx
mov    -0x7c(%rsp),%esi
mov    -0x58(%rsp),%rdx
cmp    %esi,%edx
mov    %esi,%eax
cmovl  %edx,%eax
mov    %ebx,%edx
mov    -0x80(%rsp),%edi
imul   %edi,%edx
add    %ecx,%edx
movslq %edx,%rdx
mov    -0x50(%rsp),%rbp
lea    0x0(%rbp,%rdx,8),%rbp
mov    %rbp,-0x20(%rsp)
mov    %ebx,%ebp
imul   %esi,%ebp
mov    %rbp,-0x28(%rsp)
movslq %edi,%rdi
mov    %ecx,%ebp
not    %ebp
add    %r15d,%ebp
add    %rbp,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rsp)
mov    %rbp,0x38(%rsp)
lea    0x1(%rbp),%rdx
mov    %rdx,-0x48(%rsp)
and    $0xfffffffffffffffc,%rdx
lea    -0x4(%rdx),%rbp
mov    %rbp,0x20(%rsp)
mov    %rbp,%rbx
shr    $0x2,%rbx
add    $0x1,%rbx
mov    %rbx,%rbp
mov    %rbx,0x18(%rsp)
and    $0xfffffffffffffffe,%rbx
mov    %rbx,(%rsp)
xorpd  %xmm8,%xmm8
mov    %esi,%esi
mov    %rsi,0x8(%rsp)
mov    %rdx,%rsi
mov    %rdx,-0x70(%rsp)
add    %ecx,%edx
mov    %edx,-0x60(%rsp)
mov    %rdi,-0x30(%rsp)
lea    0x0(,%rdi,8),%r9
xor    %edx,%edx
mov    %rdx,-0x78(%rsp)
jmp    122f <matmult_vp_notrans+0x12f>
nopl   0x0(%rax,%rax,1)
mov    -0x58(%rsp),%rax
add    %edi,%eax
mov    -0x7c(%rsp),%edx
cmp    %edx,%eax
cmovg  %edx,%eax
mov    %edi,%esi
mov    %rsi,-0x78(%rsp)
cmp    %edx,%edi
jge    1570 <matmult_vp_notrans+0x470>
mov    %eax,%edi
mov    0x78(%rsp),%eax
cmp    0x80(%rsp),%eax
jge    1210 <matmult_vp_notrans+0x110>
mov    -0x78(%rsp),%rdx
mov    %edx,%eax
imul   -0x80(%rsp),%eax
add    %ecx,%eax
movslq %eax,%rsi
mov    -0x38(%rsp),%rax
lea    (%rax,%rsi,8),%rax
mov    %rax,-0x8(%rsp)
mov    -0x28(%rsp),%rax
add    %edx,%eax
cltq
mov    -0x18(%rsp),%rdx
lea    (%rdx,%rax,8),%rax
mov    %rax,-0x68(%rsp)
add    -0x48(%rsp),%rsi
mov    %rsi,0x30(%rsp)
mov    -0x20(%rsp),%r13
xor    %eax,%eax
mov    %rax,-0x40(%rsp)
mov    0x78(%rsp),%eax
jmp    12c0 <matmult_vp_notrans+0x1c0>
add    %r9,%r13
mov    0x8(%rsp),%rax
mov    -0x68(%rsp),%rdx
lea    (%rdx,%rax,8),%rdx
mov    %rdx,-0x68(%rsp)
mov    -0x5c(%rsp),%eax
add    $0x1,%eax
addq   $0x1,-0x40(%rsp)
cmp    0x80(%rsp),%eax
je     1210 <matmult_vp_notrans+0x110>
mov    %eax,-0x5c(%rsp)
cmp    %edi,-0x78(%rsp)
jge    1290 <matmult_vp_notrans+0x190>
mov    -0x40(%rsp),%rax
imul   -0x30(%rsp),%rax
add    -0x10(%rsp),%rax
mov    -0x50(%rsp),%rdx
lea    (%rdx,%rax,8),%rax
mov    %rax,0x28(%rsp)
mov    -0x70(%rsp),%rax
lea    0x0(,%rax,8),%rax
add    %r13,%rax
mov    %rax,0x10(%rsp)
mov    -0x8(%rsp),%rdx
xor    %r14d,%r14d
mov    -0x68(%rsp),%r12
mov    -0x78(%rsp),%rax
mov    %eax,%ebx
jmp    1336 <matmult_vp_notrans+0x236>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x8,%r12
add    %r9,%rdx
add    $0x1,%ebx
add    $0x1,%r14
cmp    %edi,%ebx
je     1290 <matmult_vp_notrans+0x190>
movsd  (%r12),%xmm2
ucomisd %xmm8,%xmm2
jne    1345 <matmult_vp_notrans+0x245>
jnp    1320 <matmult_vp_notrans+0x220>
cmp    %r15d,%ecx
jge    1320 <matmult_vp_notrans+0x220>
mulsd  %xmm0,%xmm2
mov    %r13,%r8
mov    %ecx,%esi
mov    %rdx,%r11
cmpl   $0x3,0x38(%rsp)
jb     1490 <matmult_vp_notrans+0x390>
mov    %r14,%rax
imul   -0x30(%rsp),%rax
add    0x30(%rsp),%rax
mov    -0x38(%rsp),%rsi
lea    (%rsi,%rax,8),%rax
cmp    %rax,%r13
jae    1390 <matmult_vp_notrans+0x290>
mov    %r13,%r8
mov    %ecx,%esi
mov    %rdx,%r11
cmp    0x28(%rsp),%rdx
jb     1490 <matmult_vp_notrans+0x390>
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
cmpq   $0x0,0x20(%rsp)
je     155e <matmult_vp_notrans+0x45e>
mov    (%rsp),%rsi
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
movupd (%rdx,%rbp,8),%xmm4
movupd 0x10(%rdx,%rbp,8),%xmm5
mulpd  %xmm3,%xmm4
movupd 0x0(%r13,%rbp,8),%xmm6
addpd  %xmm4,%xmm6
movupd 0x10(%r13,%rbp,8),%xmm4
movupd 0x20(%r13,%rbp,8),%xmm7
movupd 0x30(%r13,%rbp,8),%xmm1
mulpd  %xmm3,%xmm5
addpd  %xmm4,%xmm5
movupd %xmm6,0x0(%r13,%rbp,8)
movupd %xmm5,0x10(%r13,%rbp,8)
movupd 0x20(%rdx,%rbp,8),%xmm4
movupd 0x30(%rdx,%rbp,8),%xmm5
mulpd  %xmm3,%xmm4
addpd  %xmm7,%xmm4
mulpd  %xmm3,%xmm5
addpd  %xmm1,%xmm5
movupd %xmm4,0x20(%r13,%rbp,8)
movupd %xmm5,0x30(%r13,%rbp,8)
add    $0x8,%rbp
add    $0xfffffffffffffffe,%rsi
jne    13b0 <matmult_vp_notrans+0x2b0>
testb  $0x1,0x18(%rsp)
je     1467 <matmult_vp_notrans+0x367>
movupd (%rdx,%rbp,8),%xmm1
movupd 0x10(%rdx,%rbp,8),%xmm4
movupd 0x0(%r13,%rbp,8),%xmm5
movupd 0x10(%r13,%rbp,8),%xmm6
mulpd  %xmm3,%xmm1
addpd  %xmm5,%xmm1
mulpd  %xmm3,%xmm4
addpd  %xmm6,%xmm4
movupd %xmm1,0x0(%r13,%rbp,8)
movupd %xmm4,0x10(%r13,%rbp,8)
mov    -0x70(%rsp),%rax
cmp    %rax,-0x48(%rsp)
je     1320 <matmult_vp_notrans+0x220>
mov    -0x70(%rsp),%rax
lea    (%rdx,%rax,8),%r11
mov    0x10(%rsp),%r8
mov    -0x60(%rsp),%esi
nopl   0x0(%rax)
mov    %r15d,%eax
sub    %esi,%eax
mov    %esi,%ebp
not    %ebp
add    %r15d,%ebp
and    $0x3,%eax
je     14d7 <matmult_vp_notrans+0x3d7>
neg    %eax
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
movsd  (%r11),%xmm1
mulsd  %xmm2,%xmm1
addsd  (%r8),%xmm1
movsd  %xmm1,(%r8)
add    $0x8,%r8
add    $0x8,%r11
add    $0xffffffff,%r10d
cmp    %r10d,%eax
jne    14b0 <matmult_vp_notrans+0x3b0>
sub    %r10d,%esi
cmp    $0x3,%ebp
jb     1320 <matmult_vp_notrans+0x220>
mov    %r15d,%ebp
sub    %esi,%ebp
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%r11,%rax,8),%xmm1
mulsd  %xmm2,%xmm1
addsd  (%r8,%rax,8),%xmm1
movsd  %xmm1,(%r8,%rax,8)
movsd  0x8(%r11,%rax,8),%xmm1
mulsd  %xmm2,%xmm1
addsd  0x8(%r8,%rax,8),%xmm1
movsd  %xmm1,0x8(%r8,%rax,8)
movsd  0x10(%r11,%rax,8),%xmm1
mulsd  %xmm2,%xmm1
addsd  0x10(%r8,%rax,8),%xmm1
movsd  %xmm1,0x10(%r8,%rax,8)
movsd  0x18(%r11,%rax,8),%xmm1
mulsd  %xmm2,%xmm1
addsd  0x18(%r8,%rax,8),%xmm1
movsd  %xmm1,0x18(%r8,%rax,8)
add    $0x4,%rax
cmp    %eax,%ebp
jne    14f0 <matmult_vp_notrans+0x3f0>
jmp    1320 <matmult_vp_notrans+0x220>
xor    %ebp,%ebp
testb  $0x1,0x18(%rsp)
jne    1430 <matmult_vp_notrans+0x330>
jmp    1467 <matmult_vp_notrans+0x367>
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @matmult_vp_notrans(double* %0, double* %1, double* %2, double %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11) {
%13 = alloca double*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca double*
%30 = alloca double*
%31 = alloca double*
%32 = alloca double*
%33 = alloca double*
%34 = alloca double*
%35 = alloca i32
%36 = alloca double*
%37 = alloca double
store double* %0, double** %13
store double* %1, double** %14
store double* %2, double** %15
store double %3, double* %16
store i32 %4, i32* %17
store i32 %5, i32* %18
store i32 %6, i32* %19
store i32 %7, i32* %20
store i32 %8, i32* %21
store i32 %9, i32* %22
store i32 %10, i32* %23
store i32 %11, i32* %24
%38 = load i32, i32* %24
%39 = icmp eq i32 %38, 0
br i1 %39, label %40, label %41
40: ; preds = %12
store i32 30, i32* %24
br label %41
41: ; preds = %40, %12
store i32 0, i32* %27
%42 = load i32, i32* %24
%43 = load i32, i32* %19
%44 = icmp slt i32 %42, %43
br i1 %44, label %45, label %47
45: ; preds = %41
%46 = load i32, i32* %24
br label %49
47: ; preds = %41
%48 = load i32, i32* %19
br label %49
49: ; preds = %47, %45
%50 = phi i32 [ %46, %45 ], [ %48, %47 ]
store i32 %50, i32* %28
br label %51
51: ; preds = %156, %49
%52 = load i32, i32* %27
%53 = load i32, i32* %19
%54 = icmp slt i32 %52, %53
br i1 %54, label %55, label %157
55: ; preds = %51
%56 = load double*, double** %13
%57 = load i32, i32* %20
%58 = load i32, i32* %17
%59 = mul nsw i32 %57, %58
%60 = load i32, i32* %22
%61 = add nsw i32 %59, %60
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds double, double* %56, i64 %62
store double* %63, double** %33
%64 = load double*, double** %15
%65 = load i32, i32* %20
%66 = load i32, i32* %19
%67 = mul nsw i32 %65, %66
%68 = load i32, i32* %27
%69 = add nsw i32 %67, %68
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds double, double* %64, i64 %70
store double* %71, double** %29
%72 = load double*, double** %14
%73 = load i32, i32* %27
%74 = load i32, i32* %17
%75 = mul nsw i32 %73, %74
%76 = load i32, i32* %22
%77 = add nsw i32 %75, %76
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds double, double* %72, i64 %78
store double* %79, double** %32
%80 = load i32, i32* %20
store i32 %80, i32* %25
br label %81
81: ; preds = %143, %55
%82 = load i32, i32* %25
%83 = load i32, i32* %21
%84 = icmp slt i32 %82, %83
br i1 %84, label %85, label %146
85: ; preds = %81
%86 = load double*, double** %32
store double* %86, double** %31
%87 = load double*, double** %29
store double* %87, double** %30
%88 = load i32, i32* %27
store i32 %88, i32* %26
br label %89
89: ; preds = %131, %85
%90 = load i32, i32* %26
%91 = load i32, i32* %28
%92 = icmp slt i32 %90, %91
br i1 %92, label %93, label %134
93: ; preds = %89
%94 = load double*, double** %33
store double* %94, double** %36
%95 = load double*, double** %31
store double* %95, double** %34
%96 = load double*, double** %30
%97 = load double, double* %96
%98 = fcmp une double %97, 0.000000e+00
br i1 %98, label %99, label %124
99: ; preds = %93
%100 = load double*, double** %30
%101 = load double, double* %100
%102 = load double, double* %16
%103 = fmul double %101, %102
store double %103, double* %37
%104 = load i32, i32* %22
store i32 %104, i32* %35
br label %105
105: ; preds = %120, %99
%106 = load i32, i32* %35
%107 = load i32, i32* %23
%108 = icmp slt i32 %106, %107
br i1 %108, label %109, label %123
109: ; preds = %105
%110 = load double*, double** %34
%111 = load double, double* %110
%112 = load double, double* %37
%113 = load double*, double** %36
%114 = load double, double* %113
%115 = call double @llvm.fmuladd.f64(double %111, double %112, double %114)
store double %115, double* %113
%116 = load double*, double** %36
%117 = getelementptr inbounds double, double* %116, i32 1
store double* %117, double** %36
%118 = load double*, double** %34
%119 = getelementptr inbounds double, double* %118, i32 1
store double* %119, double** %34
br label %120
120: ; preds = %109
%121 = load i32, i32* %35
%122 = add nsw i32 %121, 1
store i32 %122, i32* %35
br label %105
123: ; preds = %105
br label %124
124: ; preds = %123, %93
%125 = load double*, double** %30
%126 = getelementptr inbounds double, double* %125, i32 1
store double* %126, double** %30
%127 = load i32, i32* %17
%128 = load double*, double** %31
%129 = sext i32 %127 to i64
%130 = getelementptr inbounds double, double* %128, i64 %129
store double* %130, double** %31
br label %131
131: ; preds = %124
%132 = load i32, i32* %26
%133 = add nsw i32 %132, 1
store i32 %133, i32* %26
br label %89
134: ; preds = %89
%135 = load i32, i32* %17
%136 = load double*, double** %33
%137 = sext i32 %135 to i64
%138 = getelementptr inbounds double, double* %136, i64 %137
store double* %138, double** %33
%139 = load i32, i32* %19
%140 = load double*, double** %29
%141 = sext i32 %139 to i64
%142 = getelementptr inbounds double, double* %140, i64 %141
store double* %142, double** %29
br label %143
143: ; preds = %134
%144 = load i32, i32* %25
%145 = add nsw i32 %144, 1
store i32 %145, i32* %25
br label %81
146: ; preds = %81
%147 = load i32, i32* %28
store i32 %147, i32* %27
%148 = load i32, i32* %24
%149 = load i32, i32* %28
%150 = add nsw i32 %149, %148
store i32 %150, i32* %28
%151 = load i32, i32* %28
%152 = load i32, i32* %19
%153 = icmp sgt i32 %151, %152
br i1 %153, label %154, label %156
154: ; preds = %146
%155 = load i32, i32* %19
store i32 %155, i32* %28
br label %156
156: ; preds = %154, %146
br label %51
157: ; preds = %51
ret void
}

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