#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 exp(double);
double fabs(double);
double erf__(double x) {
  double c = .564189583547756;
  double a[5] = {7.7105849500132e-5, -.00133733772997339, .0323076579225834,
                 .0479137145607681, .128379167095513};
  double b[3] = {.00301048631703895, .0538971687740286, .375795757275549};
  double p[8] = {-1.36864857382717e-7, .564195517478974, 7.21175825088309,
                 43.1622272220567,     152.98928504694,  339.320816734344,
                 451.918953711873,     300.459261020162};
  double q[8] = {1.,
                 12.7827273196294,
                 77.0001529352295,
                 277.585444743988,
                 638.980264465631,
                 931.35409485061,
                 790.950925327898,
                 300.459260956983};
  double r[5] = {2.10144126479064, 26.2370141675169, 21.3688200555087,
                 4.6580782871847, .282094791773523};
  double s[4] = {94.153775055546, 187.11481179959, 99.0191814623914,
                 18.0124575948747};
  double ret_val;
  double t, x2, ax, bot, top;
  ax = fabs(x);
  if (ax <= 0.5) {
    t = x * x;
    top = (((a[0] * t + a[1]) * t + a[2]) * t + a[3]) * t + a[4] + 1.0;
    bot = ((b[0] * t + b[1]) * t + b[2]) * t + 1.0;
    return x * (top / bot);
  }
  if (ax <= 4.) {
    top = ((((((p[0] * ax + p[1]) * ax + p[2]) * ax + p[3]) * ax + p[4]) * ax +
            p[5]) *
               ax +
           p[6]) *
              ax +
          p[7];
    bot = ((((((q[0] * ax + q[1]) * ax + q[2]) * ax + q[3]) * ax + q[4]) * ax +
            q[5]) *
               ax +
           q[6]) *
              ax +
          q[7];
    ret_val = 0.5 - exp(-x * x) * top / bot + 0.5;
    if (x < 0.0) {
      ret_val = -ret_val;
    }
    return ret_val;
  }
  if (ax >= 5.8) {
    return x > 0 ? 1 : -1;
  }
  x2 = x * x;
  t = 1.0 / x2;
  top = (((r[0] * t + r[1]) * t + r[2]) * t + r[3]) * t + r[4];
  bot = (((s[0] * t + s[1]) * t + s[2]) * t + s[3]) * t + 1.0;
  t = (c - top / (x2 * bot)) / ax;
  ret_val = 0.5 - exp(-x2) * t + 0.5;
  if (x < 0.0) {
    ret_val = -ret_val;
  }
  return ret_val;
}


x86 assembly (clang, -O0):
<erf__>:
push   %rbp
mov    %rsp,%rbp
sub    $0x160,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  0xf10(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
lea    -0x40(%rbp),%rdi
xor    %esi,%esi
mov    $0x28,%edx
call   1030 <memset@plt>
movsd  0xeeb(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xed6(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xec1(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xeac(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xe97(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    0xeeb(%rip),%rax
mov    %rax,-0x60(%rbp)
mov    0xee8(%rip),%rax
mov    %rax,-0x58(%rbp)
mov    0xee5(%rip),%rax
mov    %rax,-0x50(%rbp)
lea    -0xa0(%rbp),%rdi
lea    0xee3(%rip),%rsi
mov    $0x40,%edx
call   1040 <memcpy@plt>
lea    -0xe0(%rbp),%rdi
lea    0xf0b(%rip),%rsi
mov    $0x40,%edx
call   1040 <memcpy@plt>
lea    -0x110(%rbp),%rdi
xor    %esi,%esi
mov    $0x28,%edx
call   1030 <memset@plt>
movsd  0xe1e(%rip),%xmm0
movsd  %xmm0,-0x110(%rbp)
ff
movsd  0xe06(%rip),%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
movsd  0xdee(%rip),%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
movsd  0xdd6(%rip),%xmm0
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  0xdbe(%rip),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
mov    0xed7(%rip),%rax
mov    %rax,-0x130(%rbp)
mov    0xed1(%rip),%rax
mov    %rax,-0x128(%rbp)
mov    0xecb(%rip),%rax
mov    %rax,-0x120(%rbp)
mov    0xec5(%rip),%rax
mov    %rax,-0x118(%rbp)
movsd  -0x10(%rbp),%xmm0
movaps 0xdea(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x150(%rbp)
ff
movsd  0xd56(%rip),%xmm0
ucomisd -0x150(%rbp),%xmm0
ff
jb     13a9 <erf__+0x279>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x140(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x20(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd45(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xcf6(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x158(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
movsd  -0x160(%rbp),%xmm1
ff
divsd  -0x158(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    17ec <erf__+0x6bc>
movsd  0xcaf(%rip),%xmm0
ucomisd -0x150(%rbp),%xmm0
ff
jb     15c3 <erf__+0x493>
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xd8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xd0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xb0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x150(%rbp),%xmm2
ff
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x158(%rbp)
ff
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x10(%rbp),%xmm0
call   1050 <exp@plt>
movaps %xmm0,%xmm1
mulsd  -0x160(%rbp),%xmm1
ff
divsd  -0x158(%rbp),%xmm1
ff
movsd  0xa9c(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  0xa90(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    15b1 <erf__+0x481>
movsd  -0x138(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
movsd  -0x138(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
jmp    17ec <erf__+0x6bc>
movsd  -0x150(%rbp),%xmm0
ff
movsd  0xa95(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1604 <erf__+0x4d4>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
mov    $0xffffffff,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
cmova  %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    17ec <erf__+0x6bc>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x148(%rbp)
ff
movsd  0xa52(%rip),%xmm0
divsd  -0x148(%rbp),%xmm0
ff
movsd  %xmm0,-0x140(%rbp)
ff
movsd  -0x110(%rbp),%xmm0
ff
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x108(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x100(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0xf8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0xf0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0x130(%rbp),%xmm0
ff
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x128(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x120(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x118(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x140(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0x96e(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x158(%rbp)
ff
movsd  -0x18(%rbp),%xmm0
movsd  -0x160(%rbp),%xmm1
ff
movsd  -0x148(%rbp),%xmm2
ff
mulsd  -0x158(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
divsd  -0x150(%rbp),%xmm0
ff
movsd  %xmm0,-0x140(%rbp)
ff
movsd  -0x148(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1050 <exp@plt>
movsd  -0x140(%rbp),%xmm1
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0x86e(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0x862(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    17df <erf__+0x6af>
movsd  -0x138(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
movsd  -0x138(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x160,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<erf__>:
sub    $0x28,%rsp
movapd %xmm0,%xmm4
movapd 0xee0(%rip),%xmm1
andpd  %xmm0,%xmm1
movsd  0xf04(%rip),%xmm0
ucomisd %xmm1,%xmm0
jae    1216 <erf__+0x106>
movsd  0xf42(%rip),%xmm0
ucomisd %xmm1,%xmm0
jae    1297 <erf__+0x187>
ucomisd 0xfb0(%rip),%xmm1
jae    13c2 <erf__+0x2b2>
movapd %xmm4,%xmm0
mulsd  %xmm4,%xmm0
movsd  0xefa(%rip),%xmm3
movapd %xmm4,0x10(%rsp)
movapd %xmm3,%xmm4
divsd  %xmm0,%xmm4
movsd  0xf8c(%rip),%xmm2
mulsd  %xmm4,%xmm2
addsd  0xf88(%rip),%xmm2
mulsd  %xmm4,%xmm2
addsd  0xf84(%rip),%xmm2
mulsd  %xmm4,%xmm2
addsd  0xf80(%rip),%xmm2
mulsd  %xmm4,%xmm2
addsd  0xf7c(%rip),%xmm2
movsd  0xf7c(%rip),%xmm5
mulsd  %xmm4,%xmm5
addsd  0xf78(%rip),%xmm5
mulsd  %xmm4,%xmm5
addsd  0xf74(%rip),%xmm5
mulsd  %xmm4,%xmm5
addsd  0xf70(%rip),%xmm5
mulsd  %xmm4,%xmm5
addsd  %xmm3,%xmm5
mulsd  %xmm0,%xmm5
divsd  %xmm5,%xmm2
movsd  0xf60(%rip),%xmm3
subsd  %xmm2,%xmm3
divsd  %xmm1,%xmm3
movsd  %xmm3,0x8(%rsp)
xorpd  0xe0a(%rip),%xmm0
call   1030 <exp@plt>
mulsd  0x8(%rsp),%xmm0
jmp    137a <erf__+0x26a>
movapd %xmm4,%xmm1
mulsd  %xmm4,%xmm1
movsd  0xe12(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xe0e(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xe0a(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xe06(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xe02(%rip),%xmm0
movsd  0xe02(%rip),%xmm2
movsd  0xe02(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  0xdfe(%rip),%xmm3
addsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm3
addsd  0xdf6(%rip),%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
divsd  %xmm3,%xmm0
mulsd  %xmm4,%xmm0
add    $0x28,%rsp
ret
movsd  0xde9(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xde5(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xde1(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xddd(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdd9(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdd5(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdd1(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdcd(%rip),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0xdc7(%rip),%xmm0
addsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdbf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdbb(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdb7(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdb3(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdaf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xdab(%rip),%xmm0
movsd  %xmm0,0x20(%rsp)
movapd %xmm4,%xmm0
xorpd  0xcb1(%rip),%xmm0
mulsd  %xmm4,%xmm0
movapd %xmm4,0x10(%rsp)
call   1030 <exp@plt>
mulsd  0x8(%rsp),%xmm0
divsd  0x20(%rsp),%xmm0
movsd  0xcae(%rip),%xmm2
movapd %xmm2,%xmm1
subsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
movapd 0xc7a(%rip),%xmm3
xorpd  %xmm1,%xmm3
xorpd  %xmm0,%xmm0
movapd 0x10(%rsp),%xmm2
cmpltsd %xmm0,%xmm2
movapd %xmm2,%xmm0
andnpd %xmm1,%xmm0
andpd  %xmm3,%xmm2
orpd   %xmm0,%xmm2
movapd %xmm2,%xmm0
add    $0x28,%rsp
ret
xorpd  %xmm0,%xmm0
xor    %eax,%eax
ucomisd %xmm0,%xmm4
seta   %al
lea    0xc4a(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm0
add    $0x28,%rsp
ret

LLVM IR (-O0):
@__const.erf__.b = [3 x double] [double 0x3F68A97288DB092F, double 0x3FAB9868E2767FFE, double 0x3FD80D09A5DE569F]
@__const.erf__.p = [8 x double] [double 0xBE825EA4045ABDE7, double 0x3FE20DE3C203E757, double 0x401CD8D727A8CDDC, double 0x404594C3DC92A092, double 0x40631FA8391D60EF, double 0x4075352210BA6046, double 0x407C3EB408CEB084, double 0x4072C75922155EC6]
@__const.erf__.q = [8 x double] [double 1.000000e+00, double 0x402990C1A29EFCEF, double 0x405340028174F3C8, double 0x4071595DFB4ED0B2, double 0x4083F7D794E56A87, double 0x408D1AD52FAE586A, double 0x4088B79B7EBD0214, double 0x4072C75922046925]
@__const.erf__.s = [4 x double] [double 0x405789D77354A0AF, double 0x406763AC89CB8DE3, double 0x4058C13A44E26A46, double 0x403203306BC292DB]
define double @erf__(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca [5 x double]
%6 = alloca [3 x double]
%7 = alloca [8 x double]
%8 = alloca [8 x double]
%9 = alloca [5 x double]
%10 = alloca [4 x double]
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
store double %0, double* %3
store double 0x3FE20DD750429B6A, double* %4
%17 = bitcast [5 x double]* %5 to i8*
%18 = bitcast i8* %17 to [5 x double]*
%19 = getelementptr inbounds [5 x double], [5 x double]* %18, i32 0, i32 0
store double 0x3F14367C68613852, double* %19
%20 = getelementptr inbounds [5 x double], [5 x double]* %18, i32 0, i32 1
store double 0xBF55E9337417A2A8, double* %20
%21 = getelementptr inbounds [5 x double], [5 x double]* %18, i32 0, i32 2
store double 0x3FA08AA11C602E02, double* %21
%22 = getelementptr inbounds [5 x double], [5 x double]* %18, i32 0, i32 3
store double 0x3FA888257A230271, double* %22
%23 = getelementptr inbounds [5 x double], [5 x double]* %18, i32 0, i32 4
store double 0x3FC06EBA8214DB78, double* %23
%24 = bitcast [3 x double]* %6 to i8*
%25 = bitcast [8 x double]* %7 to i8*
%26 = bitcast [8 x double]* %8 to i8*
%27 = bitcast [5 x double]* %9 to i8*
%28 = bitcast i8* %27 to [5 x double]*
%29 = getelementptr inbounds [5 x double], [5 x double]* %28, i32 0, i32 0
store double 0x4000CFC07015ECE7, double* %29
%30 = getelementptr inbounds [5 x double], [5 x double]* %28, i32 0, i32 1
store double 0x403A3CACF5E22C7B, double* %30
%31 = getelementptr inbounds [5 x double], [5 x double]* %28, i32 0, i32 2
store double 0x40355E6AFDBC84CE, double* %31
%32 = getelementptr inbounds [5 x double], [5 x double]* %28, i32 0, i32 3
store double 0x4012A1DF4646A9F7, double* %32
%33 = getelementptr inbounds [5 x double], [5 x double]* %28, i32 0, i32 4
store double 0x3FD20DD75042826F, double* %33
%34 = bitcast [4 x double]* %10 to i8*
%35 = load double, double* %3
%36 = call double @llvm.fabs.f64(double %35)
store double %36, double* %14
%37 = load double, double* %14
%38 = fcmp ole double %37, 5.000000e-01
br i1 %38, label %39, label %79
39: ; preds = %1
%40 = load double, double* %3
%41 = load double, double* %3
%42 = fmul double %40, %41
store double %42, double* %12
%43 = getelementptr inbounds [5 x double], [5 x double]* %5, i64 0, i64 0
%44 = load double, double* %43
%45 = load double, double* %12
%46 = getelementptr inbounds [5 x double], [5 x double]* %5, i64 0, i64 1
%47 = load double, double* %46
%48 = call double @llvm.fmuladd.f64(double %44, double %45, double %47)
%49 = load double, double* %12
%50 = getelementptr inbounds [5 x double], [5 x double]* %5, i64 0, i64 2
%51 = load double, double* %50
%52 = call double @llvm.fmuladd.f64(double %48, double %49, double %51)
%53 = load double, double* %12
%54 = getelementptr inbounds [5 x double], [5 x double]* %5, i64 0, i64 3
%55 = load double, double* %54
%56 = call double @llvm.fmuladd.f64(double %52, double %53, double %55)
%57 = load double, double* %12
%58 = getelementptr inbounds [5 x double], [5 x double]* %5, i64 0, i64 4
%59 = load double, double* %58
%60 = call double @llvm.fmuladd.f64(double %56, double %57, double %59)
%61 = fadd double %60, 1.000000e+00
store double %61, double* %16
%62 = getelementptr inbounds [3 x double], [3 x double]* %6, i64 0, i64 0
%63 = load double, double* %62
%64 = load double, double* %12
%65 = getelementptr inbounds [3 x double], [3 x double]* %6, i64 0, i64 1
%66 = load double, double* %65
%67 = call double @llvm.fmuladd.f64(double %63, double %64, double %66)
%68 = load double, double* %12
%69 = getelementptr inbounds [3 x double], [3 x double]* %6, i64 0, i64 2
%70 = load double, double* %69
%71 = call double @llvm.fmuladd.f64(double %67, double %68, double %70)
%72 = load double, double* %12
%73 = call double @llvm.fmuladd.f64(double %71, double %72, double 1.000000e+00)
store double %73, double* %15
%74 = load double, double* %3
%75 = load double, double* %16
%76 = load double, double* %15
%77 = fdiv double %75, %76
%78 = fmul double %74, %77
store double %78, double* %2
br label %233
79: ; preds = %1
%80 = load double, double* %14
%81 = fcmp ole double %80, 4.000000e+00
br i1 %81, label %82, label %161
82: ; preds = %79
%83 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 0
%84 = load double, double* %83
%85 = load double, double* %14
%86 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 1
%87 = load double, double* %86
%88 = call double @llvm.fmuladd.f64(double %84, double %85, double %87)
%89 = load double, double* %14
%90 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 2
%91 = load double, double* %90
%92 = call double @llvm.fmuladd.f64(double %88, double %89, double %91)
%93 = load double, double* %14
%94 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 3
%95 = load double, double* %94
%96 = call double @llvm.fmuladd.f64(double %92, double %93, double %95)
%97 = load double, double* %14
%98 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 4
%99 = load double, double* %98
%100 = call double @llvm.fmuladd.f64(double %96, double %97, double %99)
%101 = load double, double* %14
%102 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 5
%103 = load double, double* %102
%104 = call double @llvm.fmuladd.f64(double %100, double %101, double %103)
%105 = load double, double* %14
%106 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 6
%107 = load double, double* %106
%108 = call double @llvm.fmuladd.f64(double %104, double %105, double %107)
%109 = load double, double* %14
%110 = getelementptr inbounds [8 x double], [8 x double]* %7, i64 0, i64 7
%111 = load double, double* %110
%112 = call double @llvm.fmuladd.f64(double %108, double %109, double %111)
store double %112, double* %16
%113 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 0
%114 = load double, double* %113
%115 = load double, double* %14
%116 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 1
%117 = load double, double* %116
%118 = call double @llvm.fmuladd.f64(double %114, double %115, double %117)
%119 = load double, double* %14
%120 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 2
%121 = load double, double* %120
%122 = call double @llvm.fmuladd.f64(double %118, double %119, double %121)
%123 = load double, double* %14
%124 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 3
%125 = load double, double* %124
%126 = call double @llvm.fmuladd.f64(double %122, double %123, double %125)
%127 = load double, double* %14
%128 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 4
%129 = load double, double* %128
%130 = call double @llvm.fmuladd.f64(double %126, double %127, double %129)
%131 = load double, double* %14
%132 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 5
%133 = load double, double* %132
%134 = call double @llvm.fmuladd.f64(double %130, double %131, double %133)
%135 = load double, double* %14
%136 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 6
%137 = load double, double* %136
%138 = call double @llvm.fmuladd.f64(double %134, double %135, double %137)
%139 = load double, double* %14
%140 = getelementptr inbounds [8 x double], [8 x double]* %8, i64 0, i64 7
%141 = load double, double* %140
%142 = call double @llvm.fmuladd.f64(double %138, double %139, double %141)
store double %142, double* %15
%143 = load double, double* %3
%144 = fneg double %143
%145 = load double, double* %3
%146 = fmul double %144, %145
%147 = call double @exp(double %146)
%148 = load double, double* %16
%149 = fmul double %147, %148
%150 = load double, double* %15
%151 = fdiv double %149, %150
%152 = fsub double 5.000000e-01, %151
%153 = fadd double %152, 5.000000e-01
store double %153, double* %11
%154 = load double, double* %3
%155 = fcmp olt double %154, 0.000000e+00
br i1 %155, label %156, label %159
156: ; preds = %82
%157 = load double, double* %11
%158 = fneg double %157
store double %158, double* %11
br label %159
159: ; preds = %156, %82
%160 = load double, double* %11
store double %160, double* %2
br label %233
161: ; preds = %79
%162 = load double, double* %14
%163 = fcmp oge double %162, 5.800000e+00
br i1 %163, label %164, label %170
164: ; preds = %161
%165 = load double, double* %3
%166 = fcmp ogt double %165, 0.000000e+00
%167 = zext i1 %166 to i64
%168 = select i1 %166, i32 1, i32 -1
%169 = sitofp i32 %168 to double
store double %169, double* %2
br label %233
170: ; preds = %161
%171 = load double, double* %3
%172 = load double, double* %3
%173 = fmul double %171, %172
store double %173, double* %13
%174 = load double, double* %13
%175 = fdiv double 1.000000e+00, %174
store double %175, double* %12
%176 = getelementptr inbounds [5 x double], [5 x double]* %9, i64 0, i64 0
%177 = load double, double* %176
%178 = load double, double* %12
%179 = getelementptr inbounds [5 x double], [5 x double]* %9, i64 0, i64 1
%180 = load double, double* %179
%181 = call double @llvm.fmuladd.f64(double %177, double %178, double %180)
%182 = load double, double* %12
%183 = getelementptr inbounds [5 x double], [5 x double]* %9, i64 0, i64 2
%184 = load double, double* %183
%185 = call double @llvm.fmuladd.f64(double %181, double %182, double %184)
%186 = load double, double* %12
%187 = getelementptr inbounds [5 x double], [5 x double]* %9, i64 0, i64 3
%188 = load double, double* %187
%189 = call double @llvm.fmuladd.f64(double %185, double %186, double %188)
%190 = load double, double* %12
%191 = getelementptr inbounds [5 x double], [5 x double]* %9, i64 0, i64 4
%192 = load double, double* %191
%193 = call double @llvm.fmuladd.f64(double %189, double %190, double %192)
store double %193, double* %16
%194 = getelementptr inbounds [4 x double], [4 x double]* %10, i64 0, i64 0
%195 = load double, double* %194
%196 = load double, double* %12
%197 = getelementptr inbounds [4 x double], [4 x double]* %10, i64 0, i64 1
%198 = load double, double* %197
%199 = call double @llvm.fmuladd.f64(double %195, double %196, double %198)
%200 = load double, double* %12
%201 = getelementptr inbounds [4 x double], [4 x double]* %10, i64 0, i64 2
%202 = load double, double* %201
%203 = call double @llvm.fmuladd.f64(double %199, double %200, double %202)
%204 = load double, double* %12
%205 = getelementptr inbounds [4 x double], [4 x double]* %10, i64 0, i64 3
%206 = load double, double* %205
%207 = call double @llvm.fmuladd.f64(double %203, double %204, double %206)
%208 = load double, double* %12
%209 = call double @llvm.fmuladd.f64(double %207, double %208, double 1.000000e+00)
store double %209, double* %15
%210 = load double, double* %4
%211 = load double, double* %16
%212 = load double, double* %13
%213 = load double, double* %15
%214 = fmul double %212, %213
%215 = fdiv double %211, %214
%216 = fsub double %210, %215
%217 = load double, double* %14
%218 = fdiv double %216, %217
store double %218, double* %12
%219 = load double, double* %13
%220 = fneg double %219
%221 = call double @exp(double %220)
%222 = load double, double* %12
%223 = fneg double %221
%224 = call double @llvm.fmuladd.f64(double %223, double %222, double 5.000000e-01)
%225 = fadd double %224, 5.000000e-01
store double %225, double* %11
%226 = load double, double* %3
%227 = fcmp olt double %226, 0.000000e+00
br i1 %227, label %228, label %231
228: ; preds = %170
%229 = load double, double* %11
%230 = fneg double %229
store double %230, double* %11
br label %231
231: ; preds = %228, %170
%232 = load double, double* %11
store double %232, double* %2
br label %233
233: ; preds = %231, %164, %159, %39
%234 = load double, double* %2
ret double %234
}

LLVM IR (-O2):
define double @erf__(double %0) {
%2 = tail call double @llvm.fabs.f64(double %0)
%3 = fcmp ugt double %2, 5.000000e-01
br i1 %3, label %16, label %4
4: ; preds = %1
%5 = fmul double %0, %0
%6 = tail call double @llvm.fmuladd.f64(double %5, double 0x3F14367C68613852, double 0xBF55E9337417A2A8)
%7 = tail call double @llvm.fmuladd.f64(double %6, double %5, double 0x3FA08AA11C602E02)
%8 = tail call double @llvm.fmuladd.f64(double %7, double %5, double 0x3FA888257A230271)
%9 = tail call double @llvm.fmuladd.f64(double %8, double %5, double 0x3FC06EBA8214DB78)
%10 = fadd double %9, 1.000000e+00
%11 = tail call double @llvm.fmuladd.f64(double %5, double 0x3F68A97288DB092F, double 0x3FAB9868E2767FFE)
%12 = tail call double @llvm.fmuladd.f64(double %11, double %5, double 0x3FD80D09A5DE569F)
%13 = tail call double @llvm.fmuladd.f64(double %12, double %5, double 1.000000e+00)
%14 = fdiv double %10, %13
%15 = fmul double %14, %0
br label %71
16: ; preds = %1
%17 = fcmp ugt double %2, 4.000000e+00
br i1 %17, label %43, label %18
18: ; preds = %16
%19 = tail call double @llvm.fmuladd.f64(double %2, double 0xBE825EA4045ABDE7, double 0x3FE20DE3C203E757)
%20 = tail call double @llvm.fmuladd.f64(double %19, double %2, double 0x401CD8D727A8CDDC)
%21 = tail call double @llvm.fmuladd.f64(double %20, double %2, double 0x404594C3DC92A092)
%22 = tail call double @llvm.fmuladd.f64(double %21, double %2, double 0x40631FA8391D60EF)
%23 = tail call double @llvm.fmuladd.f64(double %22, double %2, double 0x4075352210BA6046)
%24 = tail call double @llvm.fmuladd.f64(double %23, double %2, double 0x407C3EB408CEB084)
%25 = tail call double @llvm.fmuladd.f64(double %24, double %2, double 0x4072C75922155EC6)
%26 = fadd double %2, 0x402990C1A29EFCEF
%27 = tail call double @llvm.fmuladd.f64(double %26, double %2, double 0x405340028174F3C8)
%28 = tail call double @llvm.fmuladd.f64(double %27, double %2, double 0x4071595DFB4ED0B2)
%29 = tail call double @llvm.fmuladd.f64(double %28, double %2, double 0x4083F7D794E56A87)
%30 = tail call double @llvm.fmuladd.f64(double %29, double %2, double 0x408D1AD52FAE586A)
%31 = tail call double @llvm.fmuladd.f64(double %30, double %2, double 0x4088B79B7EBD0214)
%32 = tail call double @llvm.fmuladd.f64(double %31, double %2, double 0x4072C75922046925)
%33 = fneg double %0
%34 = fmul double %33, %0
%35 = tail call double @exp(double %34)
%36 = fmul double %25, %35
%37 = fdiv double %36, %32
%38 = fsub double 5.000000e-01, %37
%39 = fadd double %38, 5.000000e-01
%40 = fcmp olt double %0, 0.000000e+00
%41 = fneg double %39
%42 = select i1 %40, double %41, double %39
br label %71
43: ; preds = %16
%44 = fcmp ult double %2, 5.800000e+00
br i1 %44, label %48, label %45
45: ; preds = %43
%46 = fcmp ogt double %0, 0.000000e+00
%47 = select i1 %46, double 1.000000e+00, double -1.000000e+00
br label %71
48: ; preds = %43
%49 = fmul double %0, %0
%50 = fdiv double 1.000000e+00, %49
%51 = tail call double @llvm.fmuladd.f64(double %50, double 0x4000CFC07015ECE7, double 0x403A3CACF5E22C7B)
%52 = tail call double @llvm.fmuladd.f64(double %51, double %50, double 0x40355E6AFDBC84CE)
%53 = tail call double @llvm.fmuladd.f64(double %52, double %50, double 0x4012A1DF4646A9F7)
%54 = tail call double @llvm.fmuladd.f64(double %53, double %50, double 0x3FD20DD75042826F)
%55 = tail call double @llvm.fmuladd.f64(double %50, double 0x405789D77354A0AF, double 0x406763AC89CB8DE3)
%56 = tail call double @llvm.fmuladd.f64(double %55, double %50, double 0x4058C13A44E26A46)
%57 = tail call double @llvm.fmuladd.f64(double %56, double %50, double 0x403203306BC292DB)
%58 = tail call double @llvm.fmuladd.f64(double %57, double %50, double 1.000000e+00)
%59 = fmul double %49, %58
%60 = fdiv double %54, %59
%61 = fsub double 0x3FE20DD750429B6A, %60
%62 = fdiv double %61, %2
%63 = fneg double %49
%64 = tail call double @exp(double %63)
%65 = fneg double %64
%66 = tail call double @llvm.fmuladd.f64(double %65, double %62, double 5.000000e-01)
%67 = fadd double %66, 5.000000e-01
%68 = fcmp olt double %0, 0.000000e+00
%69 = fneg double %67
%70 = select i1 %68, double %69, double %67
br label %71
71: ; preds = %48, %45, %18, %4
%72 = phi double [ %15, %4 ], [ %42, %18 ], [ %47, %45 ], [ %70, %48 ]
ret double %72
}