void mult_block(double **a, double **b, double **c, int ni, int nj, int nk) {
  int ii, jj, kk;
  double t00, t10, t20, t30;
  double *a0, *a1, *a2, *a3;
  double *c0, *c1, *c2, *c3;
  for (ii = 0; ii < ni; ii += 4) {
    a0 = a[ii];
    a1 = a[ii + 1];
    a2 = a[ii + 2];
    a3 = a[ii + 3];
    c0 = c[ii];
    c1 = c[ii + 1];
    c2 = c[ii + 2];
    c3 = c[ii + 3];
    for (jj = 0; jj < nj; jj++) {
      double *bt = b[jj];
      t00 = c0[jj];
      t10 = c1[jj];
      t20 = c2[jj];
      t30 = c3[jj];
      for (kk = 0; kk < nk; kk += 2) {
        register double b0 = bt[kk], b1 = bt[kk + 1];
        t00 += a0[kk] * b0 + a0[kk + 1] * b1;
        t10 += a1[kk] * b0 + a1[kk + 1] * b1;
        t20 += a2[kk] * b0 + a2[kk + 1] * b1;
        t30 += a3[kk] * b0 + a3[kk + 1] * b1;
      }
      c0[jj] = t00;
      c1[jj] = t10;
      c2[jj] = t20;
      c3[jj] = t30;
    }
  }
}


x86 assembly (clang, -O0):
<mult_block>:
push   %rbp
mov    %rsp,%rbp
sub    $0x28,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1413 <mult_block+0x313>
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x68(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x70(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x78(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x80(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x88(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x90(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1400 <mult_block+0x300>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x98(%rbp)
mov    -0x78(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x80(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x88(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x90(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    13a4 <mult_block+0x2a4>
mov    -0x98(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x98(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x58(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x60(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    -0x60(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x68(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    -0x68(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x70(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    -0x70(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x30(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x30(%rbp)
jmp    1251 <mult_block+0x151>
movsd  -0x38(%rbp),%xmm0
mov    -0x78(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x40(%rbp),%xmm0
mov    -0x80(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
mov    -0x88(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x50(%rbp),%xmm0
mov    -0x90(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11dd <mult_block+0xdd>
jmp    1405 <mult_block+0x305>
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    1126 <mult_block+0x26>
add    $0x28,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mult_block>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8d,-0x24(%rsp)
mov    %rdx,-0x10(%rsp)
mov    %rdi,-0x18(%rsp)
test   %ecx,%ecx
jle    127f <mult_block+0x17f>
movslq %r9d,%r15
mov    %ecx,%eax
mov    %rax,-0x8(%rsp)
mov    -0x24(%rsp),%r14d
xor    %eax,%eax
mov    %rax,-0x20(%rsp)
jmp    115c <mult_block+0x5c>
nopl   0x0(%rax)
mov    -0x20(%rsp),%rcx
add    $0x4,%rcx
mov    %rcx,%rax
mov    %rcx,-0x20(%rsp)
cmp    -0x8(%rsp),%rcx
jae    127f <mult_block+0x17f>
cmpl   $0x0,-0x24(%rsp)
jle    1140 <mult_block+0x40>
mov    -0x20(%rsp),%r10
lea    0x0(,%r10,8),%rdx
mov    %rdx,%rbp
or     $0x8,%rbp
mov    %rdx,%r8
or     $0x10,%r8
or     $0x18,%rdx
mov    -0x18(%rsp),%rdi
mov    (%rdi,%r10,8),%r12
mov    (%rdi,%rbp,1),%rcx
mov    (%rdi,%r8,1),%rax
mov    (%rdi,%rdx,1),%rbx
mov    -0x10(%rsp),%rdi
mov    (%rdi,%r10,8),%r13
mov    (%rdi,%rbp,1),%rbp
mov    (%rdi,%r8,1),%r10
mov    (%rdi,%rdx,1),%r8
xor    %r11d,%r11d
jmp    11e7 <mult_block+0xe7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movhpd %xmm0,0x0(%r13,%r11,8)
movlpd %xmm0,0x0(%rbp,%r11,8)
movhpd %xmm1,(%r10,%r11,8)
movlpd %xmm1,(%r8,%r11,8)
add    $0x1,%r11
cmp    %r14,%r11
je     1140 <mult_block+0x40>
movsd  0x0(%rbp,%r11,8),%xmm0
movhpd 0x0(%r13,%r11,8),%xmm0
movsd  (%r8,%r11,8),%xmm1
movhpd (%r10,%r11,8),%xmm1
test   %r9d,%r9d
jle    11c0 <mult_block+0xc0>
mov    (%rsi,%r11,8),%rdx
xor    %edi,%edi
nopl   0x0(%rax)
movsd  (%rdx,%rdi,8),%xmm2
movsd  0x8(%rdx,%rdi,8),%xmm3
unpcklpd %xmm3,%xmm3
movsd  0x8(%rbx,%rdi,8),%xmm4
movhpd 0x8(%rax,%rdi,8),%xmm4
movsd  (%rbx,%rdi,8),%xmm5
movsd  0x8(%rcx,%rdi,8),%xmm6
movhpd 0x8(%r12,%rdi,8),%xmm6
movsd  (%rcx,%rdi,8),%xmm7
mulpd  %xmm3,%xmm6
movhpd (%r12,%rdi,8),%xmm7
mulpd  %xmm3,%xmm4
movhpd (%rax,%rdi,8),%xmm5
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm5
addpd  %xmm4,%xmm5
addpd  %xmm5,%xmm1
mulpd  %xmm7,%xmm2
addpd  %xmm6,%xmm2
addpd  %xmm2,%xmm0
add    $0x2,%rdi
cmp    %r15,%rdi
jl     1210 <mult_block+0x110>
jmp    11c0 <mult_block+0xc0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @mult_block(double** nocapture %0, double** nocapture %1, double** nocapture %2, i32 %3, i32 %4, i32 %5) {
%7 = icmp sgt i32 %3, 0
br i1 %7, label %8, label %103
8: ; preds = %6
%9 = icmp sgt i32 %4, 0
%10 = icmp sgt i32 %5, 0
%11 = sext i32 %5 to i64
%12 = zext i32 %3 to i64
%13 = zext i32 %4 to i64
br label %14
14: ; preds = %8, %100
%15 = phi i64 [ 0, %8 ], [ %101, %100 ]
%16 = getelementptr inbounds double*, double** %0, i64 %15
%17 = load double*, double** %16
%18 = or i64 %15, 1
%19 = getelementptr inbounds double*, double** %0, i64 %18
%20 = load double*, double** %19
%21 = or i64 %15, 2
%22 = getelementptr inbounds double*, double** %0, i64 %21
%23 = load double*, double** %22
%24 = or i64 %15, 3
%25 = getelementptr inbounds double*, double** %0, i64 %24
%26 = load double*, double** %25
%27 = getelementptr inbounds double*, double** %2, i64 %15
%28 = load double*, double** %27
%29 = getelementptr inbounds double*, double** %2, i64 %18
%30 = load double*, double** %29
%31 = getelementptr inbounds double*, double** %2, i64 %21
%32 = load double*, double** %31
%33 = getelementptr inbounds double*, double** %2, i64 %24
%34 = load double*, double** %33
br i1 %9, label %35, label %100
35: ; preds = %14, %92
%36 = phi i64 [ %98, %92 ], [ 0, %14 ]
%37 = getelementptr inbounds double*, double** %1, i64 %36
%38 = load double*, double** %37
%39 = getelementptr inbounds double, double* %28, i64 %36
%40 = load double, double* %39
%41 = getelementptr inbounds double, double* %30, i64 %36
%42 = load double, double* %41
%43 = getelementptr inbounds double, double* %32, i64 %36
%44 = load double, double* %43
%45 = getelementptr inbounds double, double* %34, i64 %36
%46 = load double, double* %45
%47 = insertelement <4 x double> poison, double %46, i64 0
%48 = insertelement <4 x double> %47, double %44, i64 1
%49 = insertelement <4 x double> %48, double %42, i64 2
%50 = insertelement <4 x double> %49, double %40, i64 3
br i1 %10, label %51, label %92
51: ; preds = %35, %51
%52 = phi i64 [ %90, %51 ], [ 0, %35 ]
%53 = phi <4 x double> [ %89, %51 ], [ %50, %35 ]
%54 = getelementptr inbounds double, double* %38, i64 %52
%55 = load double, double* %54
%56 = or i64 %52, 1
%57 = getelementptr inbounds double, double* %38, i64 %56
%58 = load double, double* %57
%59 = getelementptr inbounds double, double* %17, i64 %52
%60 = load double, double* %59
%61 = getelementptr inbounds double, double* %17, i64 %56
%62 = load double, double* %61
%63 = getelementptr inbounds double, double* %20, i64 %52
%64 = load double, double* %63
%65 = getelementptr inbounds double, double* %20, i64 %56
%66 = load double, double* %65
%67 = getelementptr inbounds double, double* %23, i64 %52
%68 = load double, double* %67
%69 = getelementptr inbounds double, double* %23, i64 %56
%70 = load double, double* %69
%71 = getelementptr inbounds double, double* %26, i64 %52
%72 = load double, double* %71
%73 = getelementptr inbounds double, double* %26, i64 %56
%74 = load double, double* %73
%75 = insertelement <4 x double> poison, double %58, i64 0
%76 = shufflevector <4 x double> %75, <4 x double> poison, <4 x i32> zeroinitializer
%77 = insertelement <4 x double> poison, double %74, i64 0
%78 = insertelement <4 x double> %77, double %70, i64 1
%79 = insertelement <4 x double> %78, double %66, i64 2
%80 = insertelement <4 x double> %79, double %62, i64 3
%81 = fmul <4 x double> %76, %80
%82 = insertelement <4 x double> poison, double %72, i64 0
%83 = insertelement <4 x double> %82, double %68, i64 1
%84 = insertelement <4 x double> %83, double %64, i64 2
%85 = insertelement <4 x double> %84, double %60, i64 3
%86 = insertelement <4 x double> poison, double %55, i64 0
%87 = shufflevector <4 x double> %86, <4 x double> poison, <4 x i32> zeroinitializer
%88 = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> %85, <4 x double> %87, <4 x double> %81)
%89 = fadd <4 x double> %53, %88
%90 = add nuw nsw i64 %52, 2
%91 = icmp slt i64 %90, %11
br i1 %91, label %51, label %92
92: ; preds = %51, %35
%93 = phi <4 x double> [ %50, %35 ], [ %89, %51 ]
%94 = extractelement <4 x double> %93, i64 3
store double %94, double* %39
%95 = extractelement <4 x double> %93, i64 2
store double %95, double* %41
%96 = extractelement <4 x double> %93, i64 1
store double %96, double* %43
%97 = extractelement <4 x double> %93, i64 0
store double %97, double* %45
%98 = add nuw nsw i64 %36, 1
%99 = icmp eq i64 %98, %13
br i1 %99, label %100, label %35
100: ; preds = %92, %14
%101 = add nuw nsw i64 %15, 4
%102 = icmp ult i64 %101, %12
br i1 %102, label %14, label %103
103: ; preds = %100, %6
ret void
}