void _tram_direct_dtram_like_update(double *lagrangian_mult,
                                    double *biased_conf_weights,
                                    int *count_matrices, int *state_counts,
                                    int n_therm_states, int n_conf_states,
                                    double *scratch_M, int *scratch_M_int,
                                    double *new_biased_conf_weights) {
  int K, KMM, i, j, CCT_Kji, Ki, Kj;
  double *divisor;
  int *Csum;
  divisor = scratch_M;
  Csum = scratch_M_int;
  for (i = 0; i < n_conf_states; ++i) {
    divisor[i] = 0;
    Csum[i] = 0;
    for (K = 0; K < n_therm_states; ++K) {
      Ki = K * n_conf_states + i;
      if (0 == state_counts[Ki])
        continue;
      KMM = K * n_conf_states * n_conf_states;
      for (j = 0; j < n_conf_states; ++j) {
        Kj = K * n_conf_states + j;
        CCT_Kji = count_matrices[KMM + j * n_conf_states + i];
        Csum[i] += CCT_Kji;
        if (i == j) {
          divisor[i] += CCT_Kji;
        } else {
          CCT_Kji += count_matrices[KMM + i * n_conf_states + j];
          if (0 < CCT_Kji) {
            divisor[i] +=
                (double)CCT_Kji /
                (1.0 + (lagrangian_mult[Ki] / lagrangian_mult[Kj]) *
                           (biased_conf_weights[Kj] / biased_conf_weights[Ki]));
          }
        }
      }
    }
  }
  for (i = 0; i < n_conf_states; ++i) {
    if (0 < Csum[i]) {
      for (K = 0; K < n_therm_states; ++K) {
        Ki = K * n_conf_states + i;
        new_biased_conf_weights[Ki] =
            biased_conf_weights[Ki] * Csum[i] / divisor[i];
      }
    }
  }
}


x86 assembly (clang, -O0):
<_tram_direct_dtram_like_update>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
mov    0x10(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    0x18(%rbp),%rax
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    12ec <_tram_direct_dtram_like_update+0x1ec>
mov    -0x50(%rbp),%rax
movslq -0x34(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x58(%rbp),%rax
movslq -0x34(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12d9 <_tram_direct_dtram_like_update+0x1d9>
mov    -0x2c(%rbp),%eax
imul   -0x28(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x20(%rbp),%rcx
movslq -0x40(%rbp),%rdx
xor    %eax,%eax
cmp    (%rcx,%rdx,4),%eax
jne    11a2 <_tram_direct_dtram_like_update+0xa2>
jmp    12cb <_tram_direct_dtram_like_update+0x1cb>
mov    -0x2c(%rbp),%eax
imul   -0x28(%rbp),%eax
imul   -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    12c6 <_tram_direct_dtram_like_update+0x1c6>
mov    -0x2c(%rbp),%eax
imul   -0x28(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    -0x38(%rbp),%edx
imul   -0x28(%rbp),%edx
add    %edx,%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%edx
mov    -0x58(%rbp),%rax
movslq -0x34(%rbp),%rcx
add    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x34(%rbp),%eax
cmp    -0x38(%rbp),%eax
jne    1225 <_tram_direct_dtram_like_update+0x125>
cvtsi2sdl -0x3c(%rbp),%xmm0
mov    -0x50(%rbp),%rax
movslq -0x34(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b3 <_tram_direct_dtram_like_update+0x1b3>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    -0x34(%rbp),%edx
imul   -0x28(%rbp),%edx
add    %edx,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
xor    %eax,%eax
cmp    -0x3c(%rbp),%eax
jge    12ae <_tram_direct_dtram_like_update+0x1ae>
cvtsi2sdl -0x3c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xd6c(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mov    -0x50(%rbp),%rax
movslq -0x34(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b3 <_tram_direct_dtram_like_update+0x1b3>
jmp    12b8 <_tram_direct_dtram_like_update+0x1b8>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11b7 <_tram_direct_dtram_like_update+0xb7>
jmp    12cb <_tram_direct_dtram_like_update+0x1cb>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1171 <_tram_direct_dtram_like_update+0x71>
jmp    12de <_tram_direct_dtram_like_update+0x1de>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    113f <_tram_direct_dtram_like_update+0x3f>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1390 <_tram_direct_dtram_like_update+0x290>
mov    -0x58(%rbp),%rcx
movslq -0x34(%rbp),%rdx
xor    %eax,%eax
cmp    (%rcx,%rdx,4),%eax
jge    137d <_tram_direct_dtram_like_update+0x27d>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1378 <_tram_direct_dtram_like_update+0x278>
mov    -0x2c(%rbp),%eax
imul   -0x28(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x58(%rbp),%rax
movslq -0x34(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x50(%rbp),%rax
movslq -0x34(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    0x20(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1319 <_tram_direct_dtram_like_update+0x219>
jmp    137d <_tram_direct_dtram_like_update+0x27d>
jmp    1382 <_tram_direct_dtram_like_update+0x282>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    12f3 <_tram_direct_dtram_like_update+0x1f3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_tram_direct_dtram_like_update>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8d,-0x4c(%rsp)
mov    %rcx,-0x8(%rsp)
mov    %rsi,-0x48(%rsp)
mov    %rdi,-0x28(%rsp)
test   %r9d,%r9d
jle    13a1 <_tram_direct_dtram_like_update+0x2a1>
mov    0x38(%rsp),%rcx
mov    %r9d,%ebx
mov    -0x4c(%rsp),%eax
mov    %rax,-0x38(%rsp)
mov    %r9d,%eax
imul   %r9d,%eax
mov    %eax,-0x30(%rsp)
lea    0x0(,%rbx,8),%rax
mov    %rax,-0x10(%rsp)
lea    0x0(,%rbx,4),%rax
mov    %rax,-0x20(%rsp)
mov    %rbx,%rax
imul   %rbx,%rax
shl    $0x2,%rax
mov    %rax,-0x18(%rsp)
xor    %r10d,%r10d
movsd  0xe88(%rip),%xmm0
mov    %rdx,-0x40(%rsp)
jmp    119f <_tram_direct_dtram_like_update+0x9f>
nop
add    $0x1,%r10
mov    -0x40(%rsp),%rax
add    -0x20(%rsp),%rax
mov    %rax,-0x40(%rsp)
cmp    %rbx,%r10
mov    %r14,%rcx
je     12a4 <_tram_direct_dtram_like_update+0x1a4>
mov    %rcx,%r14
movq   $0x0,(%rcx,%r10,8)
mov    0x40(%rsp),%rax
movl   $0x0,(%rax,%r10,4)
cmpl   $0x0,-0x4c(%rsp)
jle    1180 <_tram_direct_dtram_like_update+0x80>
xor    %r12d,%r12d
xorpd  %xmm1,%xmm1
mov    -0x40(%rsp),%r8
mov    -0x48(%rsp),%rsi
mov    -0x28(%rsp),%rdi
mov    %r10d,%ecx
xor    %ebp,%ebp
jmp    1207 <_tram_direct_dtram_like_update+0x107>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rbp
mov    -0x2c(%rsp),%ecx
add    -0x30(%rsp),%ecx
mov    -0x10(%rsp),%rax
add    %rax,%rdi
add    %rax,%rsi
add    -0x18(%rsp),%r8
cmp    -0x38(%rsp),%rbp
je     1180 <_tram_direct_dtram_like_update+0x80>
mov    %rbp,%r13
imul   %rbx,%r13
add    %r10,%r13
mov    -0x8(%rsp),%rax
cmpl   $0x0,(%rax,%r13,4)
mov    %ecx,-0x2c(%rsp)
je     11e0 <_tram_direct_dtram_like_update+0xe0>
xor    %r11d,%r11d
jmp    124e <_tram_direct_dtram_like_update+0x14e>
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtsi2sd %r15d,%xmm2
addsd  %xmm2,%xmm1
movsd  %xmm1,(%r14,%r10,8)
add    $0x1,%r11
add    %r9d,%ecx
cmp    %r11,%rbx
je     11e0 <_tram_direct_dtram_like_update+0xe0>
movslq %ecx,%rax
mov    (%rdx,%rax,4),%r15d
add    %r15d,%r12d
mov    0x40(%rsp),%rax
mov    %r12d,(%rax,%r10,4)
cmp    %r11,%r10
je     1230 <_tram_direct_dtram_like_update+0x130>
add    (%r8,%r11,4),%r15d
jle    1242 <_tram_direct_dtram_like_update+0x142>
xorps  %xmm2,%xmm2
cvtsi2sd %r15d,%xmm2
mov    -0x28(%rsp),%rax
movsd  (%rax,%r13,8),%xmm3
divsd  (%rdi,%r11,8),%xmm3
movsd  (%rsi,%r11,8),%xmm4
mov    -0x48(%rsp),%rax
divsd  (%rax,%r13,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm0,%xmm4
divsd  %xmm4,%xmm2
jmp    1238 <_tram_direct_dtram_like_update+0x138>
test   %r9d,%r9d
mov    0x48(%rsp),%r14
jle    13a1 <_tram_direct_dtram_like_update+0x2a1>
mov    -0x38(%rsp),%r8
and    $0xfffffffe,%r8d
lea    (%r14,%rbx,8),%r10
mov    %rbx,%r9
shl    $0x4,%r9
mov    -0x48(%rsp),%rsi
lea    (%rsi,%rbx,8),%r11
xor    %ebp,%ebp
mov    %r14,%r15
jmp    12fd <_tram_direct_dtram_like_update+0x1fd>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rbp
add    $0x8,%r10
add    $0x8,%r11
add    $0x8,%rsi
add    $0x8,%r15
cmp    %rbx,%rbp
je     13a1 <_tram_direct_dtram_like_update+0x2a1>
mov    0x40(%rsp),%rax
mov    (%rax,%rbp,4),%edx
test   %edx,%edx
jle    12e0 <_tram_direct_dtram_like_update+0x1e0>
cmpl   $0x0,-0x4c(%rsp)
jle    12e0 <_tram_direct_dtram_like_update+0x1e0>
xorps  %xmm0,%xmm0
cvtsi2sd %edx,%xmm0
cmpl   $0x1,-0x4c(%rsp)
jne    1330 <_tram_direct_dtram_like_update+0x230>
xor    %edx,%edx
jmp    1375 <_tram_direct_dtram_like_update+0x275>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xor    %edi,%edi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rsi,%rdi,1),%xmm1
mulsd  %xmm0,%xmm1
divsd  (%rcx,%rbp,8),%xmm1
movsd  %xmm1,(%r15,%rdi,1)
movsd  (%r11,%rdi,1),%xmm1
mulsd  %xmm0,%xmm1
divsd  (%rcx,%rbp,8),%xmm1
movsd  %xmm1,(%r10,%rdi,1)
add    $0x2,%rdx
add    %r9,%rdi
cmp    %rdx,%r8
jne    1340 <_tram_direct_dtram_like_update+0x240>
testb  $0x1,-0x38(%rsp)
je     12e0 <_tram_direct_dtram_like_update+0x1e0>
imul   %rbx,%rdx
add    %rbp,%rdx
mov    -0x48(%rsp),%rax
mulsd  (%rax,%rdx,8),%xmm0
divsd  (%rcx,%rbp,8),%xmm0
movsd  %xmm0,(%r14,%rdx,8)
jmp    12e0 <_tram_direct_dtram_like_update+0x1e0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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