#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef double ldfP4_0;

/* Variables and functions */
double ldf_Gam(int, double, double, int);
scalar_t__ ldf_Mult(int, int, double *, int, int);
double compute_log_posterior(int D, int K, int **M, int *N, int V, double alpha,
                             double **beta, double eta, double **theta,
                             double **theta_train, int *entity_map, int ***w,
                             int ***z) {
  double ldfP4_0;
  double ldfP4_1;
  double ldfP4_2;
  int m_22;
  int n_16;
  int d_10;
  double ldfP5_0;
  double ldfP5_1;
  double ldfP5_2;
  int m_23;
  int n_17;
  int d_11;
  ldfP4_0 = 0.0;
  for (d_10 = 1; d_10 <= D; d_10++) {
    ldfP4_1 = 0.0;
    for (n_16 = 1; n_16 <= N[d_10 - 1]; n_16++) {
      ldfP4_2 = 0.0;
      for (m_22 = 1; m_22 <= M[d_10 - 1][n_16 - 1]; m_22++) {
        if (entity_map[d_10 - 1] == -1) {
          ldfP4_2 += ldf_Mult(1, z[d_10 - 1][n_16 - 1][m_22 - 1],
                              theta[d_10 - 1], 1, K);
        } else {
          ldfP4_2 += ldf_Mult(1, z[d_10 - 1][n_16 - 1][m_22 - 1],
                              theta_train[entity_map[d_10 - 1]], 1, K);
        }
      }
      ldfP4_1 += ldfP4_2;
    }
    ldfP4_0 += ldfP4_1;
  }
  ldfP5_0 = 0.0;
  for (d_11 = 1; d_11 <= D; d_11++) {
    ldfP5_1 = 0.0;
    for (n_17 = 1; n_17 <= N[d_11 - 1]; n_17++) {
      ldfP5_2 = 0.0;
      for (m_23 = 1; m_23 <= M[d_11 - 1][n_17 - 1]; m_23++) {
        ldfP5_2 += ldf_Mult(1, w[d_11 - 1][n_17 - 1][m_23 - 1],
                            beta[z[d_11 - 1][n_17 - 1][m_23 - 1] - 1], 1, V);
      }
      ldfP5_1 += ldfP5_2;
    }
    ldfP5_0 += ldfP5_1;
  }
  return ((ldf_Gam(1, alpha, 0.1, 1)) +
          ((ldf_Gam(1, eta, 0.1, 1)) +
           ((0.0) + ((0.0) + ((ldfP4_0) + (ldfP5_0))))));
}


x86 assembly (clang, -O0):
<compute_log_posterior>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm1,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x1,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     12fc <compute_log_posterior+0x1dc>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x1,-0x58(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x18(%rbp),%rcx
mov    -0x5c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jg     12df <compute_log_posterior+0x1bf>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x1,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x5c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,8),%rcx
mov    -0x58(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jg     12c2 <compute_log_posterior+0x1a2>
mov    0x20(%rbp),%rax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0xffffffff,(%rax,%rcx,4)
jne    124d <compute_log_posterior+0x12d>
mov    0x30(%rbp),%rax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x58(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%esi
mov    0x10(%rbp),%rax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%r8d
mov    $0x1,%ecx
mov    %ecx,%edi
call   1040 <ldf_Mult@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    12af <compute_log_posterior+0x18f>
mov    0x30(%rbp),%rax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x58(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%esi
mov    0x18(%rbp),%rax
mov    0x20(%rbp),%rcx
mov    -0x5c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movslq (%rcx,%rdx,4),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%r8d
mov    $0x1,%ecx
mov    %ecx,%edi
call   1040 <ldf_Mult@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    12b4 <compute_log_posterior+0x194>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11b1 <compute_log_posterior+0x91>
movsd  -0x50(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1189 <compute_log_posterior+0x69>
movsd  -0x48(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    116e <compute_log_posterior+0x4e>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x1,-0x84(%rbp)
mov    -0x84(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1455 <compute_log_posterior+0x335>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x1,-0x80(%rbp)
mov    -0x80(%rbp),%eax
mov    -0x18(%rbp),%rcx
mov    -0x84(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jg     1432 <compute_log_posterior+0x312>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x1,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    -0x84(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,8),%rcx
mov    -0x80(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
jg     1415 <compute_log_posterior+0x2f5>
mov    0x28(%rbp),%rax
mov    -0x84(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x80(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x7c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%esi
mov    -0x30(%rbp),%rax
mov    0x30(%rbp),%rcx
mov    -0x84(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,8),%rcx
mov    -0x80(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,8),%rcx
mov    -0x7c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,4),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x1c(%rbp),%r8d
mov    $0x1,%ecx
mov    %ecx,%edi
call   1040 <ldf_Mult@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
jmp    1357 <compute_log_posterior+0x237>
movsd  -0x78(%rbp),%xmm0
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x80(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x80(%rbp)
jmp    132c <compute_log_posterior+0x20c>
movsd  -0x70(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    130e <compute_log_posterior+0x1ee>
movsd  -0x28(%rbp),%xmm0
mov    $0x1,%esi
movsd  0xb99(%rip),%xmm1
mov    %esi,%edi
call   1030 <ldf_Gam@plt>
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
mov    $0x1,%esi
movsd  0xb78(%rip),%xmm1
mov    %esi,%edi
call   1030 <ldf_Gam@plt>
movaps %xmm0,%xmm1
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0x40(%rbp),%xmm2
addsd  -0x68(%rbp),%xmm2
xorps  %xmm3,%xmm3
addsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
addsd  %xmm3,%xmm2
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<compute_log_posterior>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
movsd  %xmm1,0x60(%rsp)
movsd  %xmm0,0x58(%rsp)
mov    %rcx,0x18(%rsp)
mov    %rdx,0x30(%rsp)
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
test   %edi,%edi
jle    1402 <compute_log_posterior+0x2e2>
mov    %esi,%r12d
mov    %r8d,0x3c(%rsp)
mov    %r9,0x48(%rsp)
mov    0xc0(%rsp),%r8
mov    0xb8(%rsp),%rdx
mov    0xb0(%rsp),%rbp
mov    0xa8(%rsp),%r15
mov    %rdi,0x50(%rsp)
lea    0x1(%rdi),%eax
mov    %rax,0x40(%rsp)
xorpd  %xmm0,%xmm0
mov    $0x1,%r11d
jmp    11b3 <compute_log_posterior+0x93>
nopw   0x0(%rax,%rax,1)
addsd  %xmm1,%xmm0
add    $0x1,%r11
cmp    0x40(%rsp),%r11
je     12c9 <compute_log_posterior+0x1a9>
mov    0x18(%rsp),%rax
mov    -0x4(%rax,%r11,4),%ecx
xorpd  %xmm1,%xmm1
test   %ecx,%ecx
jle    11a0 <compute_log_posterior+0x80>
lea    -0x1(%r11),%rax
mov    0xa0(%rsp),%rsi
lea    (%rsi,%rax,8),%rdi
mov    0x30(%rsp),%rax
mov    -0x8(%rax,%r11,8),%rax
xorpd  %xmm1,%xmm1
mov    $0x1,%r13d
movsd  %xmm0,0x8(%rsp)
mov    %rdi,0x28(%rsp)
jmp    1213 <compute_log_posterior+0xf3>
cs nopw 0x0(%rax,%rax,1)
addsd  %xmm2,%xmm1
lea    0x1(%r13),%rbx
movslq %ecx,%rsi
cmp    %rsi,%r13
mov    %rbx,%r13
jge    11a0 <compute_log_posterior+0x80>
cmpl   $0x0,-0x4(%rax,%r13,4)
xorpd  %xmm2,%xmm2
jle    1200 <compute_log_posterior+0xe0>
movsd  %xmm1,0x20(%rsp)
xorpd  %xmm2,%xmm2
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movsd  %xmm2,0x10(%rsp)
movslq -0x4(%rbp,%r11,4),%rax
cmp    $0xffffffffffffffff,%rax
mov    -0x8(%r8,%r11,8),%rcx
mov    -0x8(%rcx,%r13,8),%rcx
mov    (%rcx,%rbx,4),%esi
lea    (%r15,%rax,8),%rax
cmove  %rdi,%rax
mov    (%rax),%rdx
mov    $0x1,%edi
mov    $0x1,%ecx
mov    %r12d,%r8d
mov    %r11,%r14
call   1040 <ldf_Mult@plt>
movsd  0x10(%rsp),%xmm2
mov    %r14,%r11
mov    0xc0(%rsp),%r8
mov    0x28(%rsp),%rdi
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  %xmm0,%xmm2
mov    0x30(%rsp),%rax
mov    -0x8(%rax,%r14,8),%rax
movslq -0x4(%rax,%r13,4),%rcx
add    $0x1,%rbx
cmp    %rcx,%rbx
jl     1230 <compute_log_posterior+0x110>
mov    0x18(%rsp),%rcx
mov    -0x4(%rcx,%r11,4),%ecx
movsd  0x8(%rsp),%xmm0
mov    0xb8(%rsp),%rdx
movsd  0x20(%rsp),%xmm1
jmp    1200 <compute_log_posterior+0xe0>
cmpl   $0x0,0x50(%rsp)
jle    13fe <compute_log_posterior+0x2de>
xorpd  %xmm1,%xmm1
mov    $0x1,%r14d
mov    0x48(%rsp),%r12
mov    0x3c(%rsp),%r13d
mov    0x30(%rsp),%r15
jmp    1303 <compute_log_posterior+0x1e3>
nop
addsd  %xmm2,%xmm1
add    $0x1,%r14
cmp    0x40(%rsp),%r14
je     1402 <compute_log_posterior+0x2e2>
mov    0x18(%rsp),%rax
mov    -0x4(%rax,%r14,4),%ecx
xorpd  %xmm2,%xmm2
test   %ecx,%ecx
jle    12f0 <compute_log_posterior+0x1d0>
mov    -0x8(%r15,%r14,8),%rax
xorpd  %xmm2,%xmm2
mov    $0x1,%ebx
movsd  %xmm0,0x8(%rsp)
movsd  %xmm1,0x20(%rsp)
jmp    1353 <compute_log_posterior+0x233>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
addsd  %xmm3,%xmm2
lea    0x1(%rbx),%rbp
movslq %ecx,%rsi
cmp    %rsi,%rbx
mov    %rbp,%rbx
jge    12f0 <compute_log_posterior+0x1d0>
cmpl   $0x0,-0x4(%rax,%rbx,4)
xorpd  %xmm3,%xmm3
jle    1340 <compute_log_posterior+0x220>
movsd  %xmm2,0x28(%rsp)
xorpd  %xmm3,%xmm3
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
movsd  %xmm3,0x10(%rsp)
mov    -0x8(%rdx,%r14,8),%rax
mov    -0x8(%rax,%rbx,8),%rax
mov    (%rax,%rbp,4),%esi
mov    -0x8(%r8,%r14,8),%rax
mov    -0x8(%rax,%rbx,8),%rax
movslq (%rax,%rbp,4),%rax
mov    -0x8(%r12,%rax,8),%rdx
mov    $0x1,%edi
mov    $0x1,%ecx
mov    %r13d,%r8d
call   1040 <ldf_Mult@plt>
movsd  0x10(%rsp),%xmm3
mov    0xb8(%rsp),%rdx
mov    0xc0(%rsp),%r8
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  %xmm0,%xmm3
mov    -0x8(%r15,%r14,8),%rax
movslq -0x4(%rax,%rbx,4),%rcx
add    $0x1,%rbp
cmp    %rcx,%rbp
jl     1370 <compute_log_posterior+0x250>
mov    0x18(%rsp),%rcx
mov    -0x4(%rcx,%r14,4),%ecx
movsd  0x8(%rsp),%xmm0
movsd  0x20(%rsp),%xmm1
movsd  0x28(%rsp),%xmm2
jmp    1340 <compute_log_posterior+0x220>
xorpd  %xmm1,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0xbec(%rip),%xmm1
mov    $0x1,%edi
movsd  0x58(%rsp),%xmm0
mov    $0x1,%esi
call   1030 <ldf_Gam@plt>
movsd  %xmm0,0x10(%rsp)
mov    $0x1,%edi
movsd  0x60(%rsp),%xmm0
movsd  0xbbe(%rip),%xmm1
mov    $0x1,%esi
call   1030 <ldf_Gam@plt>
movsd  0x8(%rsp),%xmm1
addsd  0xbae(%rip),%xmm1
addsd  %xmm1,%xmm0
addsd  0x10(%rsp),%xmm0
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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