#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 */
double pow(double, double);
double laplace(double s, int i, int j, double a) {
  double as, term, sum, factor1, factor2, factor3, factor4;
  int k, q, q0;
  as = a * a;
  if (i < 0)
    i = -i;
  if (j <= i) {
    factor4 = 1.0;
    for (k = 0; k < j; k++)
      factor4 *= (i - k);
    sum = factor4;
    q0 = 0;
  } else {
    q0 = (j + 1 - i) / 2;
    sum = 0.0;
    factor4 = 1.0;
  }
  factor1 = s;
  factor2 = s + i;
  factor3 = i + 1.0;
  for (q = 1; q < q0; q++) {
    factor1 *= s + q;
    factor2 *= s + i + q;
    factor3 *= i + 1.0 + q;
  }
  term = as * factor1 * factor2 / (factor3 * q);
  while (term * factor4 > 1.0e-10) {
    factor4 = 1.0;
    for (k = 0; k < j; k++)
      factor4 *= (2 * q + i - k);
    sum += term * factor4;
    factor1 += 1.0;
    factor2 += 1.0;
    factor3 += 1.0;
    q++;
    term *= as * factor1 * factor2 / (factor3 * q);
  }
  for (k = 0; k < i; k++)
    sum *= (s + ((double)k)) / (((double)k) + 1.0);
  if (q0 <= 0)
    sum *= 2.0 * pow(a, ((double)i));
  else
    sum *= 2.0 * pow(a, ((double)2 * q0 + i - 2));
  return (sum);
}


x86 assembly (clang, -O0):
<laplace>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
cmpl   $0x0,-0xc(%rbp)
jge    1149 <laplace+0x39>
xor    %eax,%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     11ad <laplace+0x9d>
movsd  0xea3(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1197 <laplace+0x87>
mov    -0xc(%rbp),%eax
sub    -0x54(%rbp),%eax
cvtsi2sd %eax,%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1169 <laplace+0x59>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x5c(%rbp)
jmp    11d6 <laplace+0xc6>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
sub    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x5c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe2f(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm0
movsd  0xe00(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x1,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jge    1287 <laplace+0x177>
movsd  -0x8(%rbp),%xmm0
cvtsi2sdl -0x58(%rbp),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x8(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x58(%rbp),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm0
movsd  0xd9e(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x58(%rbp),%xmm1
addsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1210 <laplace+0x100>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
cvtsi2sdl -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  0xd49(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    139c <laplace+0x28c>
movsd  0xd2f(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1311 <laplace+0x201>
mov    -0x58(%rbp),%eax
shl    $0x1,%eax
add    -0xc(%rbp),%eax
sub    -0x54(%rbp),%eax
cvtsi2sd %eax,%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    12dd <laplace+0x1cd>
movsd  -0x28(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xccb(%rip),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xcb9(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xca7(%rip),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
cvtsi2sdl -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    12ad <laplace+0x19d>
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    13ea <laplace+0x2da>
movsd  -0x8(%rbp),%xmm0
cvtsi2sdl -0x54(%rbp),%xmm1
addsd  %xmm1,%xmm0
cvtsi2sdl -0x54(%rbp),%xmm1
movsd  0xc36(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    13a3 <laplace+0x293>
cmpl   $0x0,-0x5c(%rbp)
jg     1421 <laplace+0x311>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
call   1030 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xc02(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1462 <laplace+0x352>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x5c(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm2
addsd  %xmm1,%xmm1
addsd  %xmm2,%xmm1
movsd  0xbd0(%rip),%xmm2
subsd  %xmm2,%xmm1
call   1030 <pow@plt>
movaps %xmm0,%xmm1
movsd  0xbbc(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<laplace>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
movapd %xmm1,%xmm8
movapd %xmm1,%xmm9
mulsd  %xmm1,%xmm9
mov    %edi,%r9d
neg    %r9d
cmovs  %edi,%r9d
cmp    %esi,%r9d
jge    11e8 <laplace+0xd8>
mov    %esi,%eax
sub    %r9d,%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,%edx
shr    $0x1f,%edx
lea    (%rax,%rdx,1),%r8d
add    $0x1,%r8d
xorps  %xmm1,%xmm1
cvtsi2sd %r9d,%xmm1
sar    %r8d
movapd %xmm1,%xmm2
addsd  %xmm0,%xmm2
movsd  0xe8f(%rip),%xmm12
movapd %xmm1,%xmm11
addsd  %xmm12,%xmm11
movapd %xmm0,%xmm14
unpcklpd %xmm2,%xmm14
mov    $0x1,%r14d
xorpd  %xmm7,%xmm7
cmp    $0x4,%ecx
jl     1372 <laplace+0x262>
lea    -0x1(%r8),%eax
and    $0xfffffffe,%ecx
movsd  0xe58(%rip),%xmm12
cmp    $0x4,%ecx
jne    12cf <laplace+0x1bf>
movapd %xmm12,%xmm4
movapd %xmm11,%xmm2
movapd %xmm14,%xmm3
test   $0x1,%al
je     1365 <laplace+0x255>
addsd  %xmm4,%xmm11
unpcklpd %xmm4,%xmm4
addpd  %xmm4,%xmm14
mulpd  %xmm3,%xmm14
mulsd  %xmm2,%xmm11
mov    %r8d,%r14d
jmp    1372 <laplace+0x262>
test   %esi,%esi
jle    1206 <laplace+0xf6>
lea    -0x1(%rsi),%ecx
mov    %esi,%eax
and    $0x3,%eax
cmp    $0x3,%ecx
jae    1214 <laplace+0x104>
movsd  0xdfe(%rip),%xmm12
xor    %ecx,%ecx
jmp    1273 <laplace+0x163>
movsd  0xdf1(%rip),%xmm12
jmp    1294 <laplace+0x184>
mov    %esi,%edx
and    $0xfffffffc,%edx
movsd  0xdde(%rip),%xmm12
xor    %ecx,%ecx
mov    %r9d,%ebp
nopw   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %ebp,%xmm1
mulsd  %xmm12,%xmm1
lea    -0x1(%rbp),%ebx
xorps  %xmm2,%xmm2
cvtsi2sd %ebx,%xmm2
mulsd  %xmm1,%xmm2
lea    -0x2(%rbp),%ebx
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
mulsd  %xmm2,%xmm1
lea    -0x3(%rbp),%ebx
xorps  %xmm12,%xmm12
cvtsi2sd %ebx,%xmm12
mulsd  %xmm1,%xmm12
add    $0x4,%ecx
add    $0xfffffffc,%ebp
cmp    %ecx,%edx
jne    1230 <laplace+0x120>
test   %eax,%eax
je     1294 <laplace+0x184>
mov    %r9d,%edx
sub    %ecx,%edx
nopl   0x0(%rax)
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
mulsd  %xmm1,%xmm12
add    $0xffffffff,%edx
add    $0xffffffff,%eax
jne    1280 <laplace+0x170>
xorps  %xmm1,%xmm1
cvtsi2sd %r9d,%xmm1
movapd %xmm1,%xmm2
addsd  %xmm0,%xmm2
movsd  0xd53(%rip),%xmm11
addsd  %xmm1,%xmm11
movapd %xmm0,%xmm14
unpcklpd %xmm2,%xmm14
mov    $0x1,%r14d
xor    %r8d,%r8d
movapd %xmm12,%xmm7
jmp    1372 <laplace+0x262>
mov    %eax,%ecx
and    $0xfffffffe,%ecx
neg    %ecx
mov    $0x1,%edx
movsd  0xd1d(%rip),%xmm4
movsd  0xd1c(%rip),%xmm10
movapd %xmm11,%xmm2
movapd %xmm14,%xmm3
cs nopw 0x0(%rax,%rax,1)
movapd %xmm4,%xmm5
unpcklpd %xmm4,%xmm5
addpd  %xmm14,%xmm5
mulpd  %xmm3,%xmm5
movapd %xmm11,%xmm6
addsd  %xmm4,%xmm6
mulsd  %xmm2,%xmm6
lea    0x1(%rdx),%ebp
xorps  %xmm3,%xmm3
cvtsi2sd %ebp,%xmm3
movapd %xmm11,%xmm2
addsd  %xmm3,%xmm2
unpcklpd %xmm3,%xmm3
addpd  %xmm14,%xmm3
mulpd  %xmm5,%xmm3
mulsd  %xmm6,%xmm2
addsd  %xmm10,%xmm4
mov    %edx,%ebp
add    $0x2,%edx
add    %ecx,%ebp
add    $0x2,%ebp
cmp    $0x1,%ebp
jne    1300 <laplace+0x1f0>
xorps  %xmm4,%xmm4
cvtsi2sd %edx,%xmm4
test   $0x1,%al
jne    11c8 <laplace+0xb8>
movapd %xmm2,%xmm11
mov    %r8d,%r14d
movapd %xmm3,%xmm14
movapd %xmm9,%xmm2
mulsd  %xmm14,%xmm2
movapd %xmm14,%xmm5
unpckhpd %xmm14,%xmm5
mulsd  %xmm2,%xmm5
xorps  %xmm2,%xmm2
cvtsi2sd %r14d,%xmm2
mulsd  %xmm11,%xmm2
divsd  %xmm2,%xmm5
mulsd  %xmm5,%xmm12
ucomisd 0xc67(%rip),%xmm12
jbe    14f8 <laplace+0x3e8>
lea    -0x1(%rsi),%r10d
mov    %esi,%r11d
and    $0x3,%r11d
lea    (%r9,%r14,2),%ecx
lea    (%r9,%r14,2),%r12d
add    $0xfffffffe,%r12d
lea    (%r9,%r14,2),%ebx
add    $0xffffffff,%ebx
lea    (%r9,%r14,2),%edx
add    $0xfffffffd,%edx
mov    %esi,%r15d
and    $0xfffffffc,%r15d
neg    %r15d
movsd  0xc19(%rip),%xmm13
movapd 0xc30(%rip),%xmm10
movsd  0xc17(%rip),%xmm12
jmp    1463 <laplace+0x353>
nopl   0x0(%rax,%rax,1)
movapd %xmm5,%xmm2
mulsd  %xmm6,%xmm2
addsd  %xmm2,%xmm7
addpd  %xmm10,%xmm14
addsd  %xmm13,%xmm11
add    $0x1,%r14d
movapd %xmm9,%xmm2
mulsd  %xmm14,%xmm2
movapd %xmm14,%xmm3
unpckhpd %xmm14,%xmm3
mulsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtsi2sd %r14d,%xmm2
mulsd  %xmm11,%xmm2
divsd  %xmm2,%xmm3
mulsd  %xmm3,%xmm5
mulsd  %xmm5,%xmm6
add    $0x2,%r12d
add    $0x2,%ebx
add    $0x2,%edx
add    $0x2,%ecx
ucomisd %xmm12,%xmm6
jbe    14f8 <laplace+0x3e8>
movapd %xmm13,%xmm6
test   %esi,%esi
jle    1400 <laplace+0x2f0>
xor    %ebp,%ebp
movapd %xmm13,%xmm6
cmp    $0x3,%r10d
jb     14c3 <laplace+0x3b3>
xor    %ebp,%ebp
movapd %xmm13,%xmm6
lea    (%rcx,%rbp,1),%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
lea    (%rbx,%rbp,1),%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm6,%xmm4
lea    (%r12,%rbp,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mulsd  %xmm4,%xmm3
lea    (%rdx,%rbp,1),%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
mulsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm6
add    $0xfffffffc,%ebp
cmp    %ebp,%r15d
jne    1480 <laplace+0x370>
neg    %ebp
test   %r11d,%r11d
je     1400 <laplace+0x2f0>
mov    %ecx,%eax
sub    %ebp,%eax
mov    %r11d,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm6
add    $0xffffffff,%eax
add    $0xffffffff,%ebp
jne    14e0 <laplace+0x3d0>
jmp    1400 <laplace+0x2f0>
test   %edi,%edi
je     15a0 <laplace+0x490>
mov    $0x1,%eax
cmp    $0x2,%r9d
cmovae %r9d,%eax
jae    151c <laplace+0x40c>
xorpd  %xmm2,%xmm2
test   $0x1,%al
jne    158c <laplace+0x47c>
jmp    15a0 <laplace+0x490>
mov    %eax,%ecx
and    $0x7ffffffe,%ecx
xor    %edx,%edx
xorpd  %xmm2,%xmm2
movsd  0xace(%rip),%xmm3
movsd  0xace(%rip),%xmm4
nopw   0x0(%rax,%rax,1)
movapd %xmm2,%xmm5
addsd  %xmm0,%xmm5
movapd %xmm2,%xmm6
addsd  %xmm3,%xmm6
divsd  %xmm6,%xmm5
lea    0x1(%rdx),%esi
xorps  %xmm6,%xmm6
cvtsi2sd %esi,%xmm6
mulsd  %xmm7,%xmm5
movapd %xmm6,%xmm7
addsd  %xmm0,%xmm7
addsd  %xmm3,%xmm6
divsd  %xmm6,%xmm7
mulsd  %xmm5,%xmm7
addsd  %xmm4,%xmm2
add    $0x2,%edx
cmp    %edx,%ecx
jne    1540 <laplace+0x430>
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
test   $0x1,%al
je     15a0 <laplace+0x490>
addsd  %xmm2,%xmm0
addsd  0xa68(%rip),%xmm2
divsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm7
test   %r8d,%r8d
movsd  %xmm7,0x8(%rsp)
jle    15c7 <laplace+0x4b7>
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
addsd  0xa55(%rip),%xmm0
movapd %xmm0,%xmm1
movapd %xmm8,%xmm0
call   1030 <pow@plt>
addsd  %xmm0,%xmm0
mulsd  0x8(%rsp),%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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