void dgemm(const int M, const int N, const int K, const double alpha,
           const double *A, const int lda, const double *B, const int ldb,
           const double beta, double *C, const int ldc) {
  int ib, jb, kb;
  int i, j, k;
  int ii, jj, kk;
  double a, b, c;
  for (kb = 0; kb < K; kb += 64) {
    for (ib = 0; ib < M; ib += 64) {
      for (jb = 0; jb < N; jb += 64) {
        int Kb = (((64) < (K - kb)) ? (64) : (K - kb));
        int Nb = (((64) < (N - jb)) ? (64) : (N - jb));
        int Mb = (((64) < (M - ib)) ? (64) : (M - ib));
        double *pA = A + kb * lda + ib;
        double *pB = B + jb * ldb + kb;
        double *pC = C + jb * ldc + ib;
        for (i = 0; i < Mb; i = i + 1)
          for (j = 0; j < Nb; j = j + 1) {
            double cij = 0.;
            for (k = 0; k < Kb; ++k)
              cij += pA[i + k * lda] * pB[k + j * ldb];
            pC[j * ldc + i] += cij;
          }
      }
    }
  }
}


x86 assembly (clang, -O0):
<dgemm>:
push   %rbp
mov    %rsp,%rbp
sub    $0x38,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm1,-0x38(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    13ad <dgemm+0x2ad>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    139a <dgemm+0x29a>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1387 <dgemm+0x287>
mov    -0xc(%rbp),%ecx
sub    -0x44(%rbp),%ecx
mov    $0x40,%eax
cmp    %ecx,%eax
jge    118d <dgemm+0x8d>
mov    $0x40,%eax
mov    %eax,-0xac(%rbp)
jmp    1199 <dgemm+0x99>
mov    -0xc(%rbp),%eax
sub    -0x44(%rbp),%eax
mov    %eax,-0xac(%rbp)
mov    -0xac(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x8(%rbp),%ecx
sub    -0x40(%rbp),%ecx
mov    $0x40,%eax
cmp    %ecx,%eax
jge    11c5 <dgemm+0xc5>
mov    $0x40,%eax
mov    %eax,-0xb0(%rbp)
jmp    11d1 <dgemm+0xd1>
mov    -0x8(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0xb0(%rbp)
mov    -0xb0(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x4(%rbp),%ecx
sub    -0x3c(%rbp),%ecx
mov    $0x40,%eax
cmp    %ecx,%eax
jge    11fd <dgemm+0xfd>
mov    $0x40,%eax
mov    %eax,-0xb4(%rbp)
jmp    1209 <dgemm+0x109>
mov    -0x4(%rbp),%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0xb4(%rbp)
mov    -0xb4(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x44(%rbp),%ecx
imul   -0x24(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x3c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x90(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x40(%rbp),%ecx
imul   0x10(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x44(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x98(%rbp)
mov    0x18(%rbp),%rax
mov    -0x40(%rbp),%ecx
imul   0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x3c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0xa0(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x84(%rbp),%eax
jge    1374 <dgemm+0x274>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x80(%rbp),%eax
jge    1361 <dgemm+0x261>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x7c(%rbp),%eax
jge    132d <dgemm+0x22d>
mov    -0x90(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    -0x50(%rbp),%edx
imul   -0x24(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x98(%rbp),%rax
mov    -0x50(%rbp),%ecx
mov    -0x4c(%rbp),%edx
imul   0x10(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    12c5 <dgemm+0x1c5>
movsd  -0xa8(%rbp),%xmm0
ff
mov    -0xa0(%rbp),%rax
mov    -0x4c(%rbp),%ecx
imul   0x20(%rbp),%ecx
add    -0x48(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12a7 <dgemm+0x1a7>
jmp    1366 <dgemm+0x266>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1291 <dgemm+0x191>
jmp    1379 <dgemm+0x279>
mov    -0x40(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x40(%rbp)
jmp    115e <dgemm+0x5e>
jmp    138c <dgemm+0x28c>
mov    -0x3c(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x3c(%rbp)
jmp    114b <dgemm+0x4b>
jmp    139f <dgemm+0x29f>
mov    -0x44(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x44(%rbp)
jmp    1138 <dgemm+0x38>
add    $0x38,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dgemm>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x80,%rsp
mov    %r9,-0x48(%rsp)
mov    %rcx,-0x50(%rsp)
mov    %esi,-0x7c(%rsp)
mov    %edi,-0x80(%rsp)
test   %edx,%edx
jle    14ed <dgemm+0x3ed>
movslq %r8d,%rbx
movslq 0xb8(%rsp),%rsi
movslq 0xc8(%rsp),%rax
mov    %rax,(%rsp)
movslq -0x7c(%rsp),%rax
mov    %rax,-0x18(%rsp)
movslq -0x80(%rsp),%rax
mov    %rax,0x28(%rsp)
mov    %edx,%r12d
mov    -0x50(%rsp),%r8
lea    (%r8,%rbx,8),%rax
mov    %rax,-0x38(%rsp)
mov    %rbx,%rax
shl    $0x9,%rax
mov    %rax,0x8(%rsp)
mov    %rbx,-0x10(%rsp)
shl    $0x4,%rbx
mov    -0x48(%rsp),%rax
add    $0x8,%rax
mov    %rax,-0x30(%rsp)
mov    %rsi,%rax
shl    $0x9,%rax
mov    %rax,0x40(%rsp)
mov    %rsi,-0x8(%rsp)
lea    0x0(,%rsi,8),%rcx
xor    %edi,%edi
movabs $0x200000000,%r9
mov    %r12,%rax
mov    %r8,-0x40(%rsp)
xor    %ebp,%ebp
mov    %rcx,0x58(%rsp)
jmp    11f7 <dgemm+0xf7>
add    $0x40,%rbp
mov    0x18(%rsp),%rdi
add    $0x1,%rdi
mov    0x8(%rsp),%rax
add    %rax,-0x38(%rsp)
addq   $0x200,-0x30(%rsp)
add    %rax,-0x40(%rsp)
mov    0x10(%rsp),%rax
add    $0xffffffffffffffc0,%rax
cmp    %r12,%rbp
jae    14ed <dgemm+0x3ed>
cmp    $0x40,%rax
mov    $0x40,%esi
mov    %rax,0x10(%rsp)
cmovl  %rax,%rsi
movslq %esi,%r15
cmp    $0x2,%r15
mov    $0x1,%r8d
cmovl  %r8,%r15
mov    %rdi,0x18(%rsp)
mov    %rdi,%rsi
shl    $0x6,%rsi
mov    %r12,%r10
sub    %rsi,%r10
cmp    $0x40,%r10
mov    $0x40,%eax
cmovge %rax,%r10
movslq %r10d,%r14
cmp    $0x2,%r14
cmovl  %r8,%r14
cmpl   $0x0,-0x80(%rsp)
jle    11c0 <dgemm+0xc0>
movabs $0x7ffffffffffffffe,%rax
ff ff 7f
and    %rax,%r15
shl    $0x20,%r10
mov    %rbp,%rsi
imul   -0x10(%rsp),%rsi
mov    -0x50(%rsp),%rax
lea    (%rax,%rsi,8),%rax
mov    %rax,0x20(%rsp)
mov    -0x48(%rsp),%rax
lea    (%rax,%rbp,8),%rax
mov    %rax,0x30(%rsp)
mov    -0x40(%rsp),%rax
mov    %rax,-0x20(%rsp)
mov    -0x38(%rsp),%rax
mov    %rax,-0x28(%rsp)
xor    %eax,%eax
mov    %rax,-0x70(%rsp)
mov    %r14,0x60(%rsp)
jmp    12de <dgemm+0x1de>
nopw   0x0(%rax,%rax,1)
mov    -0x70(%rsp),%rsi
add    $0x40,%rsi
addq   $0x200,-0x28(%rsp)
addq   $0x200,-0x20(%rsp)
mov    %rsi,%rax
mov    %rsi,-0x70(%rsp)
cmp    0x28(%rsp),%rsi
jge    11c0 <dgemm+0xc0>
cmpl   $0x0,-0x7c(%rsp)
jle    12b0 <dgemm+0x1b0>
mov    -0x80(%rsp),%eax
mov    -0x70(%rsp),%rdi
sub    %edi,%eax
cmp    $0x40,%eax
mov    $0x40,%esi
mov    %eax,-0x54(%rsp)
cmovl  %eax,%esi
mov    0x20(%rsp),%rax
lea    (%rax,%rdi,8),%rax
mov    %rax,0x68(%rsp)
movslq %esi,%rax
mov    %rax,0x48(%rsp)
mov    0xc0(%rsp),%rax
lea    (%rax,%rdi,8),%rax
mov    %rax,0x38(%rsp)
mov    -0x30(%rsp),%rax
mov    %rax,-0x60(%rsp)
xor    %eax,%eax
mov    %rax,-0x68(%rsp)
jmp    136b <dgemm+0x26b>
nopl   0x0(%rax)
mov    -0x68(%rsp),%rsi
add    $0x40,%rsi
mov    -0x60(%rsp),%rax
add    0x40(%rsp),%rax
mov    %rax,-0x60(%rsp)
mov    %rsi,%rax
mov    %rsi,-0x68(%rsp)
cmp    -0x18(%rsp),%rsi
jge    12b0 <dgemm+0x1b0>
cmpl   $0x0,-0x54(%rsp)
jle    1340 <dgemm+0x240>
mov    -0x18(%rsp),%r8
mov    -0x68(%rsp),%rdi
sub    %rdi,%r8
mov    %rdi,%rsi
imul   -0x8(%rsp),%rsi
imul   (%rsp),%rdi
mov    0x30(%rsp),%rax
lea    (%rax,%rsi,8),%rax
mov    %rax,0x70(%rsp)
mov    0x38(%rsp),%rax
lea    (%rax,%rdi,8),%rdx
cmp    $0x40,%r8
mov    $0x40,%esi
mov    %r8,0x50(%rsp)
cmovl  %r8,%rsi
movslq %esi,%rax
mov    %rax,0x78(%rsp)
mov    -0x20(%rsp),%r8
mov    -0x28(%rsp),%r11
xor    %eax,%eax
mov    %rax,-0x78(%rsp)
jmp    1404 <dgemm+0x304>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    -0x78(%rsp),%rsi
add    $0x1,%rsi
add    $0x8,%r11
add    $0x8,%r8
mov    %rsi,%rax
mov    %rsi,-0x78(%rsp)
cmp    0x48(%rsp),%rsi
jge    1340 <dgemm+0x240>
cmpq   $0x0,0x50(%rsp)
jle    13e0 <dgemm+0x2e0>
mov    -0x60(%rsp),%rsi
xor    %r13d,%r13d
jmp    1445 <dgemm+0x345>
cs nopw 0x0(%rax,%rax,1)
mov    %r13,%rax
imul   (%rsp),%rax
add    -0x78(%rsp),%rax
addsd  (%rdx,%rax,8),%xmm0
movsd  %xmm0,(%rdx,%rax,8)
add    $0x1,%r13
add    %rcx,%rsi
cmp    0x78(%rsp),%r13
jge    13e0 <dgemm+0x2e0>
xorpd  %xmm0,%xmm0
cmp    %r12,%rbp
jae    1420 <dgemm+0x320>
xorpd  %xmm0,%xmm0
cmp    %r9,%r10
jge    1460 <dgemm+0x360>
xor    %eax,%eax
jmp    149b <dgemm+0x39b>
nopl   0x0(%rax,%rax,1)
xor    %edi,%edi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%r8,%rdi,1),%xmm1
mulsd  -0x8(%rsi,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movsd  (%r11,%rdi,1),%xmm0
mulsd  (%rsi,%rax,8),%xmm0
addsd  %xmm1,%xmm0
add    $0x2,%rax
add    %rbx,%rdi
cmp    %rax,%r15
jne    1470 <dgemm+0x370>
test   $0x1,%r14b
je     1420 <dgemm+0x320>
mov    %r13,%rdi
imul   -0x8(%rsp),%rdi
mov    %rbp,%rcx
mov    %rax,%rbp
imul   -0x10(%rsp),%rbp
add    -0x78(%rsp),%rbp
mov    0x68(%rsp),%r14
movsd  (%r14,%rbp,8),%xmm1
mov    %rcx,%rbp
mov    0x60(%rsp),%r14
mov    0x58(%rsp),%rcx
add    %rax,%rdi
mov    0x70(%rsp),%rax
mulsd  (%rax,%rdi,8),%xmm1
addsd  %xmm1,%xmm0
jmp    1420 <dgemm+0x320>
add    $0x80,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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