#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 */
scalar_t__ isdigit(char);
scalar_t__ isspace(char);
int pow(double, double);
double atof(char s[]) {
  double value = 0.0;
  double fractional_power = 1.0;
  int sign = 1;
  int str_index = 0;
  double power_of_ten = 0.0;
  for (str_index = 0; isspace(s[str_index]); ++str_index) {
  }
  sign = (s[str_index] == '-' ? -1 : 1);
  if (s[str_index] == '-' || s[str_index] == '+') {
    ++str_index;
  }
  for (value = 0.0; isdigit(s[str_index]); ++str_index) {
    value = value * 10.0 + (s[str_index] - '0');
  }
  if (s[str_index] == 'e' || s[str_index] == 'E') {
    ++str_index;
    int power_of_ten_sign = (s[str_index] == '-' ? -1 : 1);
    if (s[str_index] == '+' || s[str_index] == '-') {
      ++str_index;
    }
    for (power_of_ten = 0.0; isdigit(s[str_index]); ++str_index) {
      power_of_ten = power_of_ten * 10.0 + (s[str_index] - '0');
    }
    power_of_ten *= power_of_ten_sign;
  }
  if (s[str_index] == '.') {
    ++str_index;
    for (fractional_power = 1.0; isdigit(s[str_index]); ++str_index) {
      value = value * 10.0 + (s[str_index] - '0');
      fractional_power *= 10.0;
    }
  }
  if (s[str_index] == 'e' || s[str_index] == 'E') {
    ++str_index;
    int power_of_ten_sign = (s[str_index] == '-' ? -1 : 1);
    if (s[str_index] == '+' || s[str_index] == '-') {
      ++str_index;
    }
    for (power_of_ten = 0.0; isdigit(s[str_index]); ++str_index) {
      power_of_ten = power_of_ten * 10.0 + (s[str_index] - '0');
    }
    power_of_ten *= power_of_ten_sign;
  }
  return (sign * value / fractional_power) * pow(10.0, power_of_ten);
}


x86 assembly (clang, -O0):
<atof>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xeb4(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1040 <isspace@plt>
cmp    $0x0,%rax
je     119c <atof+0x6c>
jmp    118e <atof+0x5e>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    116e <atof+0x3e>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x2d,%edx
cmove  %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     11e5 <atof+0xb5>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
jne    11ee <atof+0xbe>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     124c <atof+0x11c>
movsd  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xdd7(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11f6 <atof+0xc6>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x65,%eax
je     1276 <atof+0x146>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x45,%eax
jne    133e <atof+0x20e>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x2d,%edx
cmove  %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
je     12c8 <atof+0x198>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    12d1 <atof+0x1a1>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     132f <atof+0x1ff>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xcf4(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12d9 <atof+0x1a9>
cvtsi2sdl -0x2c(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    13d6 <atof+0x2a6>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movsd  0xc9c(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     13d1 <atof+0x2a1>
movsd  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xc64(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xc4f(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1369 <atof+0x239>
jmp    13d6 <atof+0x2a6>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x65,%eax
je     1400 <atof+0x2d0>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x45,%eax
jne    14c8 <atof+0x398>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x2d,%edx
cmove  %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
je     1452 <atof+0x322>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    145b <atof+0x32b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     14b9 <atof+0x389>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xb6a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1463 <atof+0x333>
cvtsi2sdl -0x30(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm1
movsd  0xb1f(%rip),%xmm0
call   1050 <pow@plt>
movsd  -0x38(%rbp),%xmm0
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<atof>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %rdi,%r15
mov    $0xffffffffffffffff,%rbx
nopl   0x0(%rax,%rax,1)
movsbl 0x1(%r15,%rbx,1),%edi
call   1040 <isspace@plt>
add    $0x1,%rbx
test   %rax,%rax
jne    1150 <atof+0x20>
mov    %ebx,%eax
mov    (%r15,%rax,1),%r14b
lea    -0x2b(%r14),%eax
xor    %ebp,%ebp
test   $0xfd,%al
sete   %bpl
lea    (%rbx,%rbp,1),%r13
mov    %r13d,%r12d
movsbl (%r15,%r12,1),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     11df <atof+0xaf>
mov    %ebp,%r13d
add    %ebx,%r13d
mov    %ebx,%r12d
add    %r15,%r12
add    %rbp,%r12
xorpd  %xmm2,%xmm2
nop
movsbl (%r12),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xe49(%rip),%xmm2
addsd  %xmm0,%xmm2
movapd %xmm2,(%rsp)
movsbl 0x1(%r12),%edi
add    $0x1,%r12
call   1030 <isdigit@plt>
movapd (%rsp),%xmm2
add    $0x1,%r13d
test   %rax,%rax
jne    11a0 <atof+0x70>
jmp    11e6 <atof+0xb6>
add    %r15,%r12
xorpd  %xmm2,%xmm2
mov    (%r12),%al
or     $0x20,%al
cmp    $0x65,%al
movapd %xmm2,(%rsp)
jne    127f <atof+0x14f>
mov    %r13d,%eax
mov    0x1(%r15,%rax,1),%bl
add    $0x1,%rax
add    $0x2,%r13d
lea    -0x2b(%rbx),%ecx
test   $0xfd,%cl
cmovne %eax,%r13d
movsbl (%r15,%r13,1),%edi
call   1030 <isdigit@plt>
xorpd  %xmm1,%xmm1
test   %rax,%rax
je     126b <atof+0x13b>
cs nopw 0x0(%rax,%rax,1)
movsbl (%r15,%r13,1),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xdb9(%rip),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x20(%rsp)
movsbl 0x1(%r15,%r13,1),%edi
add    $0x1,%r13
call   1030 <isdigit@plt>
movapd 0x20(%rsp),%xmm1
test   %rax,%rax
jne    1230 <atof+0x100>
movapd (%rsp),%xmm2
cmp    $0x2d,%bl
jne    1283 <atof+0x153>
xorpd  0xd93(%rip),%xmm1
jmp    1283 <atof+0x153>
xorpd  %xmm1,%xmm1
movslq %r13d,%r12
movsd  0xd7a(%rip),%xmm3
cmpb   $0x2e,(%r15,%r12,1)
jne    1352 <atof+0x222>
movapd %xmm1,0x20(%rsp)
movslq %r13d,%r13
movsbl 0x1(%r15,%r13,1),%edi
add    $0x1,%r13
call   1030 <isdigit@plt>
test   %rax,%rax
je     133c <atof+0x20c>
lea    (%r15,%r13,1),%rbx
add    $0x1,%rbx
mov    %r13,%r12
shl    $0x20,%r12
movsd  0xd37(%rip),%xmm3
movabs $0x100000000,%rbp
movapd (%rsp),%xmm2
add    %rbp,%r12
movsbl -0x1(%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0xd07(%rip),%xmm1
mulsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
movapd %xmm2,(%rsp)
mulsd  %xmm1,%xmm3
movsd  %xmm3,0x18(%rsp)
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
movsd  0x18(%rsp),%xmm3
movapd (%rsp),%xmm2
add    $0x1,%r13d
add    $0x1,%rbx
test   %rax,%rax
jne    12e0 <atof+0x1b0>
sar    $0x20,%r12
movapd 0x20(%rsp),%xmm1
jmp    1352 <atof+0x222>
mov    %r13,%r12
movapd (%rsp),%xmm2
movapd 0x20(%rsp),%xmm1
movsd  0xcb6(%rip),%xmm3
mov    (%r15,%r12,1),%al
or     $0x20,%al
cmp    $0x65,%al
jne    1400 <atof+0x2d0>
movsd  %xmm3,0x18(%rsp)
movapd %xmm2,(%rsp)
movslq %r13d,%rax
lea    0x1(%rax),%rcx
mov    0x1(%r15,%rax,1),%bl
add    $0x2,%eax
lea    -0x2b(%rbx),%edx
test   $0xfd,%dl
cmovne %ecx,%eax
movslq %eax,%rbp
movsbl (%r15,%rbp,1),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     143f <atof+0x30f>
add    %r15,%rbp
add    $0x1,%rbp
xorpd  %xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsbl -0x1(%rbp),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc3a(%rip),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x20(%rsp)
movsbl 0x0(%rbp),%edi
call   1030 <isdigit@plt>
movapd 0x20(%rsp),%xmm1
add    $0x1,%rbp
test   %rax,%rax
jne    13b0 <atof+0x280>
cmp    $0x2d,%bl
jne    13f5 <atof+0x2c5>
xorpd  0xc1b(%rip),%xmm1
movapd (%rsp),%xmm2
movsd  0x18(%rsp),%xmm3
cmp    $0x2d,%r14b
jne    140e <atof+0x2de>
xorpd  0xc02(%rip),%xmm2
divsd  %xmm3,%xmm2
movapd %xmm2,(%rsp)
movsd  0xbe1(%rip),%xmm0
call   1050 <pow@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  (%rsp),%xmm0
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xorpd  %xmm1,%xmm1
cmp    $0x2d,%bl
je     13ed <atof+0x2bd>
jmp    13f5 <atof+0x2c5>

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

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