#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 log(double);
double gammaln_mat(double x) {
  static double d1 = -5.772156649015328605195174e-1;
  static double p1[9] = {0.0,
                         4.945235359296727046734888e0,
                         2.018112620856775083915565e2,
                         2.290838373831346393026739e3,
                         1.131967205903380828685045e4,
                         2.855724635671635335736389e4,
                         3.848496228443793359990269e4,
                         2.637748787624195437963534e4,
                         7.225813979700288197698961e3};
  static double q1[9] = {0.0,
                         6.748212550303777196073036e1,
                         1.113332393857199323513008e3,
                         7.738757056935398733233834e3,
                         2.763987074403340708898585e4,
                         5.499310206226157329794414e4,
                         6.161122180066002127833352e4,
                         3.635127591501940507276287e4,
                         8.785536302431013170870835e3};
  static double d2 = 4.227843350984671393993777e-1;
  static double p2[9] = {0.0,
                         4.974607845568932035012064e0,
                         5.424138599891070494101986e2,
                         1.550693864978364947665077e4,
                         1.847932904445632425417223e5,
                         1.088204769468828767498470e6,
                         3.338152967987029735917223e6,
                         5.106661678927352456275255e6,
                         3.074109054850539556250927e6};
  static double q2[9] = {0.0,
                         1.830328399370592604055942e2,
                         7.765049321445005871323047e3,
                         1.331903827966074194402448e5,
                         1.136705821321969608938755e6,
                         5.267964117437946917577538e6,
                         1.346701454311101692290052e7,
                         1.782736530353274213975932e7,
                         9.533095591844353613395747e6};
  static double d4 = 1.791759469228055000094023e0;
  static double p4[9] = {0.0,
                         1.474502166059939948905062e4,
                         2.426813369486704502836312e6,
                         1.214755574045093227939592e8,
                         2.663432449630976949898078e9,
                         2.940378956634553899906876e10,
                         1.702665737765398868392998e11,
                         4.926125793377430887588120e11,
                         5.606251856223951465078242e11};
  static double q4[9] = {0.0,
                         2.690530175870899333379843e3,
                         6.393885654300092398984238e5,
                         4.135599930241388052042842e7,
                         1.120872109616147941376570e9,
                         1.488613728678813811542398e10,
                         1.016803586272438228077304e11,
                         3.417476345507377132798597e11,
                         4.463158187419713286462081e11};
  static double c[8] = {0.0,
                        -1.910444077728e-03,
                        8.4171387781295e-04,
                        -5.952379913043012e-04,
                        7.93650793500350248e-04,
                        -2.777777777777681622553e-03,
                        8.333333333333333331554247e-02,
                        5.7083835261e-03};
  double res;
  int i;
  double xnum, xden;
  double xm1;
  double xm2;
  double xm4;
  double r;
  double ysq;
  double corr;
  double spi;
  res = x;
  if (x < 3.0e-7)
    res = -log(x);
  if ((x > 3.0e-7) & (x <= 0.5)) {
    xden = 1;
    xnum = 0;
    for (i = 1; i <= 8; i++) {
      xnum = xnum * x + p1[i];
      xden = xden * x + q1[i];
    }
    res = -log(x) + (x * (d1 + x * (xnum / xden)));
  }
  if ((x > 0.5) & (x < 0.6796875)) {
    xm1 = x - 0.5 - 0.5;
    xden = 1.0;
    xnum = 0.0;
    for (i = 1; i <= 8; i++) {
      xnum = xnum * xm1 + p2[i];
      xden = xden * xm1 + q2[i];
    }
    res = -log(x) + xm1 * (d2 + xm1 * (xnum / xden));
  }
  if ((x > 0.6796875) & (x <= 1.5)) {
    xm1 = x - 0.5 - 0.5;
    xden = 1.0;
    xnum = 0.0;
    for (i = 1; i <= 8; i++) {
      xnum = xnum * xm1 + p1[i];
      xden = xden * xm1 + q1[i];
    }
    res = xm1 * (d1 + xm1 * (xnum / xden));
  }
  if ((x > 1.5) & (x <= 4)) {
    xm2 = x - 2.0;
    xden = 1.0;
    xnum = 0.0;
    for (i = 1; i <= 8; i++) {
      xnum = xnum * xm2 + p2[i];
      xden = xden * xm2 + q2[i];
    }
    res = xm2 * (d2 + xm2 * (xnum / xden));
  }
  if ((x > 4) & (x <= 12)) {
    xm4 = x - 4.0;
    xden = -1.0;
    xnum = 0.0;
    for (i = 1; i <= 8; i++) {
      xnum = xnum * xm4 + p4[i];
      xden = xden * xm4 + q4[i];
    }
    res = d4 + xm4 * (xnum / xden);
  }
  if (x > 12) {
    r = c[7];
    ysq = x * x;
    for (i = 1; i <= 6; i++)
      r = r / ysq + c[i];
    r = r / x;
    corr = log(x);
    spi = 0.9189385332046727417803297;
    res = r + spi - 0.5 * corr + x * (corr - 1);
  }
  return res;
}


x86 assembly (clang, -O0):
<gammaln_mat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xed1(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    1160 <gammaln_mat+0x50>
movsd  -0x8(%rbp),%xmm0
call   1030 <log@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xe93(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  0xe87(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     126e <gammaln_mat+0x15e>
movsd  0xe6e(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jg     121c <gammaln_mat+0x10c>
movsd  -0x20(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2e6b(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2e94(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11b6 <gammaln_mat+0xa6>
movsd  -0x8(%rbp),%xmm0
call   1030 <log@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  -0x8(%rbp),%xmm0
movsd  0x2de6(%rip),%xmm3
movsd  -0x8(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm4
divsd  -0x28(%rbp),%xmm4
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xd8d(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  0xd89(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     139e <gammaln_mat+0x28e>
movsd  -0x8(%rbp),%xmm0
movsd  0xd53(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd47(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xd3e(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jg     134c <gammaln_mat+0x23c>
movsd  -0x20(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2ddb(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2e04(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12e6 <gammaln_mat+0x1d6>
movsd  -0x8(%rbp),%xmm0
call   1030 <log@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  -0x30(%rbp),%xmm0
movsd  0x2d5e(%rip),%xmm3
movsd  -0x30(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm4
divsd  -0x28(%rbp),%xmm4
mulsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xc6d(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  0xc61(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     14a9 <gammaln_mat+0x399>
movsd  -0x8(%rbp),%xmm0
movsd  0xc23(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xc17(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xc0e(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jg     147c <gammaln_mat+0x36c>
movsd  -0x20(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2c0b(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2c34(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1416 <gammaln_mat+0x306>
movsd  -0x30(%rbp),%xmm0
movsd  0x2ba7(%rip),%xmm2
movsd  -0x30(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm3
divsd  -0x28(%rbp),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xb6a(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  0xb5e(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     15a8 <gammaln_mat+0x498>
movsd  -0x8(%rbp),%xmm0
movsd  0xb40(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xb0f(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jg     157b <gammaln_mat+0x46b>
movsd  -0x20(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2bac(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2bd5(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1515 <gammaln_mat+0x405>
movsd  -0x38(%rbp),%xmm0
movsd  0x2b50(%rip),%xmm2
movsd  -0x38(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm3
divsd  -0x28(%rbp),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xa73(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  0xa6f(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     169e <gammaln_mat+0x58e>
movsd  -0x8(%rbp),%xmm0
movsd  0xa39(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xa40(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jg     167a <gammaln_mat+0x56a>
movsd  -0x20(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2b4d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movslq -0x14(%rbp),%rcx
lea    0x2b76(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1614 <gammaln_mat+0x504>
movsd  0x2af6(%rip),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
divsd  -0x28(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0x98d(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    177c <gammaln_mat+0x66c>
movsd  0x2b9b(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x6,-0x14(%rbp)
jg     170f <gammaln_mat+0x5ff>
movsd  -0x48(%rbp),%xmm0
divsd  -0x50(%rbp),%xmm0
movslq -0x14(%rbp),%rcx
lea    0x2b29(%rip),%rax
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    16d8 <gammaln_mat+0x5c8>
movsd  -0x48(%rbp),%xmm0
divsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
call   1030 <log@plt>
movsd  %xmm0,-0x58(%rbp)
movsd  0x91b(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  0x8f7(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x8(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  0x8a5(%rip),%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gammaln_mat>:
sub    $0x38,%rsp
movapd %xmm0,%xmm2
movsd  0xee0(%rip),%xmm0
ucomisd %xmm2,%xmm0
movapd %xmm2,%xmm3
movapd %xmm2,0x10(%rsp)
jbe    114b <gammaln_mat+0x3b>
movapd %xmm2,%xmm0
call   1030 <log@plt>
movapd 0x10(%rsp),%xmm2
movapd %xmm0,%xmm3
xorpd  0xf85(%rip),%xmm3
ucomisd 0xead(%rip),%xmm2
jbe    1220 <gammaln_mat+0x110>
movsd  0xea7(%rip),%xmm0
ucomisd %xmm2,%xmm0
jb     1220 <gammaln_mat+0x110>
xorpd  %xmm1,%xmm1
mulsd  %xmm2,%xmm1
addsd  0xe95(%rip),%xmm1
movsd  0xe95(%rip),%xmm0
addsd  %xmm2,%xmm0
unpcklpd %xmm0,%xmm1
movapd %xmm2,%xmm0
unpcklpd %xmm2,%xmm0
mulpd  %xmm0,%xmm1
addpd  0xf41(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf45(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf49(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf4d(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf51(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf55(%rip),%xmm1
mulpd  %xmm0,%xmm1
addpd  0xf59(%rip),%xmm1
movapd %xmm1,(%rsp)
movapd %xmm2,%xmm0
call   1030 <log@plt>
movapd (%rsp),%xmm3
movapd 0x10(%rsp),%xmm2
movapd %xmm3,%xmm1
unpckhpd %xmm3,%xmm1
divsd  %xmm1,%xmm3
mulsd  %xmm2,%xmm3
addsd  0xe08(%rip),%xmm3
mulsd  %xmm2,%xmm3
subsd  %xmm0,%xmm3
ucomisd 0xde0(%rip),%xmm2
jbe    1315 <gammaln_mat+0x205>
movsd  0xdf2(%rip),%xmm0
ucomisd %xmm2,%xmm0
jbe    1315 <gammaln_mat+0x205>
movsd  0xde8(%rip),%xmm0
movapd %xmm2,%xmm1
addsd  %xmm0,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x20(%rsp)
xorpd  %xmm3,%xmm3
mulsd  %xmm1,%xmm3
addsd  0xdce(%rip),%xmm3
movsd  0xdce(%rip),%xmm0
addsd  %xmm1,%xmm0
unpcklpd %xmm0,%xmm3
movapd %xmm1,%xmm0
unpcklpd %xmm1,%xmm0
mulpd  %xmm0,%xmm3
addpd  0xec2(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xec6(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xeca(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xece(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xed2(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xed6(%rip),%xmm3
mulpd  %xmm0,%xmm3
addpd  0xeda(%rip),%xmm3
movapd %xmm3,(%rsp)
movapd %xmm2,%xmm0
call   1030 <log@plt>
movapd (%rsp),%xmm3
movapd 0x10(%rsp),%xmm2
movapd %xmm3,%xmm1
unpckhpd %xmm3,%xmm1
divsd  %xmm1,%xmm3
movapd 0x20(%rsp),%xmm1
mulsd  %xmm1,%xmm3
addsd  0xd3b(%rip),%xmm3
mulsd  %xmm1,%xmm3
subsd  %xmm0,%xmm3
ucomisd 0xd0b(%rip),%xmm2
jbe    13e1 <gammaln_mat+0x2d1>
movsd  0xd25(%rip),%xmm0
ucomisd %xmm2,%xmm0
jb     13e1 <gammaln_mat+0x2d1>
movsd  0xcf3(%rip),%xmm1
movapd %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
xorpd  %xmm3,%xmm3
mulsd  %xmm0,%xmm3
addsd  0xcb7(%rip),%xmm3
movsd  0xcb7(%rip),%xmm1
addsd  %xmm0,%xmm1
unpcklpd %xmm1,%xmm3
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
mulpd  %xmm1,%xmm3
addpd  0xd63(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd67(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd6b(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd6f(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd73(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd77(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd7b(%rip),%xmm3
movapd %xmm3,%xmm1
unpckhpd %xmm3,%xmm1
divsd  %xmm1,%xmm3
mulsd  %xmm0,%xmm3
addsd  0xc43(%rip),%xmm3
mulsd  %xmm0,%xmm3
ucomisd 0xc67(%rip),%xmm2
jbe    14a5 <gammaln_mat+0x395>
movsd  0xc61(%rip),%xmm0
ucomisd %xmm2,%xmm0
jb     14a5 <gammaln_mat+0x395>
movsd  0xc57(%rip),%xmm0
addsd  %xmm2,%xmm0
xorpd  %xmm3,%xmm3
mulsd  %xmm0,%xmm3
addsd  0xc1b(%rip),%xmm3
movsd  0xc1b(%rip),%xmm1
addsd  %xmm0,%xmm1
unpcklpd %xmm1,%xmm3
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
mulpd  %xmm1,%xmm3
addpd  0xd0f(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd13(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd17(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd1b(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd1f(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd23(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xd27(%rip),%xmm3
movapd %xmm3,%xmm1
unpckhpd %xmm3,%xmm1
divsd  %xmm1,%xmm3
mulsd  %xmm0,%xmm3
addsd  0xba7(%rip),%xmm3
mulsd  %xmm0,%xmm3
ucomisd 0xbab(%rip),%xmm2
jbe    155d <gammaln_mat+0x44d>
movsd  0xbad(%rip),%xmm0
ucomisd %xmm2,%xmm0
jb     155d <gammaln_mat+0x44d>
movsd  0xba3(%rip),%xmm0
addsd  %xmm2,%xmm0
movapd %xmm0,%xmm1
xorpd  %xmm3,%xmm3
movhpd 0xb97(%rip),%xmm3
unpcklpd %xmm0,%xmm1
mulpd  %xmm1,%xmm3
addpd  0xccf(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xcd3(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xcd7(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xcdb(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xcdf(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xce3(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xce7(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xceb(%rip),%xmm3
movapd %xmm3,%xmm1
unpckhpd %xmm3,%xmm1
divsd  %xmm1,%xmm3
mulsd  %xmm0,%xmm3
addsd  0xb23(%rip),%xmm3
ucomisd 0xb03(%rip),%xmm2
jbe    1609 <gammaln_mat+0x4f9>
movapd %xmm2,%xmm0
mulsd  %xmm2,%xmm0
movsd  0xb0d(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xb09(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xb05(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xb01(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xafd(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xaf9(%rip),%xmm1
divsd  %xmm0,%xmm1
addsd  0xaf5(%rip),%xmm1
divsd  %xmm2,%xmm1
movsd  %xmm1,(%rsp)
movapd %xmm2,%xmm0
call   1030 <log@plt>
movsd  (%rsp),%xmm2
addsd  0xade(%rip),%xmm2
movsd  0xa46(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
addsd  0xa7e(%rip),%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  %xmm1,%xmm0
add    $0x38,%rsp
ret
movapd %xmm3,%xmm0
add    $0x38,%rsp
ret

LLVM IR (-O0):
@gammaln_mat.d1 = internal global double 0xBFE2788CFC6FB619
@gammaln_mat.p1 = internal global [9 x double] [double 0.000000e+00, double 0x4013C7EBC72CCF1B, double 0x406939F5DBE7CF07, double 0x40A1E5AD3F55B6E9, double 0x40C61BD60607C998, double 0x40DBE34FC44EF5F9, double 0x40E2CA9ECB08BBCC, double 0x40D9C25F395D45EC, double 0x40BC39D060F94058]
@gammaln_mat.q1 = internal global [9 x double] [double 0.000000e+00, double 0x4050DEDB24ED0759, double 0x409165545F0E2840, double 0x40BE3AC1CE7BBABF, double 0x40DAFDF7BA452EAB, double 0x40EADA2344181374, double 0x40EE156718FDB2A1, double 0x40E1BFE8D44BBC1A, double 0x40C128C4A58EDCFC]
@gammaln_mat.d2 = internal global double 0x3FDB0EE6072093CE
@gammaln_mat.p2 = internal global [9 x double] [double 0.000000e+00, double 0x4013E5FF995C9307, double 0x4080F34F95D372B4, double 0x40CE497825AD1596, double 0x41068ECA52D49963, double 0x41309ACCC4FBE8BF, double 0x414977D47BE6FFBE, double 0x41537AF96B738BB6, double 0x4147741E870557AD]
@gammaln_mat.q2 = internal global [9 x double] [double 0.000000e+00, double 0x4066E10D0656F583, double 0x40BE550CA054894B, double 0x410042330FF7AAEF, double 0x41315841D2422817, double 0x4154187F07841A73, double 0x4169AFB0D1612A5B, double 0x4171006254DB4526, double 0x41622ED4F2F06392]
@gammaln_mat.d4 = internal global double 0x3FFCAB0BFA2A2002
@gammaln_mat.p4 = internal global [9 x double] [double 0.000000e+00, double 0x40CCCC82C5C64704, double 0x414283DEAF4B5720, double 0x419CF647959E37B1, double 0x41E3D818203430F7, double 0x421B6268E3F961D5, double 0x4243D256DDE8451B, double 0x425CAC7FDC026F8F, double 0x426050FBAE6ACCA5]
@gammaln_mat.q4 = internal global [9 x double] [double 0.000000e+00, double 0x40A5050F73363548, double 0x4123833921800ACC, double 0x4183B856FA6B57F8, double 0x41D0B3C9AB676EF8, double 0x420BBA436E364E1B, double 0x4237AC9F24E33E6B, double 0x4253E46FC45DAF37, double 0x4259FA9FBBBD7E2A]
@gammaln_mat.c = internal global [8 x double] [double 0.000000e+00, double 0xBF5F4CFBB56B5FF7, double 0x3F4B94CEC9F537D1, double 0xBF438137DA5DD682, double 0x3F4A01A019EC73CF, double 0xBF66C16C16C16B39, double 0x3FB5555555555555, double 0x3F7761AC88EC07D7]
define double @gammaln_mat(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
store double %0, double* %2
%14 = load double, double* %2
store double %14, double* %3
%15 = load double, double* %2
%16 = fcmp olt double %15, 3.000000e-07
br i1 %16, label %17, label %21
17: ; preds = %1
%18 = load double, double* %2
%19 = call double @log(double %18)
%20 = fneg double %19
store double %20, double* %3
br label %21
21: ; preds = %17, %1
%22 = load double, double* %2
%23 = fcmp ogt double %22, 3.000000e-07
%24 = zext i1 %23 to i32
%25 = load double, double* %2
%26 = fcmp ole double %25, 5.000000e-01
%27 = zext i1 %26 to i32
%28 = and i32 %24, %27
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %64
30: ; preds = %21
store double 1.000000e+00, double* %6
store double 0.000000e+00, double* %5
store i32 1, i32* %4
br label %31
31: ; preds = %49, %30
%32 = load i32, i32* %4
%33 = icmp sle i32 %32, 8
br i1 %33, label %34, label %52
34: ; preds = %31
%35 = load double, double* %5
%36 = load double, double* %2
%37 = load i32, i32* %4
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.p1, i64 0, i64 %38
%40 = load double, double* %39
%41 = call double @llvm.fmuladd.f64(double %35, double %36, double %40)
store double %41, double* %5
%42 = load double, double* %6
%43 = load double, double* %2
%44 = load i32, i32* %4
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.q1, i64 0, i64 %45
%47 = load double, double* %46
%48 = call double @llvm.fmuladd.f64(double %42, double %43, double %47)
store double %48, double* %6
br label %49
49: ; preds = %34
%50 = load i32, i32* %4
%51 = add nsw i32 %50, 1
store i32 %51, i32* %4
br label %31
52: ; preds = %31
%53 = load double, double* %2
%54 = call double @log(double %53)
%55 = fneg double %54
%56 = load double, double* %2
%57 = load double, double* @gammaln_mat.d1
%58 = load double, double* %2
%59 = load double, double* %5
%60 = load double, double* %6
%61 = fdiv double %59, %60
%62 = call double @llvm.fmuladd.f64(double %58, double %61, double %57)
%63 = call double @llvm.fmuladd.f64(double %56, double %62, double %55)
store double %63, double* %3
br label %64
64: ; preds = %52, %21
%65 = load double, double* %2
%66 = fcmp ogt double %65, 5.000000e-01
%67 = zext i1 %66 to i32
%68 = load double, double* %2
%69 = fcmp olt double %68, 0x3FE5C00000000000
%70 = zext i1 %69 to i32
%71 = and i32 %67, %70
%72 = icmp ne i32 %71, 0
br i1 %72, label %73, label %110
73: ; preds = %64
%74 = load double, double* %2
%75 = fsub double %74, 5.000000e-01
%76 = fsub double %75, 5.000000e-01
store double %76, double* %7
store double 1.000000e+00, double* %6
store double 0.000000e+00, double* %5
store i32 1, i32* %4
br label %77
77: ; preds = %95, %73
%78 = load i32, i32* %4
%79 = icmp sle i32 %78, 8
br i1 %79, label %80, label %98
80: ; preds = %77
%81 = load double, double* %5
%82 = load double, double* %7
%83 = load i32, i32* %4
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.p2, i64 0, i64 %84
%86 = load double, double* %85
%87 = call double @llvm.fmuladd.f64(double %81, double %82, double %86)
store double %87, double* %5
%88 = load double, double* %6
%89 = load double, double* %7
%90 = load i32, i32* %4
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.q2, i64 0, i64 %91
%93 = load double, double* %92
%94 = call double @llvm.fmuladd.f64(double %88, double %89, double %93)
store double %94, double* %6
br label %95
95: ; preds = %80
%96 = load i32, i32* %4
%97 = add nsw i32 %96, 1
store i32 %97, i32* %4
br label %77
98: ; preds = %77
%99 = load double, double* %2
%100 = call double @log(double %99)
%101 = fneg double %100
%102 = load double, double* %7
%103 = load double, double* @gammaln_mat.d2
%104 = load double, double* %7
%105 = load double, double* %5
%106 = load double, double* %6
%107 = fdiv double %105, %106
%108 = call double @llvm.fmuladd.f64(double %104, double %107, double %103)
%109 = call double @llvm.fmuladd.f64(double %102, double %108, double %101)
store double %109, double* %3
br label %110
110: ; preds = %98, %64
%111 = load double, double* %2
%112 = fcmp ogt double %111, 0x3FE5C00000000000
%113 = zext i1 %112 to i32
%114 = load double, double* %2
%115 = fcmp ole double %114, 1.500000e+00
%116 = zext i1 %115 to i32
%117 = and i32 %113, %116
%118 = icmp ne i32 %117, 0
br i1 %118, label %119, label %153
119: ; preds = %110
%120 = load double, double* %2
%121 = fsub double %120, 5.000000e-01
%122 = fsub double %121, 5.000000e-01
store double %122, double* %7
store double 1.000000e+00, double* %6
store double 0.000000e+00, double* %5
store i32 1, i32* %4
br label %123
123: ; preds = %141, %119
%124 = load i32, i32* %4
%125 = icmp sle i32 %124, 8
br i1 %125, label %126, label %144
126: ; preds = %123
%127 = load double, double* %5
%128 = load double, double* %7
%129 = load i32, i32* %4
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.p1, i64 0, i64 %130
%132 = load double, double* %131
%133 = call double @llvm.fmuladd.f64(double %127, double %128, double %132)
store double %133, double* %5
%134 = load double, double* %6
%135 = load double, double* %7
%136 = load i32, i32* %4
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.q1, i64 0, i64 %137
%139 = load double, double* %138
%140 = call double @llvm.fmuladd.f64(double %134, double %135, double %139)
store double %140, double* %6
br label %141
141: ; preds = %126
%142 = load i32, i32* %4
%143 = add nsw i32 %142, 1
store i32 %143, i32* %4
br label %123
144: ; preds = %123
%145 = load double, double* %7
%146 = load double, double* @gammaln_mat.d1
%147 = load double, double* %7
%148 = load double, double* %5
%149 = load double, double* %6
%150 = fdiv double %148, %149
%151 = call double @llvm.fmuladd.f64(double %147, double %150, double %146)
%152 = fmul double %145, %151
store double %152, double* %3
br label %153
153: ; preds = %144, %110
%154 = load double, double* %2
%155 = fcmp ogt double %154, 1.500000e+00
%156 = zext i1 %155 to i32
%157 = load double, double* %2
%158 = fcmp ole double %157, 4.000000e+00
%159 = zext i1 %158 to i32
%160 = and i32 %156, %159
%161 = icmp ne i32 %160, 0
br i1 %161, label %162, label %195
162: ; preds = %153
%163 = load double, double* %2
%164 = fsub double %163, 2.000000e+00
store double %164, double* %8
store double 1.000000e+00, double* %6
store double 0.000000e+00, double* %5
store i32 1, i32* %4
br label %165
165: ; preds = %183, %162
%166 = load i32, i32* %4
%167 = icmp sle i32 %166, 8
br i1 %167, label %168, label %186
168: ; preds = %165
%169 = load double, double* %5
%170 = load double, double* %8
%171 = load i32, i32* %4
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.p2, i64 0, i64 %172
%174 = load double, double* %173
%175 = call double @llvm.fmuladd.f64(double %169, double %170, double %174)
store double %175, double* %5
%176 = load double, double* %6
%177 = load double, double* %8
%178 = load i32, i32* %4
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.q2, i64 0, i64 %179
%181 = load double, double* %180
%182 = call double @llvm.fmuladd.f64(double %176, double %177, double %181)
store double %182, double* %6
br label %183
183: ; preds = %168
%184 = load i32, i32* %4
%185 = add nsw i32 %184, 1
store i32 %185, i32* %4
br label %165
186: ; preds = %165
%187 = load double, double* %8
%188 = load double, double* @gammaln_mat.d2
%189 = load double, double* %8
%190 = load double, double* %5
%191 = load double, double* %6
%192 = fdiv double %190, %191
%193 = call double @llvm.fmuladd.f64(double %189, double %192, double %188)
%194 = fmul double %187, %193
store double %194, double* %3
br label %195
195: ; preds = %186, %153
%196 = load double, double* %2
%197 = fcmp ogt double %196, 4.000000e+00
%198 = zext i1 %197 to i32
%199 = load double, double* %2
%200 = fcmp ole double %199, 1.200000e+01
%201 = zext i1 %200 to i32
%202 = and i32 %198, %201
%203 = icmp ne i32 %202, 0
br i1 %203, label %204, label %235
204: ; preds = %195
%205 = load double, double* %2
%206 = fsub double %205, 4.000000e+00
store double %206, double* %9
store double -1.000000e+00, double* %6
store double 0.000000e+00, double* %5
store i32 1, i32* %4
br label %207
207: ; preds = %225, %204
%208 = load i32, i32* %4
%209 = icmp sle i32 %208, 8
br i1 %209, label %210, label %228
210: ; preds = %207
%211 = load double, double* %5
%212 = load double, double* %9
%213 = load i32, i32* %4
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.p4, i64 0, i64 %214
%216 = load double, double* %215
%217 = call double @llvm.fmuladd.f64(double %211, double %212, double %216)
store double %217, double* %5
%218 = load double, double* %6
%219 = load double, double* %9
%220 = load i32, i32* %4
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds [9 x double], [9 x double]* @gammaln_mat.q4, i64 0, i64 %221
%223 = load double, double* %222
%224 = call double @llvm.fmuladd.f64(double %218, double %219, double %223)
store double %224, double* %6
br label %225
225: ; preds = %210
%226 = load i32, i32* %4
%227 = add nsw i32 %226, 1
store i32 %227, i32* %4
br label %207
228: ; preds = %207
%229 = load double, double* @gammaln_mat.d4
%230 = load double, double* %9
%231 = load double, double* %5
%232 = load double, double* %6
%233 = fdiv double %231, %232
%234 = call double @llvm.fmuladd.f64(double %230, double %233, double %229)
store double %234, double* %3
br label %235
235: ; preds = %228, %195
%236 = load double, double* %2
%237 = fcmp ogt double %236, 1.200000e+01
br i1 %237, label %238, label %273
238: ; preds = %235
%239 = load double, double* getelementptr inbounds ([8 x double], [8 x double]* @gammaln_mat.c, i64 0, i64 7)
store double %239, double* %10
%240 = load double, double* %2
%241 = load double, double* %2
%242 = fmul double %240, %241
store double %242, double* %11
store i32 1, i32* %4
br label %243
243: ; preds = %255, %238
%244 = load i32, i32* %4
%245 = icmp sle i32 %244, 6
br i1 %245, label %246, label %258
246: ; preds = %243
%247 = load double, double* %10
%248 = load double, double* %11
%249 = fdiv double %247, %248
%250 = load i32, i32* %4
%251 = sext i32 %250 to i64
%252 = getelementptr inbounds [8 x double], [8 x double]* @gammaln_mat.c, i64 0, i64 %251
%253 = load double, double* %252
%254 = fadd double %249, %253
store double %254, double* %10
br label %255
255: ; preds = %246
%256 = load i32, i32* %4
%257 = add nsw i32 %256, 1
store i32 %257, i32* %4
br label %243
258: ; preds = %243
%259 = load double, double* %10
%260 = load double, double* %2
%261 = fdiv double %259, %260
store double %261, double* %10
%262 = load double, double* %2
%263 = call double @log(double %262)
store double %263, double* %12
store double 0x3FED67F1C864BEB5, double* %13
%264 = load double, double* %10
%265 = load double, double* %13
%266 = fadd double %264, %265
%267 = load double, double* %12
%268 = call double @llvm.fmuladd.f64(double -5.000000e-01, double %267, double %266)
%269 = load double, double* %2
%270 = load double, double* %12
%271 = fsub double %270, 1.000000e+00
%272 = call double @llvm.fmuladd.f64(double %269, double %271, double %268)
store double %272, double* %3
br label %273
273: ; preds = %258, %235
%274 = load double, double* %3
ret double %274
}

LLVM IR (-O2):
define double @gammaln_mat(double %0) {
%2 = fcmp olt double %0, 3.000000e-07
br i1 %2, label %3, label %6
3: ; preds = %1
%4 = tail call double @log(double %0)
%5 = fneg double %4
br label %6
6: ; preds = %3, %1
%7 = phi double [ %5, %3 ], [ %0, %1 ]
%8 = fcmp ogt double %0, 3.000000e-07
%9 = fcmp ole double %0, 5.000000e-01
%10 = and i1 %8, %9
br i1 %10, label %11, label %32
11: ; preds = %6
%12 = tail call double @llvm.fmuladd.f64(double %0, double 0.000000e+00, double 0x4013C7EBC72CCF1B)
%13 = fadd double %0, 0x4050DEDB24ED0759
%14 = insertelement <2 x double> poison, double %12, i64 0
%15 = insertelement <2 x double> %14, double %13, i64 1
%16 = insertelement <2 x double> poison, double %0, i64 0
%17 = shufflevector <2 x double> %16, <2 x double> poison, <2 x i32> zeroinitializer
%18 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %15, <2 x double> %17, <2 x double> <double 0x406939F5DBE7CF07, double 0x409165545F0E2840>)
%19 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %18, <2 x double> %17, <2 x double> <double 0x40A1E5AD3F55B6E9, double 0x40BE3AC1CE7BBABF>)
%20 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %19, <2 x double> %17, <2 x double> <double 0x40C61BD60607C998, double 0x40DAFDF7BA452EAB>)
%21 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %20, <2 x double> %17, <2 x double> <double 0x40DBE34FC44EF5F9, double 0x40EADA2344181374>)
%22 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %21, <2 x double> %17, <2 x double> <double 0x40E2CA9ECB08BBCC, double 0x40EE156718FDB2A1>)
%23 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %22, <2 x double> %17, <2 x double> <double 0x40D9C25F395D45EC, double 0x40E1BFE8D44BBC1A>)
%24 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %23, <2 x double> %17, <2 x double> <double 0x40BC39D060F94058, double 0x40C128C4A58EDCFC>)
%25 = tail call double @log(double %0)
%26 = fneg double %25
%27 = extractelement <2 x double> %24, i64 0
%28 = extractelement <2 x double> %24, i64 1
%29 = fdiv double %27, %28
%30 = tail call double @llvm.fmuladd.f64(double %0, double %29, double 0xBFE2788CFC6FB619)
%31 = tail call double @llvm.fmuladd.f64(double %0, double %30, double %26)
br label %32
32: ; preds = %11, %6
%33 = phi double [ %31, %11 ], [ %7, %6 ]
%34 = fcmp ogt double %0, 5.000000e-01
%35 = fcmp olt double %0, 0x3FE5C00000000000
%36 = and i1 %34, %35
br i1 %36, label %37, label %60
37: ; preds = %32
%38 = fadd double %0, -5.000000e-01
%39 = fadd double %38, -5.000000e-01
%40 = tail call double @llvm.fmuladd.f64(double %39, double 0.000000e+00, double 0x4013E5FF995C9307)
%41 = fadd double %39, 0x4066E10D0656F583
%42 = insertelement <2 x double> poison, double %40, i64 0
%43 = insertelement <2 x double> %42, double %41, i64 1
%44 = insertelement <2 x double> poison, double %39, i64 0
%45 = shufflevector <2 x double> %44, <2 x double> poison, <2 x i32> zeroinitializer
%46 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %43, <2 x double> %45, <2 x double> <double 0x4080F34F95D372B4, double 0x40BE550CA054894B>)
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %45, <2 x double> <double 0x40CE497825AD1596, double 0x410042330FF7AAEF>)
%48 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %47, <2 x double> %45, <2 x double> <double 0x41068ECA52D49963, double 0x41315841D2422817>)
%49 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %48, <2 x double> %45, <2 x double> <double 0x41309ACCC4FBE8BF, double 0x4154187F07841A73>)
%50 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %49, <2 x double> %45, <2 x double> <double 0x414977D47BE6FFBE, double 0x4169AFB0D1612A5B>)
%51 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %50, <2 x double> %45, <2 x double> <double 0x41537AF96B738BB6, double 0x4171006254DB4526>)
%52 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %51, <2 x double> %45, <2 x double> <double 0x4147741E870557AD, double 0x41622ED4F2F06392>)
%53 = tail call double @log(double %0)
%54 = fneg double %53
%55 = extractelement <2 x double> %52, i64 0
%56 = extractelement <2 x double> %52, i64 1
%57 = fdiv double %55, %56
%58 = tail call double @llvm.fmuladd.f64(double %39, double %57, double 0x3FDB0EE6072093CE)
%59 = tail call double @llvm.fmuladd.f64(double %39, double %58, double %54)
br label %60
60: ; preds = %37, %32
%61 = phi double [ %59, %37 ], [ %33, %32 ]
%62 = fcmp ogt double %0, 0x3FE5C00000000000
%63 = fcmp ole double %0, 1.500000e+00
%64 = and i1 %62, %63
br i1 %64, label %65, label %86
65: ; preds = %60
%66 = fadd double %0, -5.000000e-01
%67 = fadd double %66, -5.000000e-01
%68 = tail call double @llvm.fmuladd.f64(double %67, double 0.000000e+00, double 0x4013C7EBC72CCF1B)
%69 = fadd double %67, 0x4050DEDB24ED0759
%70 = insertelement <2 x double> poison, double %68, i64 0
%71 = insertelement <2 x double> %70, double %69, i64 1
%72 = insertelement <2 x double> poison, double %67, i64 0
%73 = shufflevector <2 x double> %72, <2 x double> poison, <2 x i32> zeroinitializer
%74 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %71, <2 x double> %73, <2 x double> <double 0x406939F5DBE7CF07, double 0x409165545F0E2840>)
%75 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %74, <2 x double> %73, <2 x double> <double 0x40A1E5AD3F55B6E9, double 0x40BE3AC1CE7BBABF>)
%76 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %75, <2 x double> %73, <2 x double> <double 0x40C61BD60607C998, double 0x40DAFDF7BA452EAB>)
%77 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %76, <2 x double> %73, <2 x double> <double 0x40DBE34FC44EF5F9, double 0x40EADA2344181374>)
%78 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %77, <2 x double> %73, <2 x double> <double 0x40E2CA9ECB08BBCC, double 0x40EE156718FDB2A1>)
%79 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %78, <2 x double> %73, <2 x double> <double 0x40D9C25F395D45EC, double 0x40E1BFE8D44BBC1A>)
%80 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %79, <2 x double> %73, <2 x double> <double 0x40BC39D060F94058, double 0x40C128C4A58EDCFC>)
%81 = extractelement <2 x double> %80, i64 0
%82 = extractelement <2 x double> %80, i64 1
%83 = fdiv double %81, %82
%84 = tail call double @llvm.fmuladd.f64(double %67, double %83, double 0xBFE2788CFC6FB619)
%85 = fmul double %67, %84
br label %86
86: ; preds = %65, %60
%87 = phi double [ %85, %65 ], [ %61, %60 ]
%88 = fcmp ogt double %0, 1.500000e+00
%89 = fcmp ole double %0, 4.000000e+00
%90 = and i1 %88, %89
br i1 %90, label %91, label %111
91: ; preds = %86
%92 = fadd double %0, -2.000000e+00
%93 = tail call double @llvm.fmuladd.f64(double %92, double 0.000000e+00, double 0x4013E5FF995C9307)
%94 = fadd double %92, 0x4066E10D0656F583
%95 = insertelement <2 x double> poison, double %93, i64 0
%96 = insertelement <2 x double> %95, double %94, i64 1
%97 = insertelement <2 x double> poison, double %92, i64 0
%98 = shufflevector <2 x double> %97, <2 x double> poison, <2 x i32> zeroinitializer
%99 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %96, <2 x double> %98, <2 x double> <double 0x4080F34F95D372B4, double 0x40BE550CA054894B>)
%100 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %99, <2 x double> %98, <2 x double> <double 0x40CE497825AD1596, double 0x410042330FF7AAEF>)
%101 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %100, <2 x double> %98, <2 x double> <double 0x41068ECA52D49963, double 0x41315841D2422817>)
%102 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %101, <2 x double> %98, <2 x double> <double 0x41309ACCC4FBE8BF, double 0x4154187F07841A73>)
%103 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %102, <2 x double> %98, <2 x double> <double 0x414977D47BE6FFBE, double 0x4169AFB0D1612A5B>)
%104 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %103, <2 x double> %98, <2 x double> <double 0x41537AF96B738BB6, double 0x4171006254DB4526>)
%105 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %104, <2 x double> %98, <2 x double> <double 0x4147741E870557AD, double 0x41622ED4F2F06392>)
%106 = extractelement <2 x double> %105, i64 0
%107 = extractelement <2 x double> %105, i64 1
%108 = fdiv double %106, %107
%109 = tail call double @llvm.fmuladd.f64(double %92, double %108, double 0x3FDB0EE6072093CE)
%110 = fmul double %92, %109
br label %111
111: ; preds = %91, %86
%112 = phi double [ %110, %91 ], [ %87, %86 ]
%113 = fcmp ogt double %0, 4.000000e+00
%114 = fcmp ole double %0, 1.200000e+01
%115 = and i1 %113, %114
br i1 %115, label %116, label %132
116: ; preds = %111
%117 = fadd double %0, -4.000000e+00
%118 = insertelement <2 x double> poison, double %117, i64 0
%119 = shufflevector <2 x double> %118, <2 x double> poison, <2 x i32> zeroinitializer
%120 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %119, <2 x double> <double 0.000000e+00, double -1.000000e+00>, <2 x double> <double 0x40CCCC82C5C64704, double 0x40A5050F73363548>)
%121 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %120, <2 x double> %119, <2 x double> <double 0x414283DEAF4B5720, double 0x4123833921800ACC>)
%122 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %121, <2 x double> %119, <2 x double> <double 0x419CF647959E37B1, double 0x4183B856FA6B57F8>)
%123 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %122, <2 x double> %119, <2 x double> <double 0x41E3D818203430F7, double 0x41D0B3C9AB676EF8>)
%124 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %123, <2 x double> %119, <2 x double> <double 0x421B6268E3F961D5, double 0x420BBA436E364E1B>)
%125 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %124, <2 x double> %119, <2 x double> <double 0x4243D256DDE8451B, double 0x4237AC9F24E33E6B>)
%126 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %125, <2 x double> %119, <2 x double> <double 0x425CAC7FDC026F8F, double 0x4253E46FC45DAF37>)
%127 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %126, <2 x double> %119, <2 x double> <double 0x426050FBAE6ACCA5, double 0x4259FA9FBBBD7E2A>)
%128 = extractelement <2 x double> %127, i64 0
%129 = extractelement <2 x double> %127, i64 1
%130 = fdiv double %128, %129
%131 = tail call double @llvm.fmuladd.f64(double %117, double %130, double 0x3FFCAB0BFA2A2002)
br label %132
132: ; preds = %116, %111
%133 = phi double [ %131, %116 ], [ %112, %111 ]
%134 = fcmp ogt double %0, 1.200000e+01
br i1 %134, label %135, label %155
135: ; preds = %132
%136 = fmul double %0, %0
%137 = fdiv double 0x3F7761AC88EC07D7, %136
%138 = fadd double %137, 0xBF5F4CFBB56B5FF7
%139 = fdiv double %138, %136
%140 = fadd double %139, 0x3F4B94CEC9F537D1
%141 = fdiv double %140, %136
%142 = fadd double %141, 0xBF438137DA5DD682
%143 = fdiv double %142, %136
%144 = fadd double %143, 0x3F4A01A019EC73CF
%145 = fdiv double %144, %136
%146 = fadd double %145, 0xBF66C16C16C16B39
%147 = fdiv double %146, %136
%148 = fadd double %147, 0x3FB5555555555555
%149 = fdiv double %148, %0
%150 = tail call double @log(double %0)
%151 = fadd double %149, 0x3FED67F1C864BEB5
%152 = tail call double @llvm.fmuladd.f64(double %150, double -5.000000e-01, double %151)
%153 = fadd double %150, -1.000000e+00
%154 = tail call double @llvm.fmuladd.f64(double %0, double %153, double %152)
br label %155
155: ; preds = %135, %132
%156 = phi double [ %154, %135 ], [ %133, %132 ]
ret double %156
}