void pll_core_create_lookup_4x4(unsigned int rate_cats, double *lookup,
                                const double *left_matrix,
                                const double *right_matrix) {
  unsigned int i, j, k, n, m;
  unsigned int maxstates = 16;
  unsigned int states = 4;
  unsigned int index = 0;
  double termj = 0;
  double termk = 0;
  const double *jmat;
  const double *kmat;
  for (j = 0; j < maxstates; ++j) {
    for (k = 0; k < maxstates; ++k) {
      jmat = left_matrix;
      kmat = right_matrix;
      for (n = 0; n < rate_cats; ++n) {
        for (i = 0; i < states; ++i) {
          termj = 0;
          termk = 0;
          unsigned int jstate = j;
          unsigned int kstate = k;
          for (m = 0; m < states; ++m) {
            if (jstate & 1)
              termj += jmat[m];
            if (kstate & 1)
              termk += kmat[m];
            jstate >>= 1;
            kstate >>= 1;
          }
          jmat += states;
          kmat += states;
          lookup[index++] = termj * termk;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<pll_core_create_lookup_4x4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x10,-0x38(%rbp)
movl   $0x4,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x38(%rbp),%eax
jae    12bc <pll_core_create_lookup_4x4+0x1bc>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x38(%rbp),%eax
jae    12a9 <pll_core_create_lookup_4x4+0x1a9>
mov    -0x18(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x60(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x4(%rbp),%eax
jae    1296 <pll_core_create_lookup_4x4+0x196>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jae    1283 <pll_core_create_lookup_4x4+0x183>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x68(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jae    122d <pll_core_create_lookup_4x4+0x12d>
mov    -0x64(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     11e8 <pll_core_create_lookup_4x4+0xe8>
mov    -0x58(%rbp),%rax
mov    -0x34(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x68(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     120d <pll_core_create_lookup_4x4+0x10d>
mov    -0x60(%rbp),%rax
mov    -0x34(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x64(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    -0x68(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11b7 <pll_core_create_lookup_4x4+0xb7>
mov    -0x3c(%rbp),%ecx
mov    -0x58(%rbp),%rax
mov    %ecx,%ecx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x60(%rbp),%rax
mov    %ecx,%ecx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x40(%rbp)
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1188 <pll_core_create_lookup_4x4+0x88>
jmp    1288 <pll_core_create_lookup_4x4+0x188>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1175 <pll_core_create_lookup_4x4+0x75>
jmp    129b <pll_core_create_lookup_4x4+0x19b>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1152 <pll_core_create_lookup_4x4+0x52>
jmp    12ae <pll_core_create_lookup_4x4+0x1ae>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    113f <pll_core_create_lookup_4x4+0x3f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<pll_core_create_lookup_4x4>:
push   %rbx
xor    %r8d,%r8d
xorpd  %xmm0,%xmm0
xor    %r9d,%r9d
jmp    111e <pll_core_create_lookup_4x4+0x1e>
nopl   (%rax)
add    $0x1,%r9d
cmp    $0x10,%r9d
je     14dd <pll_core_create_lookup_4x4+0x3dd>
xor    %r10d,%r10d
jmp    113a <pll_core_create_lookup_4x4+0x3a>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r10d
cmp    $0x10,%r10d
je     1110 <pll_core_create_lookup_4x4+0x10>
test   %edi,%edi
je     1130 <pll_core_create_lookup_4x4+0x30>
mov    $0x1e,%eax
mov    %edi,%r11d
jmp    1169 <pll_core_create_lookup_4x4+0x69>
nopl   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm1
add    $0x4,%r8d
mov    %ebx,%ebx
movsd  %xmm1,(%rsi,%rbx,8)
add    $0x20,%rax
add    $0xffffffff,%r11d
je     1130 <pll_core_create_lookup_4x4+0x30>
xorpd  %xmm2,%xmm2
xorpd  %xmm1,%xmm1
test   $0x1,%r9b
jne    1310 <pll_core_create_lookup_4x4+0x210>
test   $0x1,%r10b
jne    1324 <pll_core_create_lookup_4x4+0x224>
test   $0x2,%r9b
jne    1338 <pll_core_create_lookup_4x4+0x238>
test   $0x2,%r10b
jne    1348 <pll_core_create_lookup_4x4+0x248>
test   $0x4,%r9b
jne    1358 <pll_core_create_lookup_4x4+0x258>
test   $0x4,%r10b
jne    1368 <pll_core_create_lookup_4x4+0x268>
test   $0x8,%r9b
jne    1378 <pll_core_create_lookup_4x4+0x278>
test   $0x8,%r10b
je     11c3 <pll_core_create_lookup_4x4+0xc3>
addsd  -0x60(%rcx,%rax,4),%xmm2
mulsd  %xmm2,%xmm1
mov    %r8d,%ebx
movsd  %xmm1,(%rsi,%rbx,8)
xorpd  %xmm2,%xmm2
xorpd  %xmm1,%xmm1
test   $0x1,%r9b
jne    1390 <pll_core_create_lookup_4x4+0x290>
test   $0x1,%r10b
jne    13a4 <pll_core_create_lookup_4x4+0x2a4>
test   $0x2,%r9b
jne    13b8 <pll_core_create_lookup_4x4+0x2b8>
test   $0x2,%r10b
jne    13c8 <pll_core_create_lookup_4x4+0x2c8>
test   $0x4,%r9b
jne    13d8 <pll_core_create_lookup_4x4+0x2d8>
test   $0x4,%r10b
jne    13e8 <pll_core_create_lookup_4x4+0x2e8>
test   $0x8,%r9b
je     121f <pll_core_create_lookup_4x4+0x11f>
addsd  -0x40(%rdx,%rax,4),%xmm1
lea    0x1(%r8),%ebx
test   $0x8,%r10b
je     122f <pll_core_create_lookup_4x4+0x12f>
addsd  -0x40(%rcx,%rax,4),%xmm2
mulsd  %xmm2,%xmm1
mov    %ebx,%ebx
movsd  %xmm1,(%rsi,%rbx,8)
xorpd  %xmm2,%xmm2
xorpd  %xmm1,%xmm1
test   $0x1,%r9b
jne    1400 <pll_core_create_lookup_4x4+0x300>
test   $0x1,%r10b
jne    1414 <pll_core_create_lookup_4x4+0x314>
test   $0x2,%r9b
jne    1428 <pll_core_create_lookup_4x4+0x328>
test   $0x2,%r10b
jne    1438 <pll_core_create_lookup_4x4+0x338>
test   $0x4,%r9b
jne    1448 <pll_core_create_lookup_4x4+0x348>
test   $0x4,%r10b
jne    1458 <pll_core_create_lookup_4x4+0x358>
test   $0x8,%r9b
je     128a <pll_core_create_lookup_4x4+0x18a>
addsd  -0x20(%rdx,%rax,4),%xmm1
lea    0x2(%r8),%ebx
test   $0x8,%r10b
je     129a <pll_core_create_lookup_4x4+0x19a>
addsd  -0x20(%rcx,%rax,4),%xmm2
mulsd  %xmm2,%xmm1
mov    %ebx,%ebx
movsd  %xmm1,(%rsi,%rbx,8)
xorpd  %xmm2,%xmm2
xorpd  %xmm1,%xmm1
test   $0x1,%r9b
jne    1470 <pll_core_create_lookup_4x4+0x370>
test   $0x1,%r10b
jne    1484 <pll_core_create_lookup_4x4+0x384>
test   $0x2,%r9b
jne    1498 <pll_core_create_lookup_4x4+0x398>
test   $0x2,%r10b
jne    14a8 <pll_core_create_lookup_4x4+0x3a8>
test   $0x4,%r9b
jne    14b8 <pll_core_create_lookup_4x4+0x3b8>
test   $0x4,%r10b
jne    14c8 <pll_core_create_lookup_4x4+0x3c8>
test   $0x8,%r9b
je     12f4 <pll_core_create_lookup_4x4+0x1f4>
addsd  (%rdx,%rax,4),%xmm1
lea    0x3(%r8),%ebx
test   $0x8,%r10b
je     1150 <pll_core_create_lookup_4x4+0x50>
addsd  (%rcx,%rax,4),%xmm2
jmp    1150 <pll_core_create_lookup_4x4+0x50>
nopl   0x0(%rax)
movsd  -0x78(%rdx,%rax,4),%xmm1
addsd  %xmm0,%xmm1
test   $0x1,%r10b
je     1185 <pll_core_create_lookup_4x4+0x85>
movsd  -0x78(%rcx,%rax,4),%xmm2
addsd  %xmm0,%xmm2
test   $0x2,%r9b
je     118f <pll_core_create_lookup_4x4+0x8f>
addsd  -0x70(%rdx,%rax,4),%xmm1
test   $0x2,%r10b
je     1199 <pll_core_create_lookup_4x4+0x99>
addsd  -0x70(%rcx,%rax,4),%xmm2
test   $0x4,%r9b
je     11a3 <pll_core_create_lookup_4x4+0xa3>
addsd  -0x68(%rdx,%rax,4),%xmm1
test   $0x4,%r10b
je     11ad <pll_core_create_lookup_4x4+0xad>
addsd  -0x68(%rcx,%rax,4),%xmm2
test   $0x8,%r9b
je     11b7 <pll_core_create_lookup_4x4+0xb7>
addsd  -0x60(%rdx,%rax,4),%xmm1
test   $0x8,%r10b
jne    11bd <pll_core_create_lookup_4x4+0xbd>
jmp    11c3 <pll_core_create_lookup_4x4+0xc3>
nopl   (%rax)
movsd  -0x58(%rdx,%rax,4),%xmm1
addsd  %xmm0,%xmm1
test   $0x1,%r10b
je     11eb <pll_core_create_lookup_4x4+0xeb>
movsd  -0x58(%rcx,%rax,4),%xmm2
addsd  %xmm0,%xmm2
test   $0x2,%r9b
je     11f5 <pll_core_create_lookup_4x4+0xf5>
addsd  -0x50(%rdx,%rax,4),%xmm1
test   $0x2,%r10b
je     11ff <pll_core_create_lookup_4x4+0xff>
addsd  -0x50(%rcx,%rax,4),%xmm2
test   $0x4,%r9b
je     1209 <pll_core_create_lookup_4x4+0x109>
addsd  -0x48(%rdx,%rax,4),%xmm1
test   $0x4,%r10b
je     1213 <pll_core_create_lookup_4x4+0x113>
addsd  -0x48(%rcx,%rax,4),%xmm2
test   $0x8,%r9b
jne    1219 <pll_core_create_lookup_4x4+0x119>
jmp    121f <pll_core_create_lookup_4x4+0x11f>
nopl   (%rax)
movsd  -0x38(%rdx,%rax,4),%xmm1
addsd  %xmm0,%xmm1
test   $0x1,%r10b
je     1256 <pll_core_create_lookup_4x4+0x156>
movsd  -0x38(%rcx,%rax,4),%xmm2
addsd  %xmm0,%xmm2
test   $0x2,%r9b
je     1260 <pll_core_create_lookup_4x4+0x160>
addsd  -0x30(%rdx,%rax,4),%xmm1
test   $0x2,%r10b
je     126a <pll_core_create_lookup_4x4+0x16a>
addsd  -0x30(%rcx,%rax,4),%xmm2
test   $0x4,%r9b
je     1274 <pll_core_create_lookup_4x4+0x174>
addsd  -0x28(%rdx,%rax,4),%xmm1
test   $0x4,%r10b
je     127e <pll_core_create_lookup_4x4+0x17e>
addsd  -0x28(%rcx,%rax,4),%xmm2
test   $0x8,%r9b
jne    1284 <pll_core_create_lookup_4x4+0x184>
jmp    128a <pll_core_create_lookup_4x4+0x18a>
nopl   (%rax)
movsd  -0x18(%rdx,%rax,4),%xmm1
addsd  %xmm0,%xmm1
test   $0x1,%r10b
je     12c1 <pll_core_create_lookup_4x4+0x1c1>
movsd  -0x18(%rcx,%rax,4),%xmm2
addsd  %xmm0,%xmm2
test   $0x2,%r9b
je     12cb <pll_core_create_lookup_4x4+0x1cb>
addsd  -0x10(%rdx,%rax,4),%xmm1
test   $0x2,%r10b
je     12d5 <pll_core_create_lookup_4x4+0x1d5>
addsd  -0x10(%rcx,%rax,4),%xmm2
test   $0x4,%r9b
je     12df <pll_core_create_lookup_4x4+0x1df>
addsd  -0x8(%rdx,%rax,4),%xmm1
test   $0x4,%r10b
je     12e9 <pll_core_create_lookup_4x4+0x1e9>
addsd  -0x8(%rcx,%rax,4),%xmm2
test   $0x8,%r9b
jne    12ef <pll_core_create_lookup_4x4+0x1ef>
jmp    12f4 <pll_core_create_lookup_4x4+0x1f4>
pop    %rbx
ret

LLVM IR (-O0):
define void @pll_core_create_lookup_4x4(i32 %0, double* %1, double* %2, double* %3) {
%5 = alloca i32
%6 = alloca double*
%7 = alloca double*
%8 = alloca double*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca double
%18 = alloca double
%19 = alloca double*
%20 = alloca double*
%21 = alloca i32
%22 = alloca i32
store i32 %0, i32* %5
store double* %1, double** %6
store double* %2, double** %7
store double* %3, double** %8
store i32 16, i32* %14
store i32 4, i32* %15
store i32 0, i32* %16
store double 0.000000e+00, double* %17
store double 0.000000e+00, double* %18
store i32 0, i32* %10
br label %23
23: ; preds = %112, %4
%24 = load i32, i32* %10
%25 = load i32, i32* %14
%26 = icmp ult i32 %24, %25
br i1 %26, label %27, label %115
27: ; preds = %23
store i32 0, i32* %11
br label %28
28: ; preds = %108, %27
%29 = load i32, i32* %11
%30 = load i32, i32* %14
%31 = icmp ult i32 %29, %30
br i1 %31, label %32, label %111
32: ; preds = %28
%33 = load double*, double** %7
store double* %33, double** %19
%34 = load double*, double** %8
store double* %34, double** %20
store i32 0, i32* %12
br label %35
35: ; preds = %104, %32
%36 = load i32, i32* %12
%37 = load i32, i32* %5
%38 = icmp ult i32 %36, %37
br i1 %38, label %39, label %107
39: ; preds = %35
store i32 0, i32* %9
br label %40
40: ; preds = %100, %39
%41 = load i32, i32* %9
%42 = load i32, i32* %15
%43 = icmp ult i32 %41, %42
br i1 %43, label %44, label %103
44: ; preds = %40
store double 0.000000e+00, double* %17
store double 0.000000e+00, double* %18
%45 = load i32, i32* %10
store i32 %45, i32* %21
%46 = load i32, i32* %11
store i32 %46, i32* %22
store i32 0, i32* %13
br label %47
47: ; preds = %80, %44
%48 = load i32, i32* %13
%49 = load i32, i32* %15
%50 = icmp ult i32 %48, %49
br i1 %50, label %51, label %83
51: ; preds = %47
%52 = load i32, i32* %21
%53 = and i32 %52, 1
%54 = icmp ne i32 %53, 0
br i1 %54, label %55, label %63
55: ; preds = %51
%56 = load double*, double** %19
%57 = load i32, i32* %13
%58 = zext i32 %57 to i64
%59 = getelementptr inbounds double, double* %56, i64 %58
%60 = load double, double* %59
%61 = load double, double* %17
%62 = fadd double %61, %60
store double %62, double* %17
br label %63
63: ; preds = %55, %51
%64 = load i32, i32* %22
%65 = and i32 %64, 1
%66 = icmp ne i32 %65, 0
br i1 %66, label %67, label %75
67: ; preds = %63
%68 = load double*, double** %20
%69 = load i32, i32* %13
%70 = zext i32 %69 to i64
%71 = getelementptr inbounds double, double* %68, i64 %70
%72 = load double, double* %71
%73 = load double, double* %18
%74 = fadd double %73, %72
store double %74, double* %18
br label %75
75: ; preds = %67, %63
%76 = load i32, i32* %21
%77 = lshr i32 %76, 1
store i32 %77, i32* %21
%78 = load i32, i32* %22
%79 = lshr i32 %78, 1
store i32 %79, i32* %22
br label %80
80: ; preds = %75
%81 = load i32, i32* %13
%82 = add i32 %81, 1
store i32 %82, i32* %13
br label %47
83: ; preds = %47
%84 = load i32, i32* %15
%85 = load double*, double** %19
%86 = zext i32 %84 to i64
%87 = getelementptr inbounds double, double* %85, i64 %86
store double* %87, double** %19
%88 = load i32, i32* %15
%89 = load double*, double** %20
%90 = zext i32 %88 to i64
%91 = getelementptr inbounds double, double* %89, i64 %90
store double* %91, double** %20
%92 = load double, double* %17
%93 = load double, double* %18
%94 = fmul double %92, %93
%95 = load double*, double** %6
%96 = load i32, i32* %16
%97 = add i32 %96, 1
store i32 %97, i32* %16
%98 = zext i32 %96 to i64
%99 = getelementptr inbounds double, double* %95, i64 %98
store double %94, double* %99
br label %100
100: ; preds = %83
%101 = load i32, i32* %9
%102 = add i32 %101, 1
store i32 %102, i32* %9
br label %40
103: ; preds = %40
br label %104
104: ; preds = %103
%105 = load i32, i32* %12
%106 = add i32 %105, 1
store i32 %106, i32* %12
br label %35
107: ; preds = %35
br label %108
108: ; preds = %107
%109 = load i32, i32* %11
%110 = add i32 %109, 1
store i32 %110, i32* %11
br label %28
111: ; preds = %28
br label %112
112: ; preds = %111
%113 = load i32, i32* %10
%114 = add i32 %113, 1
store i32 %114, i32* %10
br label %23
115: ; preds = %23
ret void
}

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