void _tram_direct_update_lagrangian_mult(double *lagrangian_mult,
                                         double *biased_conf_weights,
                                         int *count_matrices, int *state_counts,
                                         int n_therm_states, int n_conf_states,
                                         double *new_lagrangian_mult) {
  int i, j, K, KMM, Ki, Kj;
  int CCT_Kij;
  for (K = 0; K < n_therm_states; ++K) {
    KMM = K * n_conf_states * n_conf_states;
    for (i = 0; i < n_conf_states; ++i) {
      Ki = K * n_conf_states + i;
      new_lagrangian_mult[Ki] = 0;
      if (0 == state_counts[Ki])
        continue;
      for (j = 0; j < n_conf_states; ++j) {
        CCT_Kij = count_matrices[KMM + i * n_conf_states + j];
        if (i == j) {
          new_lagrangian_mult[Ki] += CCT_Kij;
        } else {
          Kj = K * n_conf_states + j;
          CCT_Kij += count_matrices[KMM + j * n_conf_states + i];
          if (0 < CCT_Kij) {
            new_lagrangian_mult[Ki] +=
                (double)CCT_Kij /
                (1.0 + (lagrangian_mult[Kj] / lagrangian_mult[Ki]) *
                           (biased_conf_weights[Ki] / biased_conf_weights[Kj]));
            if (new_lagrangian_mult[Ki] < 1.E-100) {
              new_lagrangian_mult[Ki] = 1.E-100;
            }
          }
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<_tram_direct_update_lagrangian_mult>:
push   %rbp
mov    %rsp,%rbp
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)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12e9 <_tram_direct_update_lagrangian_mult+0x1e9>
mov    -0x34(%rbp),%eax
imul   -0x28(%rbp),%eax
imul   -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    12d6 <_tram_direct_update_lagrangian_mult+0x1d6>
mov    -0x34(%rbp),%eax
imul   -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
xor    %eax,%eax
cmp    (%rcx,%rdx,4),%eax
jne    1189 <_tram_direct_update_lagrangian_mult+0x89>
jmp    12c8 <_tram_direct_update_lagrangian_mult+0x1c8>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    12c3 <_tram_direct_update_lagrangian_mult+0x1c3>
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x2c(%rbp),%edx
imul   -0x28(%rbp),%edx
add    %edx,%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x44(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jne    11e0 <_tram_direct_update_lagrangian_mult+0xe0>
cvtsi2sdl -0x44(%rbp),%xmm0
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b0 <_tram_direct_update_lagrangian_mult+0x1b0>
mov    -0x34(%rbp),%eax
imul   -0x28(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x30(%rbp),%edx
imul   -0x28(%rbp),%edx
add    %edx,%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
xor    %eax,%eax
cmp    -0x44(%rbp),%eax
jge    12ab <_tram_direct_update_lagrangian_mult+0x1ab>
cvtsi2sdl -0x44(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xdac(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0xd7a(%rip),%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    12a6 <_tram_direct_update_lagrangian_mult+0x1a6>
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  0xd5f(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    12ab <_tram_direct_update_lagrangian_mult+0x1ab>
jmp    12b0 <_tram_direct_update_lagrangian_mult+0x1b0>
jmp    12b5 <_tram_direct_update_lagrangian_mult+0x1b5>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1190 <_tram_direct_update_lagrangian_mult+0x90>
jmp    12c8 <_tram_direct_update_lagrangian_mult+0x1c8>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1148 <_tram_direct_update_lagrangian_mult+0x48>
jmp    12db <_tram_direct_update_lagrangian_mult+0x1db>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1127 <_tram_direct_update_lagrangian_mult+0x27>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_tram_direct_update_lagrangian_mult>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,-0x10(%rsp)
mov    %rsi,-0x40(%rsp)
mov    %rdi,-0x48(%rsp)
test   %r8d,%r8d
jle    12e2 <_tram_direct_update_lagrangian_mult+0x1e2>
mov    0x38(%rsp),%r11
movslq %r9d,%rcx
mov    %r8d,%eax
mov    %rax,-0x20(%rsp)
mov    %ecx,%eax
mov    %ecx,%esi
imul   %ecx,%esi
mov    %esi,-0x4c(%rsp)
mov    %rcx,%rsi
imul   %rcx,%rsi
shl    $0x2,%rsi
mov    %rsi,-0x28(%rsp)
lea    0x0(,%rcx,4),%rsi
mov    %rsi,-0x18(%rsp)
mov    %rcx,-0x38(%rsp)
lea    0x0(,%rcx,8),%rcx
mov    %rcx,-0x30(%rsp)
xor    %ecx,%ecx
mov    %rcx,-0x58(%rsp)
movsd  0xe85(%rip),%xmm0
movsd  0xe85(%rip),%xmm1
mov    -0x40(%rsp),%rbx
mov    -0x48(%rsp),%rdi
mov    %rdx,-0x60(%rsp)
xor    %ecx,%ecx
mov    %rcx,-0x68(%rsp)
jmp    11e4 <_tram_direct_update_lagrangian_mult+0xe4>
nopl   0x0(%rax,%rax,1)
mov    -0x68(%rsp),%rsi
add    $0x1,%rsi
mov    -0x58(%rsp),%rcx
add    -0x4c(%rsp),%ecx
mov    %rcx,-0x58(%rsp)
mov    -0x60(%rsp),%rcx
add    -0x28(%rsp),%rcx
mov    %rcx,-0x60(%rsp)
mov    -0x30(%rsp),%rcx
add    %rcx,%rdi
add    %rcx,%rbx
mov    %rsi,%rcx
mov    %rsi,-0x68(%rsp)
cmp    -0x20(%rsp),%rsi
je     12e2 <_tram_direct_update_lagrangian_mult+0x1e2>
test   %r9d,%r9d
jle    11a0 <_tram_direct_update_lagrangian_mult+0xa0>
mov    -0x68(%rsp),%rcx
imul   -0x38(%rsp),%rcx
mov    %rcx,-0x8(%rsp)
mov    -0x60(%rsp),%r8
mov    -0x58(%rsp),%rcx
mov    %ecx,%ebp
xor    %r12d,%r12d
jmp    1225 <_tram_direct_update_lagrangian_mult+0x125>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r12
add    $0x1,%ebp
add    -0x18(%rsp),%r8
cmp    %rax,%r12
je     11a0 <_tram_direct_update_lagrangian_mult+0xa0>
mov    -0x8(%rsp),%rcx
lea    (%r12,%rcx,1),%r15
movq   $0x0,(%r11,%r15,8)
mov    -0x10(%rsp),%rcx
cmpl   $0x0,(%rcx,%r15,4)
je     1210 <_tram_direct_update_lagrangian_mult+0x110>
test   %r9d,%r9d
jle    1210 <_tram_direct_update_lagrangian_mult+0x110>
xorpd  %xmm2,%xmm2
mov    %ebp,%r13d
xor    %ecx,%ecx
jmp    1286 <_tram_direct_update_lagrangian_mult+0x186>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm3,%xmm3
cvtsi2sd %r14d,%xmm3
addsd  %xmm3,%xmm2
movapd %xmm2,%xmm3
movsd  %xmm3,(%r11,%r15,8)
movapd %xmm3,%xmm2
add    $0x1,%rcx
add    %r9d,%r13d
cmp    %rcx,%rax
je     1210 <_tram_direct_update_lagrangian_mult+0x110>
mov    (%r8,%rcx,4),%r14d
cmp    %rcx,%r12
je     1260 <_tram_direct_update_lagrangian_mult+0x160>
movslq %r13d,%r10
add    (%rdx,%r10,4),%r14d
jle    127a <_tram_direct_update_lagrangian_mult+0x17a>
xorps  %xmm3,%xmm3
cvtsi2sd %r14d,%xmm3
movsd  (%rdi,%rcx,8),%xmm4
mov    -0x48(%rsp),%rsi
divsd  (%rsi,%r15,8),%xmm4
mov    -0x40(%rsp),%rsi
movsd  (%rsi,%r15,8),%xmm5
divsd  (%rbx,%rcx,8),%xmm5
mulsd  %xmm4,%xmm5
addsd  %xmm0,%xmm5
divsd  %xmm5,%xmm3
addsd  %xmm3,%xmm2
movsd  %xmm2,(%r11,%r15,8)
ucomisd %xmm2,%xmm1
movapd %xmm1,%xmm3
ja     1270 <_tram_direct_update_lagrangian_mult+0x170>
jmp    127a <_tram_direct_update_lagrangian_mult+0x17a>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @_tram_direct_update_lagrangian_mult(double* nocapture %0, double* nocapture %1, i32* nocapture %2, i32* nocapture %3, i32 %4, i32 %5, double* nocapture %6) {
%8 = icmp sgt i32 %4, 0
br i1 %8, label %9, label %82
9: ; preds = %7
%10 = icmp sgt i32 %5, 0
%11 = icmp slt i32 %5, 1
%12 = sext i32 %5 to i64
%13 = zext i32 %4 to i64
%14 = zext i32 %5 to i64
br label %15
15: ; preds = %9, %79
%16 = phi i64 [ 0, %9 ], [ %80, %79 ]
%17 = mul nsw i64 %16, %12
%18 = mul nsw i64 %17, %12
br i1 %10, label %19, label %79
19: ; preds = %15
%20 = trunc i64 %18 to i32
br label %21
21: ; preds = %19, %76
%22 = phi i64 [ 0, %19 ], [ %77, %76 ]
%23 = add nsw i64 %22, %17
%24 = getelementptr inbounds double, double* %6, i64 %23
store double 0.000000e+00, double* %24
%25 = getelementptr inbounds i32, i32* %3, i64 %23
%26 = load i32, i32* %25
%27 = icmp eq i32 %26, 0
%28 = or i1 %27, %11
br i1 %28, label %76, label %29
29: ; preds = %21
%30 = mul nsw i64 %22, %12
%31 = add nsw i64 %30, %18
%32 = trunc i64 %22 to i32
%33 = add i32 %32, %20
%34 = getelementptr inbounds double, double* %0, i64 %23
%35 = getelementptr inbounds double, double* %1, i64 %23
br label %36
36: ; preds = %29, %72
%37 = phi double [ 0.000000e+00, %29 ], [ %73, %72 ]
%38 = phi i64 [ 0, %29 ], [ %74, %72 ]
%39 = add nsw i64 %31, %38
%40 = getelementptr inbounds i32, i32* %2, i64 %39
%41 = load i32, i32* %40
%42 = icmp eq i64 %22, %38
br i1 %42, label %43, label %46
43: ; preds = %36
%44 = sitofp i32 %41 to double
%45 = fadd double %37, %44
br label %70
46: ; preds = %36
%47 = trunc i64 %38 to i32
%48 = mul i32 %47, %5
%49 = add i32 %33, %48
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i32, i32* %2, i64 %50
%52 = load i32, i32* %51
%53 = add nsw i32 %52, %41
%54 = icmp sgt i32 %53, 0
br i1 %54, label %55, label %72
55: ; preds = %46
%56 = add nsw i64 %38, %17
%57 = sitofp i32 %53 to double
%58 = getelementptr inbounds double, double* %0, i64 %56
%59 = load double, double* %58
%60 = load double, double* %34
%61 = fdiv double %59, %60
%62 = load double, double* %35
%63 = getelementptr inbounds double, double* %1, i64 %56
%64 = load double, double* %63
%65 = fdiv double %62, %64
%66 = tail call double @llvm.fmuladd.f64(double %61, double %65, double 1.000000e+00)
%67 = fdiv double %57, %66
%68 = fadd double %37, %67
store double %68, double* %24
%69 = fcmp olt double %68, 1.000000e-100
br i1 %69, label %70, label %72
70: ; preds = %55, %43
%71 = phi double [ %45, %43 ], [ 1.000000e-100, %55 ]
store double %71, double* %24
br label %72
72: ; preds = %70, %55, %46
%73 = phi double [ %68, %55 ], [ %37, %46 ], [ %71, %70 ]
%74 = add nuw nsw i64 %38, 1
%75 = icmp eq i64 %74, %14
br i1 %75, label %76, label %36
76: ; preds = %72, %21
%77 = add nuw nsw i64 %22, 1
%78 = icmp eq i64 %77, %14
br i1 %78, label %79, label %21
79: ; preds = %76, %15
%80 = add nuw nsw i64 %16, 1
%81 = icmp eq i64 %80, %13
br i1 %81, label %82, label %15
82: ; preds = %79, %7
ret void
}