#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 HUGE_VAL;
double strtod(const char *cp, char **endptr) {
  double num, dem;
  extern double pow10(int);
  int neg, eneg, dig, predig, exp, c;
  const char *p;
  p = cp;
  num = 0;
  neg = 0;
  dig = 0;
  predig = 0;
  exp = 0;
  eneg = 0;
  c = *p++;
  while (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\v' ||
         c == '\r')
    c = *p++;
  if (c == '-' || c == '+') {
    if (c == '-')
      neg = 1;
    c = *p++;
  }
  while (c >= '0' && c <= '9') {
    num = num * 10 + c - '0';
    predig++;
    c = *p++;
  }
  if (c == '.')
    c = *p++;
  while (c >= '0' && c <= '9') {
    num = num * 10 + c - '0';
    dig++;
    c = *p++;
  }
  if (dig + predig == 0) {
    if (endptr)
      *endptr = (char *)cp;
    return 0.0;
  }
  if (c == 'e' || c == 'E') {
    c = *p++;
    if (c == '-' || c == '+') {
      if (c == '-') {
        dig = -dig;
        eneg = 1;
      }
      c = *p++;
    }
    while (c >= '0' && c <= '9') {
      exp = exp * 10 + c - '0';
      c = *p++;
    }
  }
  exp -= dig;
  if (exp < 0) {
    exp = -exp;
    eneg = !eneg;
  }
  dem = pow10(exp);
  if (dem == HUGE_VAL)
    num = eneg ? 0.0 : HUGE_VAL;
  else if (dem == 0)
    num = eneg ? HUGE_VAL : 0.0;
  else if (eneg)
    num /= dem;
  else
    num *= dem;
  if (neg)
    num = -num;
  if (endptr) {
    *endptr = (char *)--p;
    while (p > cp) {
      c = *--p;
      if (c != '-' && c != '+' && c != 'e' && c != 'E')
        break;
      (*endptr)--;
    }
  }
  return num;
}


x86 assembly (clang, -O0):
<strtod>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    $0x1,%al
cmpl   $0x20,-0x40(%rbp)
mov    %al,-0x49(%rbp)
je     11bd <strtod+0xad>
mov    $0x1,%al
cmpl   $0x9,-0x40(%rbp)
mov    %al,-0x49(%rbp)
je     11bd <strtod+0xad>
mov    $0x1,%al
cmpl   $0xa,-0x40(%rbp)
mov    %al,-0x49(%rbp)
je     11bd <strtod+0xad>
mov    $0x1,%al
cmpl   $0xc,-0x40(%rbp)
mov    %al,-0x49(%rbp)
je     11bd <strtod+0xad>
mov    $0x1,%al
cmpl   $0xb,-0x40(%rbp)
mov    %al,-0x49(%rbp)
je     11bd <strtod+0xad>
cmpl   $0xd,-0x40(%rbp)
sete   %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    11cd <strtod+0xbd>
jmp    11e7 <strtod+0xd7>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    1168 <strtod+0x58>
cmpl   $0x2d,-0x40(%rbp)
je     11fb <strtod+0xeb>
cmpl   $0x2b,-0x40(%rbp)
jne    1221 <strtod+0x111>
cmpl   $0x2d,-0x40(%rbp)
jne    120c <strtod+0xfc>
movl   $0x1,-0x2c(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    1226 <strtod+0x116>
xor    %eax,%eax
cmpl   $0x30,-0x40(%rbp)
mov    %al,-0x4a(%rbp)
jl     123f <strtod+0x12f>
cmpl   $0x39,-0x40(%rbp)
setle  %al
mov    %al,-0x4a(%rbp)
mov    -0x4a(%rbp),%al
test   $0x1,%al
jne    124f <strtod+0x13f>
jmp    129d <strtod+0x18d>
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x40(%rbp),%xmm1
movsd  0xda7(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd8f(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    1226 <strtod+0x116>
cmpl   $0x2e,-0x40(%rbp)
jne    12bc <strtod+0x1ac>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    12c1 <strtod+0x1b1>
xor    %eax,%eax
cmpl   $0x30,-0x40(%rbp)
mov    %al,-0x4b(%rbp)
jl     12da <strtod+0x1ca>
cmpl   $0x39,-0x40(%rbp)
setle  %al
mov    %al,-0x4b(%rbp)
mov    -0x4b(%rbp),%al
test   $0x1,%al
jne    12ea <strtod+0x1da>
jmp    1338 <strtod+0x228>
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x40(%rbp),%xmm1
movsd  0xd0c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xcf4(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    12c1 <strtod+0x1b1>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    $0x0,%eax
jne    136a <strtod+0x25a>
cmpq   $0x0,-0x18(%rbp)
je     135d <strtod+0x24d>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1606 <strtod+0x4f6>
cmpl   $0x65,-0x40(%rbp)
je     137e <strtod+0x26e>
cmpl   $0x45,-0x40(%rbp)
jne    142f <strtod+0x31f>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x2d,-0x40(%rbp)
je     13a7 <strtod+0x297>
cmpl   $0x2b,-0x40(%rbp)
jne    13d5 <strtod+0x2c5>
cmpl   $0x2d,-0x40(%rbp)
jne    13c0 <strtod+0x2b0>
xor    %eax,%eax
sub    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    13da <strtod+0x2ca>
xor    %eax,%eax
cmpl   $0x30,-0x40(%rbp)
mov    %al,-0x4c(%rbp)
jl     13f3 <strtod+0x2e3>
cmpl   $0x39,-0x40(%rbp)
setle  %al
mov    %al,-0x4c(%rbp)
mov    -0x4c(%rbp),%al
test   $0x1,%al
jne    1403 <strtod+0x2f3>
jmp    142a <strtod+0x31a>
imul   $0xa,-0x3c(%rbp),%eax
add    -0x40(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
jmp    13da <strtod+0x2ca>
jmp    142f <strtod+0x31f>
mov    -0x34(%rbp),%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jge    145d <strtod+0x34d>
xor    %eax,%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x30(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0x3c(%rbp),%edi
call   1030 <pow10@plt>
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    0x2b72(%rip),%rax
ucomisd (%rax),%xmm0
jne    14bc <strtod+0x3ac>
jp     14bc <strtod+0x3ac>
cmpl   $0x0,-0x30(%rbp)
je     149d <strtod+0x38d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    14ad <strtod+0x39d>
mov    0x2b44(%rip),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    154a <strtod+0x43a>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    150f <strtod+0x3ff>
jp     150f <strtod+0x3ff>
cmpl   $0x0,-0x30(%rbp)
je     14f3 <strtod+0x3e3>
mov    0x2b03(%rip),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1500 <strtod+0x3f0>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1500 <strtod+0x3f0>
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1545 <strtod+0x435>
cmpl   $0x0,-0x30(%rbp)
je     1531 <strtod+0x421>
movsd  -0x28(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1540 <strtod+0x430>
movsd  -0x28(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1545 <strtod+0x435>
jmp    154a <strtod+0x43a>
cmpl   $0x0,-0x2c(%rbp)
je     1575 <strtod+0x465>
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     15fc <strtod+0x4ec>
mov    -0x48(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x48(%rbp),%rax
cmp    -0x10(%rbp),%rax
jbe    15f7 <strtod+0x4e7>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x48(%rbp)
movsbl -0x1(%rax),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x2d,-0x40(%rbp)
je     15e4 <strtod+0x4d4>
cmpl   $0x2b,-0x40(%rbp)
je     15e4 <strtod+0x4d4>
cmpl   $0x65,-0x40(%rbp)
je     15e4 <strtod+0x4d4>
cmpl   $0x45,-0x40(%rbp)
je     15e4 <strtod+0x4d4>
jmp    15f7 <strtod+0x4e7>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,(%rax)
jmp    1593 <strtod+0x483>
jmp    15fc <strtod+0x4ec>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtod>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r14
mov    %rdi,%r15
lea    0x1(%rdi),%rbx
jmp    1134 <strtod+0x24>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rbx
movzbl -0x1(%rbx),%ecx
lea    -0x9(%rcx),%eax
cmp    $0x5,%al
jb     1130 <strtod+0x20>
cmp    $0x20,%cl
je     1130 <strtod+0x20>
cmp    $0x2b,%cl
je     1156 <strtod+0x46>
cmp    $0x2d,%cl
jne    1161 <strtod+0x51>
mov    $0x1,%r12d
jmp    1159 <strtod+0x49>
xor    %r12d,%r12d
mov    (%rbx),%cl
add    $0x1,%rbx
jmp    1164 <strtod+0x54>
xor    %r12d,%r12d
lea    -0x30(%rcx),%eax
cmp    $0x9,%al
ja     11c4 <strtod+0xb4>
xorpd  %xmm3,%xmm3
xor    %eax,%eax
movsd  0xe87(%rip),%xmm0
movsd  0xe87(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl %cl,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
mulsd  %xmm0,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
movzbl (%rbx,%rax,1),%ecx
lea    -0x30(%rcx),%edx
add    $0x1,%rax
cmp    $0xa,%dl
jb     1190 <strtod+0x80>
mov    %eax,%edx
neg    %edx
add    %rax,%rbx
cmp    $0x2e,%cl
je     11cf <strtod+0xbf>
jmp    11d5 <strtod+0xc5>
xor    %edx,%edx
xorpd  %xmm3,%xmm3
cmp    $0x2e,%cl
jne    11d5 <strtod+0xc5>
mov    (%rbx),%cl
add    $0x1,%rbx
movsbl %cl,%esi
lea    -0x30(%rsi),%edi
xor    %eax,%eax
cmp    $0x9,%edi
ja     122c <strtod+0x11c>
xor    %eax,%eax
movsd  0xe14(%rip),%xmm0
movsd  0xe14(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsbl %cl,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
mulsd  %xmm0,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
movzbl (%rbx,%rax,1),%ecx
movsbl %cl,%esi
lea    -0x30(%rsi),%edi
add    $0x1,%rax
cmp    $0xa,%edi
jb     1200 <strtod+0xf0>
add    %rax,%rbx
cmp    %edx,%eax
jne    1245 <strtod+0x135>
xorpd  %xmm0,%xmm0
test   %r14,%r14
je     1393 <strtod+0x283>
mov    %r15,(%r14)
jmp    1393 <strtod+0x283>
and    $0xffffffdf,%esi
xor    %ecx,%ecx
cmp    $0x45,%esi
movsd  %xmm3,0x8(%rsp)
jne    1277 <strtod+0x167>
mov    (%rbx),%sil
xor    %ecx,%ecx
cmp    $0x2b,%sil
je     126d <strtod+0x15d>
cmp    $0x2d,%sil
jne    127b <strtod+0x16b>
neg    %eax
mov    $0x1,%ecx
mov    0x1(%rbx),%sil
add    $0x2,%rbx
jmp    127f <strtod+0x16f>
xor    %edx,%edx
jmp    12ad <strtod+0x19d>
add    $0x1,%rbx
lea    -0x30(%rsi),%edi
xor    %edx,%edx
cmp    $0x9,%dil
ja     12ad <strtod+0x19d>
xor    %edx,%edx
nopl   0x0(%rax)
movzbl %sil,%esi
lea    (%rdx,%rdx,4),%edx
lea    (%rsi,%rdx,2),%edx
add    $0xffffffd0,%edx
movzbl (%rbx),%esi
add    $0x1,%rbx
lea    -0x30(%rsi),%edi
cmp    $0xa,%dil
jb     1290 <strtod+0x180>
sub    %eax,%edx
xor    %ebp,%ebp
test   %ecx,%ecx
sete   %bpl
test   %edx,%edx
cmovns %ecx,%ebp
mov    %edx,%edi
neg    %edi
cmovs  %edx,%edi
call   1030 <pow10@plt>
movapd %xmm0,%xmm1
mov    0x2d15(%rip),%rax
movsd  (%rax),%xmm0
ucomisd %xmm0,%xmm1
jne    12f2 <strtod+0x1e2>
jp     12f2 <strtod+0x1e2>
test   %ebp,%ebp
jne    1311 <strtod+0x201>
test   %r12d,%r12d
jne    1340 <strtod+0x230>
test   %r14,%r14
jne    134d <strtod+0x23d>
jmp    1393 <strtod+0x283>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    131c <strtod+0x20c>
jp     131c <strtod+0x20c>
test   %ebp,%ebp
je     1306 <strtod+0x1f6>
movapd %xmm0,%xmm2
movapd %xmm2,%xmm0
test   %r12d,%r12d
je     12e8 <strtod+0x1d8>
jmp    1340 <strtod+0x230>
xorpd  %xmm0,%xmm0
test   %r12d,%r12d
je     12e8 <strtod+0x1d8>
jmp    1340 <strtod+0x230>
test   %ebp,%ebp
je     1331 <strtod+0x221>
movsd  0x8(%rsp),%xmm0
divsd  %xmm1,%xmm0
test   %r12d,%r12d
je     12e8 <strtod+0x1d8>
jmp    1340 <strtod+0x230>
movsd  0x8(%rsp),%xmm0
mulsd  %xmm1,%xmm0
test   %r12d,%r12d
je     12e8 <strtod+0x1d8>
xorpd  0xcc8(%rip),%xmm0
test   %r14,%r14
je     1393 <strtod+0x283>
lea    -0x1(%rbx),%rax
mov    %rax,(%r14)
cmp    %r15,%rax
jbe    1393 <strtod+0x283>
add    $0xfffffffffffffffe,%rbx
movabs $0x400000004000005,%rax
nopw   0x0(%rax,%rax,1)
movzbl (%rbx),%ecx
add    $0xd5,%cl
cmp    $0x3a,%cl
ja     1393 <strtod+0x283>
movzbl %cl,%ecx
bt     %rcx,%rax
jae    1393 <strtod+0x283>
mov    %rbx,(%r14)
lea    -0x1(%rbx),%rcx
cmp    %r15,%rbx
mov    %rcx,%rbx
ja     1370 <strtod+0x260>
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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