#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 */

/* Variables and functions */
int /*<<< orphan*/ free(double *);
int /*<<< orphan*/ mPower(double *, int, double *, int *, int, int);
scalar_t__ malloc(int);
double pow(int, double);
double DurbinMatrix(int n, double d) {
  int k, m, i, j, g, eH, eQ;
  double h, s, *H, *Q;
  k = (int)(n * d) + 1;
  m = 2 * k - 1;
  h = k - n * d;
  H = (double *)malloc((m * m) * sizeof(double));
  Q = (double *)malloc((m * m) * sizeof(double));
  for (i = 0; i < m; i++)
    for (j = 0; j < m; j++)
      if (i - j + 1 < 0)
        H[i * m + j] = 0;
      else
        H[i * m + j] = 1;
  for (i = 0; i < m; i++) {
    H[i * m] -= pow(h, (double)(i + 1));
    H[(m - 1) * m + i] -= pow(h, (double)(m - i));
  }
  H[(m - 1) * m] += (2 * h - 1 > 0 ? pow(2 * h - 1, (double)m) : 0);
  for (i = 0; i < m; i++)
    for (j = 0; j < m; j++)
      if (i - j + 1 > 0)
        for (g = 1; g <= i - j + 1; g++)
          H[i * m + j] /= g;
  eH = 0;
  mPower(H, eH, Q, &eQ, m, n);
  s = Q[(k - 1) * m + k - 1];
  for (i = 1; i <= n; i++) {
    s = s * (double)i / n;
    if (s < 1.0e-140) {
      s *= 1.0e140;
      eQ -= 140;
    }
  }
  s *= pow(10., (double)eQ);
  free(H);
  free(Q);
  return s;
}


x86 assembly (clang, -O0):
<DurbinMatrix>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
cvttsd2si %xmm0,%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm1
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%eax
imul   -0x18(%rbp),%eax
cltq
shl    $0x3,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%eax
imul   -0x18(%rbp),%eax
cltq
shl    $0x3,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    126d <DurbinMatrix+0x12d>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    125a <DurbinMatrix+0x11a>
mov    -0x1c(%rbp),%eax
sub    -0x20(%rbp),%eax
add    $0x1,%eax
cmp    $0x0,%eax
jge    1229 <DurbinMatrix+0xe9>
mov    -0x48(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    1247 <DurbinMatrix+0x107>
mov    -0x48(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xdd6(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    124c <DurbinMatrix+0x10c>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11ed <DurbinMatrix+0xad>
jmp    125f <DurbinMatrix+0x11f>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11da <DurbinMatrix+0x9a>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    12fa <DurbinMatrix+0x1ba>
cvttsd2si -0x38(%rbp),%edi
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm0
call   1060 <pow@plt>
movaps %xmm0,%xmm1
mov    -0x48(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
cvttsd2si -0x38(%rbp),%edi
mov    -0x18(%rbp),%eax
sub    -0x1c(%rbp),%eax
cvtsi2sd %eax,%xmm0
call   1060 <pow@plt>
movaps %xmm0,%xmm1
mov    -0x48(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1274 <DurbinMatrix+0x134>
movsd  -0x38(%rbp),%xmm0
addsd  %xmm0,%xmm0
movsd  0xcf5(%rip),%xmm1
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1349 <DurbinMatrix+0x209>
movsd  -0x38(%rbp),%xmm0
addsd  %xmm0,%xmm0
movsd  0xcd3(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
cvtsi2sdl -0x18(%rbp),%xmm0
call   1060 <pow@plt>
movsd  %xmm0,-0x58(%rbp)
jmp    1356 <DurbinMatrix+0x216>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1356 <DurbinMatrix+0x216>
movsd  -0x58(%rbp),%xmm0
mov    -0x48(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1426 <DurbinMatrix+0x2e6>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1413 <DurbinMatrix+0x2d3>
mov    -0x1c(%rbp),%eax
sub    -0x20(%rbp),%eax
add    $0x1,%eax
cmp    $0x0,%eax
jle    1400 <DurbinMatrix+0x2c0>
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     13fb <DurbinMatrix+0x2bb>
cvtsi2sdl -0x24(%rbp),%xmm1
mov    -0x48(%rbp),%rax
mov    -0x1c(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13b5 <DurbinMatrix+0x275>
jmp    1400 <DurbinMatrix+0x2c0>
jmp    1405 <DurbinMatrix+0x2c5>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1390 <DurbinMatrix+0x250>
jmp    1418 <DurbinMatrix+0x2d8>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    137d <DurbinMatrix+0x23d>
movl   $0x0,-0x28(%rbp)
mov    -0x48(%rbp),%rdi
mov    -0x28(%rbp),%esi
mov    -0x50(%rbp),%rdx
mov    -0x18(%rbp),%r8d
mov    -0x4(%rbp),%r9d
lea    -0x2c(%rbp),%rcx
call   1050 <mPower@plt>
mov    -0x50(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     14dc <DurbinMatrix+0x39c>
movsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x4(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xb67(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    14c9 <DurbinMatrix+0x389>
movsd  0xb5c(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x8c,%eax
mov    %eax,-0x2c(%rbp)
jmp    14ce <DurbinMatrix+0x38e>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1471 <DurbinMatrix+0x331>
cvtsi2sdl -0x2c(%rbp),%xmm0
mov    $0xa,%edi
call   1060 <pow@plt>
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
movsd  -0x40(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<DurbinMatrix>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %edi,0x18(%rsp)
cvtsi2sd %edi,%xmm1
movsd  %xmm1,0x20(%rsp)
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ebx
lea    0x1(%rbx),%eax
lea    0x2(%rbx,%rbx,1),%ecx
mov    %rcx,0x10(%rsp)
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
lea    0x1(%rbx,%rbx,1),%r14d
subsd  %xmm0,%xmm1
movsd  %xmm1,0x28(%rsp)
mov    %r14d,%ebp
imul   %r14d,%ebp
shl    $0x3,%ebp
mov    %ebp,%edi
call   1040 <malloc@plt>
mov    %rax,%r15
mov    %ebp,%edi
call   1040 <malloc@plt>
mov    %rax,0x40(%rsp)
mov    %r14d,(%rsp)
movslq %r14d,%rax
mov    %rax,0x30(%rsp)
mov    %rbx,0x38(%rsp)
test   %ebx,%ebx
js     134a <DurbinMatrix+0x20a>
mov    0x30(%rsp),%r11
cmp    $0x2,%r11d
mov    $0x1,%r8d
cmovge (%rsp),%r8d
lea    -0x1(%r8),%rcx
lea    0x8(%r15),%rdx
lea    0x0(,%r11,8),%r14
mov    $0xffffffffffffffff,%r9
xor    %edi,%edi
movsd  0xe0c(%rip),%xmm0
mov    0x38(%rsp),%r10
jmp    1216 <DurbinMatrix+0xd6>
nopl   0x0(%rax,%rax,1)
movsd  %xmm1,(%r15,%rbp,8)
add    $0x1,%rdi
add    $0x1,%r9
add    %r14,%rdx
cmp    %r8,%rdi
je     1292 <DurbinMatrix+0x152>
mov    %rdi,%rbp
imul   %r11,%rbp
test   %r10d,%r10d
jle    1270 <DurbinMatrix+0x130>
mov    %r9,%rsi
xor    %eax,%eax
jmp    1242 <DurbinMatrix+0x102>
nopl   0x0(%rax)
movsd  %xmm1,(%rdx,%rax,8)
add    $0x2,%rax
add    $0xfffffffffffffffe,%rsi
cmp    %rax,%rcx
je     1272 <DurbinMatrix+0x132>
lea    0x1(%rsi),%rbx
xorpd  %xmm1,%xmm1
xorpd  %xmm2,%xmm2
cmp    $0xffffffffffffffff,%rbx
jl     1258 <DurbinMatrix+0x118>
movapd %xmm0,%xmm2
movsd  %xmm2,-0x8(%rdx,%rax,8)
cmp    $0xffffffffffffffff,%rsi
jl     1230 <DurbinMatrix+0xf0>
movapd %xmm0,%xmm1
jmp    1230 <DurbinMatrix+0xf0>
nopw   0x0(%rax,%rax,1)
xor    %eax,%eax
mov    %rdi,%rsi
sub    %rax,%rsi
add    %rax,%rbp
xorpd  %xmm1,%xmm1
cmp    $0xffffffffffffffff,%rsi
jl     1200 <DurbinMatrix+0xc0>
movapd %xmm0,%xmm1
jmp    1200 <DurbinMatrix+0xc0>
test   %r10d,%r10d
js     134a <DurbinMatrix+0x20a>
mov    %r14,%rcx
cvttsd2si 0x28(%rsp),%eax
mov    %eax,0x1c(%rsp)
mov    0x10(%rsp),%rax
add    $0xfffffffe,%eax
mov    (%rsp),%r12d
imul   %r12d,%eax
cltq
cmp    $0x2,%r12d
mov    $0x1,%edx
cmovge %r12d,%edx
mov    %rdx,0x50(%rsp)
lea    (%r15,%rax,8),%rax
mov    %rax,0x48(%rsp)
xor    %r14d,%r14d
mov    %r15,%rbx
mov    %rcx,0x8(%rsp)
mov    0x1c(%rsp),%r13d
cs nopw 0x0(%rax,%rax,1)
nop
lea    0x1(%r14),%rbp
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
mov    %r13d,%edi
call   1060 <pow@plt>
movsd  (%rbx),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rbx)
xorps  %xmm0,%xmm0
cvtsi2sd %r12d,%xmm0
mov    %r13d,%edi
call   1060 <pow@plt>
mov    0x8(%rsp),%rcx
mov    0x48(%rsp),%rax
movsd  (%rax,%r14,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%r14,8)
add    $0xffffffff,%r12d
add    %rcx,%rbx
mov    %rbp,%r14
cmp    %rbp,0x50(%rsp)
jne    12f0 <DurbinMatrix+0x1b0>
movsd  0x28(%rsp),%xmm1
addsd  %xmm1,%xmm1
addsd  0xcac(%rip),%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jbe    1377 <DurbinMatrix+0x237>
cvttsd2si %xmm1,%edi
xorps  %xmm0,%xmm0
cvtsi2sdl (%rsp),%xmm0
call   1060 <pow@plt>
mov    0x10(%rsp),%rax
add    $0xfffffffe,%eax
imul   (%rsp),%eax
cltq
addsd  (%r15,%rax,8),%xmm0
movsd  %xmm0,(%r15,%rax,8)
mov    0x38(%rsp),%r13
test   %r13d,%r13d
mov    0x40(%rsp),%r14
mov    0x18(%rsp),%r12d
mov    0x30(%rsp),%r8
js     1439 <DurbinMatrix+0x2f9>
mov    (%rsp),%ecx
cmp    $0x2,%ecx
mov    $0x1,%eax
cmovge %ecx,%eax
xor    %ecx,%ecx
movsd  0xc3a(%rip),%xmm0
jmp    13d9 <DurbinMatrix+0x299>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rcx
cmp    %rax,%rcx
je     1439 <DurbinMatrix+0x2f9>
mov    %rcx,%rdx
imul   %r8,%rdx
xor    %esi,%esi
jmp    13f9 <DurbinMatrix+0x2b9>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rsi
cmp    %rax,%rsi
je     13d0 <DurbinMatrix+0x290>
mov    %rcx,%rdi
sub    %rsi,%rdi
js     13f0 <DurbinMatrix+0x2b0>
lea    (%rsi,%rdx,1),%rbp
movsd  (%r15,%rbp,8),%xmm1
xor    %ebx,%ebx
movapd %xmm0,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
divsd  %xmm2,%xmm1
addsd  %xmm0,%xmm2
add    $0x1,%rbx
cmp    %rbx,%rdi
jge    1420 <DurbinMatrix+0x2e0>
movsd  %xmm1,(%r15,%rbp,8)
jmp    13f0 <DurbinMatrix+0x2b0>
lea    0x4(%rsp),%rcx
mov    %r15,%rdi
xor    %esi,%esi
mov    %r14,%rdx
mov    (%rsp),%r8d
mov    %r12d,%r9d
call   1050 <mPower@plt>
mov    0x10(%rsp),%rax
imul   %r13d,%eax
cltq
movsd  (%r14,%rax,8),%xmm4
mov    0x4(%rsp),%eax
test   %r12d,%r12d
jle    1561 <DurbinMatrix+0x421>
cmp    $0x1,%r12d
jne    1493 <DurbinMatrix+0x353>
movsd  0xb82(%rip),%xmm0
movsd  0x20(%rsp),%xmm5
test   $0x1,%r12b
jne    153a <DurbinMatrix+0x3fa>
jmp    1561 <DurbinMatrix+0x421>
mov    %r12d,%ecx
and    $0xfffffffe,%ecx
mov    $0x1,%edi
movsd  0xb6a(%rip),%xmm0
movsd  0xb6a(%rip),%xmm1
movsd  0x20(%rsp),%xmm5
jmp    14cb <DurbinMatrix+0x38b>
cs nopw 0x0(%rax,%rax,1)
mov    %eax,0x4(%rsp)
lea    0x1(%rsi),%edi
cmp    %ecx,%esi
je     152a <DurbinMatrix+0x3ea>
mov    %edi,%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edi,%xmm2
mulsd  %xmm4,%xmm2
divsd  %xmm5,%xmm2
ucomisd %xmm2,%xmm0
lea    -0x8c(%rax),%edi
cmovbe %eax,%edi
movapd %xmm2,%xmm4
jbe    14f3 <DurbinMatrix+0x3b3>
mulsd  %xmm1,%xmm4
lea    0x1(%rdx),%esi
xorps  %xmm3,%xmm3
cvtsi2sd %esi,%xmm3
mulsd  %xmm4,%xmm3
divsd  %xmm5,%xmm3
ucomisd %xmm3,%xmm0
lea    -0x8c(%rdi),%eax
cmovbe %edi,%eax
movapd %xmm3,%xmm4
jbe    151c <DurbinMatrix+0x3dc>
mulsd  %xmm1,%xmm4
ucomisd %xmm2,%xmm0
ja     14c0 <DurbinMatrix+0x380>
ucomisd %xmm3,%xmm0
jbe    14c4 <DurbinMatrix+0x384>
jmp    14c0 <DurbinMatrix+0x380>
add    $0x2,%edx
xorps  %xmm0,%xmm0
cvtsi2sd %edx,%xmm0
test   $0x1,%r12b
je     1561 <DurbinMatrix+0x421>
mulsd  %xmm0,%xmm4
divsd  %xmm5,%xmm4
movsd  0xac6(%rip),%xmm0
ucomisd %xmm4,%xmm0
jbe    1561 <DurbinMatrix+0x421>
mulsd  0xac0(%rip),%xmm4
add    $0xffffff74,%eax
mov    %eax,0x4(%rsp)
movsd  %xmm4,0x8(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mov    $0xa,%edi
call   1060 <pow@plt>
mulsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
mov    %r15,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
call   1030 <free@plt>
movsd  0x8(%rsp),%xmm0
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define double @DurbinMatrix(i32 %0, double %1) {
%3 = alloca i32
%4 = bitcast i32* %3 to i8*
%5 = sitofp i32 %0 to double
%6 = fmul double %5, %1
%7 = fptosi double %6 to i32
%8 = add nsw i32 %7, 1
%9 = shl nsw i32 %8, 1
%10 = add nsw i32 %9, -1
%11 = sitofp i32 %8 to double
%12 = fneg double %5
%13 = tail call double @llvm.fmuladd.f64(double %12, double %1, double %11)
%14 = shl i32 %10, 3
%15 = mul i32 %14, %10
%16 = tail call i64 @malloc(i32 %15)
%17 = inttoptr i64 %16 to double*
%18 = tail call i64 @malloc(i32 %15)
%19 = inttoptr i64 %18 to double*
%20 = icmp sgt i32 %7, -1
br i1 %20, label %21, label %84
21: ; preds = %2
%22 = call i32 @llvm.smax.i32(i32 %10, i32 1)
%23 = sext i32 %10 to i64
%24 = zext i32 %22 to i64
%25 = icmp slt i32 %7, 1
%26 = add nsw i64 %24, -1
br label %27
27: ; preds = %56, %21
%28 = phi i64 [ 0, %21 ], [ %63, %56 ]
%29 = mul nsw i64 %28, %23
br i1 %25, label %56, label %39
30: ; preds = %56
br i1 %20, label %31, label %84
31: ; preds = %30
%32 = fptosi double %13 to i32
%33 = add nsw i32 %9, -2
%34 = mul nsw i32 %33, %10
%35 = sext i32 %10 to i64
%36 = sext i32 %34 to i64
%37 = call i32 @llvm.smax.i32(i32 %10, i32 1)
%38 = zext i32 %37 to i64
br label %65
39: ; preds = %27, %39
%40 = phi i64 [ %53, %39 ], [ 0, %27 ]
%41 = phi i64 [ %54, %39 ], [ 0, %27 ]
%42 = sub nsw i64 %28, %40
%43 = icmp slt i64 %42, -1
%44 = add nsw i64 %40, %29
%45 = getelementptr inbounds double, double* %17, i64 %44
%46 = select i1 %43, double 0.000000e+00, double 1.000000e+00
store double %46, double* %45
%47 = or i64 %40, 1
%48 = sub nsw i64 %28, %47
%49 = icmp slt i64 %48, -1
%50 = add nsw i64 %47, %29
%51 = getelementptr inbounds double, double* %17, i64 %50
%52 = select i1 %49, double 0.000000e+00, double 1.000000e+00
store double %52, double* %51
%53 = add nuw nsw i64 %40, 2
%54 = add i64 %41, 2
%55 = icmp eq i64 %54, %26
br i1 %55, label %56, label %39
56: ; preds = %39, %27
%57 = phi i64 [ 0, %27 ], [ %53, %39 ]
%58 = sub nsw i64 %28, %57
%59 = icmp slt i64 %58, -1
%60 = add nsw i64 %57, %29
%61 = getelementptr inbounds double, double* %17, i64 %60
%62 = select i1 %59, double 0.000000e+00, double 1.000000e+00
store double %62, double* %61
%63 = add nuw nsw i64 %28, 1
%64 = icmp eq i64 %63, %24
br i1 %64, label %30, label %27
65: ; preds = %31, %65
%66 = phi i64 [ 0, %31 ], [ %67, %65 ]
%67 = add nuw nsw i64 %66, 1
%68 = trunc i64 %67 to i32
%69 = sitofp i32 %68 to double
%70 = tail call double @pow(i32 %32, double %69)
%71 = mul nsw i64 %66, %35
%72 = getelementptr inbounds double, double* %17, i64 %71
%73 = load double, double* %72
%74 = fsub double %73, %70
store double %74, double* %72
%75 = trunc i64 %66 to i32
%76 = sub i32 %10, %75
%77 = sitofp i32 %76 to double
%78 = tail call double @pow(i32 %32, double %77)
%79 = add nsw i64 %66, %36
%80 = getelementptr inbounds double, double* %17, i64 %79
%81 = load double, double* %80
%82 = fsub double %81, %78
store double %82, double* %80
%83 = icmp eq i64 %67, %38
br i1 %83, label %84, label %65
84: ; preds = %65, %2, %30
%85 = tail call double @llvm.fmuladd.f64(double %13, double 2.000000e+00, double -1.000000e+00)
%86 = fcmp ogt double %85, 0.000000e+00
br i1 %86, label %87, label %91
87: ; preds = %84
%88 = fptosi double %85 to i32
%89 = sitofp i32 %10 to double
%90 = tail call double @pow(i32 %88, double %89)
br label %91
91: ; preds = %84, %87
%92 = phi double [ %90, %87 ], [ 0.000000e+00, %84 ]
%93 = add nsw i32 %9, -2
%94 = mul nsw i32 %93, %10
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds double, double* %17, i64 %95
%97 = load double, double* %96
%98 = fadd double %92, %97
store double %98, double* %96
br i1 %20, label %99, label %129
99: ; preds = %91
%100 = call i32 @llvm.smax.i32(i32 %10, i32 1)
%101 = sext i32 %10 to i64
%102 = zext i32 %100 to i64
br label %103
103: ; preds = %126, %99
%104 = phi i64 [ 0, %99 ], [ %127, %126 ]
%105 = mul nsw i64 %104, %101
br label %106
106: ; preds = %103, %123
%107 = phi i64 [ 0, %103 ], [ %124, %123 ]
%108 = sub nsw i64 %104, %107
%109 = icmp slt i64 %108, 0
br i1 %109, label %123, label %110
110: ; preds = %106
%111 = add nsw i64 %107, %105
%112 = getelementptr inbounds double, double* %17, i64 %111
%113 = load double, double* %112
br label %114
114: ; preds = %110, %114
%115 = phi double [ %113, %110 ], [ %118, %114 ]
%116 = phi i32 [ 1, %110 ], [ %119, %114 ]
%117 = sitofp i32 %116 to double
%118 = fdiv double %115, %117
%119 = add nuw nsw i32 %116, 1
%120 = zext i32 %116 to i64
%121 = icmp slt i64 %108, %120
br i1 %121, label %122, label %114
122: ; preds = %114
store double %118, double* %112
br label %123
123: ; preds = %122, %106
%124 = add nuw nsw i64 %107, 1
%125 = icmp eq i64 %124, %102
br i1 %125, label %126, label %106
126: ; preds = %123
%127 = add nuw nsw i64 %104, 1
%128 = icmp eq i64 %127, %102
br i1 %128, label %129, label %103
129: ; preds = %126, %91
%130 = call i32 @mPower(double* %17, i32 0, double* %19, i32* %3, i32 %10, i32 %0)
%131 = mul i32 %9, %7
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds double, double* %19, i64 %132
%134 = load double, double* %133
%135 = load i32, i32* %3
%136 = icmp slt i32 %0, 1
br i1 %136, label %190, label %137
137: ; preds = %129
%138 = and i32 %0, 1
%139 = icmp eq i32 %0, 1
br i1 %139, label %176, label %140
140: ; preds = %137
%141 = and i32 %0, -2
br label %142
142: ; preds = %170, %140
%143 = phi i32 [ 1, %140 ], [ %171, %170 ]
%144 = phi double [ %134, %140 ], [ %163, %170 ]
%145 = phi i32 [ %135, %140 ], [ %162, %170 ]
%146 = phi i32 [ 0, %140 ], [ %172, %170 ]
%147 = sitofp i32 %143 to double
%148 = fmul double %144, %147
%149 = fdiv double %148, %5
%150 = fcmp olt double %149, 0x22DE7C5F127BD87E
%151 = fmul double %149, 1.000000e+140
%152 = add nsw i32 %145, -140
%153 = select i1 %150, i32 %152, i32 %145
%154 = select i1 %150, double %151, double %149
%155 = add nuw i32 %143, 1
%156 = sitofp i32 %155 to double
%157 = fmul double %154, %156
%158 = fdiv double %157, %5
%159 = fcmp olt double %158, 0x22DE7C5F127BD87E
%160 = fmul double %158, 1.000000e+140
%161 = add nsw i32 %153, -140
%162 = select i1 %159, i32 %161, i32 %153
%163 = select i1 %159, double %160, double %158
%164 = xor i1 %150, true
%165 = xor i1 %159, true
%166 = xor i1 %164, true
%167 = xor i1 %165, true
%168 = or i1 %166, %167
br i1 %168, label %169, label %170
169: ; preds = %142
store i32 %162, i32* %3
br label %170
170: ; preds = %142, %169
%171 = add nuw i32 %143, 2
%172 = add i32 %146, 2
%173 = icmp eq i32 %172, %141
br i1 %173, label %174, label %142
174: ; preds = %170
%175 = sitofp i32 %171 to double
br label %176
176: ; preds = %174, %137
%177 = phi i32 [ undef, %137 ], [ %162, %174 ]
%178 = phi double [ undef, %137 ], [ %163, %174 ]
%179 = phi double [ 1.000000e+00, %137 ], [ %175, %174 ]
%180 = phi double [ %134, %137 ], [ %163, %174 ]
%181 = phi i32 [ %135, %137 ], [ %162, %174 ]
%182 = icmp eq i32 %138, 0
br i1 %182, label %190, label %183
183: ; preds = %176
%184 = fmul double %180, %179
%185 = fdiv double %184, %5
%186 = fcmp olt double %185, 0x22DE7C5F127BD87E
br i1 %186, label %187, label %190
187: ; preds = %183
%188 = fmul double %185, 1.000000e+140
%189 = add nsw i32 %181, -140
store i32 %189, i32* %3
br label %190
190: ; preds = %176, %187, %183, %129
%191 = phi i32 [ %135, %129 ], [ %177, %176 ], [ %189, %187 ], [ %181, %183 ]
%192 = phi double [ %134, %129 ], [ %178, %176 ], [ %188, %187 ], [ %185, %183 ]
%193 = sitofp i32 %191 to double
%194 = call double @pow(i32 10, double %193)
%195 = fmul double %192, %194
%196 = call i32 @free(double* %17)
%197 = call i32 @free(double* %19)
ret double %195
}