void cmco_h2b(const int nbod, const double *restrict m,
              const double **restrict xh, const double **restrict vh,
              double **restrict x, double **restrict v) {
  double mtot = 0.0;
  x[0][0] = 0.0;
  x[0][1] = 0.0;
  x[0][2] = 0.0;
  v[0][0] = 0.0;
  v[0][1] = 0.0;
  v[0][2] = 0.0;
  for (int j = 1; j < nbod; j++) {
    mtot += m[j];
    x[0][0] += m[j] * xh[j][0];
    x[0][1] += m[j] * xh[j][1];
    x[0][2] += m[j] * xh[j][2];
    v[0][0] += m[j] * vh[j][0];
    v[0][1] += m[j] * vh[j][1];
    v[0][2] += m[j] * vh[j][2];
  }
  const double temp = -1.0 / (mtot + m[0]);
  x[0][0] *= temp;
  x[0][1] *= temp;
  x[0][2] *= temp;
  v[0][0] *= temp;
  v[0][1] *= temp;
  v[0][2] *= temp;
  for (int j = 1; j < nbod; j++) {
    x[j][0] += x[0][0];
    x[j][1] += x[0][1];
    x[j][2] += x[0][2];
    v[j][0] += v[0][0];
    v[j][1] += v[0][1];
    v[j][2] += v[0][2];
  }
}


x86 assembly (clang, -O0):
<cmco_h2b>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
movl   $0x1,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12f7 <cmco_h2b+0x1f7>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm2
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm2
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x10(%rax),%xmm2
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm2
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm2
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x10(%rax),%xmm2
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1182 <cmco_h2b+0x82>
movsd  -0x38(%rbp),%xmm1
mov    -0x10(%rbp),%rax
addsd  (%rax),%xmm1
movsd  0xcf4(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
mulsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
mulsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
mulsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
mulsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    147c <cmco_h2b+0x37c>
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  0x8(%rax),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x30(%rbp),%rax
mov    (%rax),%rax
movsd  0x10(%rax),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    139c <cmco_h2b+0x29c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<cmco_h2b>:
push   %r14
push   %rbx
mov    (%r8),%r10
xorpd  %xmm0,%xmm0
movupd %xmm0,(%r10)
movq   $0x0,0x10(%r10)
mov    (%r9),%r14
movupd %xmm0,(%r14)
movq   $0x0,0x10(%r14)
xorpd  %xmm0,%xmm0
mov    %edi,%r11d
cmp    $0x2,%edi
jl     11d2 <cmco_h2b+0xd2>
xorpd  %xmm0,%xmm0
mov    $0x1,%ebx
movsd  (%rsi,%rbx,8),%xmm1
addsd  %xmm1,%xmm0
mov    (%rdx,%rbx,8),%rax
movsd  (%rax),%xmm2
mulsd  %xmm1,%xmm2
addsd  (%r10),%xmm2
movsd  %xmm2,(%r10)
movsd  0x8(%rax),%xmm2
mulsd  %xmm1,%xmm2
addsd  0x8(%r10),%xmm2
movsd  %xmm2,0x8(%r10)
movsd  0x10(%rax),%xmm2
mulsd  %xmm1,%xmm2
addsd  0x10(%r10),%xmm2
movsd  %xmm2,0x10(%r10)
mov    (%rcx,%rbx,8),%rax
movsd  (%rax),%xmm2
mulsd  %xmm1,%xmm2
addsd  (%r14),%xmm2
movsd  %xmm2,(%r14)
movsd  0x8(%rax),%xmm2
mulsd  %xmm1,%xmm2
addsd  0x8(%r14),%xmm2
movsd  %xmm2,0x8(%r14)
mulsd  0x10(%rax),%xmm1
addsd  0x10(%r14),%xmm1
movsd  %xmm1,0x10(%r14)
add    $0x1,%rbx
cmp    %rbx,%r11
jne    1140 <cmco_h2b+0x40>
addsd  (%rsi),%xmm0
movsd  0xe22(%rip),%xmm1
divsd  %xmm0,%xmm1
movupd (%r10),%xmm0
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
mulpd  %xmm2,%xmm0
movupd %xmm0,(%r10)
movsd  0x10(%r10),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%r10)
movupd (%r14),%xmm0
mulpd  %xmm2,%xmm0
movupd %xmm0,(%r14)
mulsd  0x10(%r14),%xmm1
movsd  %xmm1,0x10(%r14)
cmp    $0x2,%edi
jl     129b <cmco_h2b+0x19b>
mov    $0x1,%ecx
nopl   0x0(%rax)
movsd  (%r10),%xmm0
mov    (%r8,%rcx,8),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r10),%xmm0
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r10),%xmm0
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  (%r14),%xmm0
mov    (%r9,%rcx,8),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r14),%xmm0
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x10(%r14),%xmm0
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
add    $0x1,%rcx
cmp    %rcx,%r11
jne    1230 <cmco_h2b+0x130>
pop    %rbx
pop    %r14
ret

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

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