#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 const);
scalar_t__ isspace(char const);
int pow(double, double);
double Atof(const char *s) {
  if (!s)
    return 0.0;
  while (isspace(*s))
    ++s;
  int sign = 1;
  double frac = 1.0;
  double result = 0.0;
  if (*s == '-') {
    sign = -1;
    ++s;
  } else if (*s == '+') {
    ++s;
  }
  while (isdigit(*s)) {
    result = result * 10.0 + (*s - '0');
    ++s;
  }
  if (*s == '.') {
    ++s;
    while (isdigit(*s)) {
      result = result * 10.0 + (double)(*s - '0');
      frac *= 10;
      ++s;
    }
    if (*s == 'E' || *s == 'e') {
      ++s;
      double exp = 0.0;
      int fracsign = 1;
      if (*s == '-') {
        fracsign = -1;
        ++s;
      } else if (*s == '+') {
        fracsign = 1;
        ++s;
      }
      while (isdigit(*s)) {
        exp = exp * 10.0 + (*s - '0');
        ++s;
      }
      exp *= fracsign;
      return sign * result / frac * pow(10.0, exp);
    }
    return sign * result / frac;
  } else if (*s == 'E' || *s == 'e') {
    ++s;
    double exp = 0.0;
    int fracsign = 1;
    if (*s == '-') {
      fracsign = -1;
    } else if (*s == '+') {
      fracsign = 1;
    }
    ++s;
    while (isdigit(*s)) {
      exp = exp * 10.0 + (*s - '0');
      ++s;
    }
    exp *= fracsign;
    return sign * result * pow(10.0, exp);
  }
  return result;
}


x86 assembly (clang, -O0):
<Atof>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1154 <Atof+0x24>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    151e <Atof+0x3ee>
jmp    1159 <Atof+0x29>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1040 <isspace@plt>
cmp    $0x0,%rax
je     1180 <Atof+0x50>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1159 <Atof+0x29>
movl   $0x1,-0x14(%rbp)
movsd  0xe71(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    11c4 <Atof+0x94>
movl   $0xffffffff,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11e5 <Atof+0xb5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11e0 <Atof+0xb0>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11e5 <Atof+0xb5>
jmp    11ea <Atof+0xba>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1239 <Atof+0x109>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xded(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11ea <Atof+0xba>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13fa <Atof+0x2ca>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     12b6 <Atof+0x186>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xd82(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xd6d(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1255 <Atof+0x125>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
je     12d6 <Atof+0x1a6>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
jne    13e1 <Atof+0x2b1>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1319 <Atof+0x1e9>
movl   $0xffffffff,-0x34(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1341 <Atof+0x211>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    133c <Atof+0x20c>
movl   $0x1,-0x34(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1341 <Atof+0x211>
jmp    1346 <Atof+0x216>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1395 <Atof+0x265>
movsd  -0x30(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xc91(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1346 <Atof+0x216>
cvtsi2sdl -0x34(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x30(%rbp),%xmm1
movsd  0xc43(%rip),%xmm0
call   1050 <pow@plt>
movsd  -0x50(%rbp),%xmm0
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    151e <Atof+0x3ee>
cvtsi2sdl -0x14(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    151e <Atof+0x3ee>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
je     141a <Atof+0x2ea>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
jne    150f <Atof+0x3df>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x1,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1451 <Atof+0x321>
movl   $0xffffffff,-0x44(%rbp)
jmp    146d <Atof+0x33d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1468 <Atof+0x338>
movl   $0x1,-0x44(%rbp)
jmp    146d <Atof+0x33d>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     14c8 <Atof+0x398>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xb5e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1479 <Atof+0x349>
cvtsi2sdl -0x44(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  0xb15(%rip),%xmm0
call   1050 <pow@plt>
movsd  -0x58(%rbp),%xmm0
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    151e <Atof+0x3ee>
jmp    1514 <Atof+0x3e4>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Atof>:
push   %rbp
push   %r14
push   %rbx
sub    $0x40,%rsp
test   %rdi,%rdi
je     1166 <Atof+0x36>
mov    %rdi,%rbx
movsbl (%rbx),%edi
call   1040 <isspace@plt>
add    $0x1,%rbx
test   %rax,%rax
jne    1140 <Atof+0x10>
mov    -0x1(%rbx),%al
cmp    $0x2b,%al
je     1173 <Atof+0x43>
cmp    $0x2d,%al
jne    116f <Atof+0x3f>
movsd  0xea4(%rip),%xmm0
jmp    117b <Atof+0x4b>
xorpd  %xmm0,%xmm0
jmp    1409 <Atof+0x2d9>
add    $0xffffffffffffffff,%rbx
movsd  0xe85(%rip),%xmm0
movsd  %xmm0,0x10(%rsp)
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
xorpd  %xmm0,%xmm0
test   %rax,%rax
je     11d7 <Atof+0xa7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0xe5b(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1030 <isdigit@plt>
movsd  0x8(%rsp),%xmm0
test   %rax,%rax
jne    11a0 <Atof+0x70>
mov    (%rbx),%al
cmp    $0x65,%al
je     1276 <Atof+0x146>
cmp    $0x45,%al
je     1276 <Atof+0x146>
cmp    $0x2e,%al
jne    1409 <Atof+0x2d9>
movsd  %xmm0,0x8(%rsp)
lea    0x1(%rbx),%r14
movsbl 0x1(%rbx),%edi
call   1030 <isdigit@plt>
movsd  0xdf4(%rip),%xmm2
test   %rax,%rax
je     130c <Atof+0x1dc>
movsd  0x8(%rsp),%xmm1
nopl   0x0(%rax,%rax,1)
movsbl (%r14),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0xdda(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
mulsd  %xmm3,%xmm2
movsd  %xmm2,0x20(%rsp)
movsbl 0x1(%r14),%edi
add    $0x1,%r14
call   1030 <isdigit@plt>
movsd  0x8(%rsp),%xmm1
movsd  0x20(%rsp),%xmm2
test   %rax,%rax
jne    1220 <Atof+0xf0>
lea    -0x1(%r14),%rbx
jmp    1312 <Atof+0x1e2>
movsd  %xmm0,0x8(%rsp)
mov    0x1(%rbx),%bpl
movsbl 0x2(%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     1300 <Atof+0x1d0>
add    $0x3,%rbx
xorpd  %xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
movsbl -0x1(%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xd5a(%rip),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x20(%rsp)
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
movapd 0x20(%rsp),%xmm1
add    $0x1,%rbx
test   %rax,%rax
jne    12a0 <Atof+0x170>
cmp    $0x2d,%bpl
jne    12e5 <Atof+0x1b5>
xorpd  0xd3b(%rip),%xmm1
movsd  0x8(%rsp),%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,0x10(%rsp)
jmp    13ef <Atof+0x2bf>
xorpd  %xmm1,%xmm1
cmp    $0x2d,%bpl
je     12dd <Atof+0x1ad>
jmp    12e5 <Atof+0x1b5>
movsd  0x8(%rsp),%xmm1
mov    (%r14),%al
or     $0x20,%al
cmp    $0x65,%al
jne    134e <Atof+0x21e>
mov    0x2(%rbx),%al
movsd  0xcda(%rip),%xmm0
cmp    $0x2b,%al
movsd  %xmm1,0x8(%rsp)
movsd  %xmm2,0x20(%rsp)
je     1361 <Atof+0x231>
cmp    $0x2d,%al
jne    136d <Atof+0x23d>
add    $0x3,%rbx
movsd  0xcc2(%rip),%xmm0
movsd  %xmm0,0x18(%rsp)
jmp    1377 <Atof+0x247>
movsd  0x10(%rsp),%xmm0
mulsd  %xmm1,%xmm0
divsd  %xmm2,%xmm0
jmp    1409 <Atof+0x2d9>
movsd  %xmm0,0x18(%rsp)
add    $0x3,%rbx
jmp    1377 <Atof+0x247>
movsd  %xmm0,0x18(%rsp)
add    $0x2,%rbx
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     13c9 <Atof+0x299>
add    $0x1,%rbx
xorpd  %xmm2,%xmm2
nopl   0x0(%rax)
movsbl -0x1(%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc6a(%rip),%xmm2
addsd  %xmm0,%xmm2
movsd  %xmm2,0x38(%rsp)
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
movsd  0x38(%rsp),%xmm2
add    $0x1,%rbx
test   %rax,%rax
jne    1390 <Atof+0x260>
jmp    13cd <Atof+0x29d>
xorpd  %xmm2,%xmm2
movsd  0x18(%rsp),%xmm1
mulsd  %xmm2,%xmm1
movsd  0x10(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
divsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0xc19(%rip),%xmm0
call   1050 <pow@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x10(%rsp),%xmm0
add    $0x40,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

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

LLVM IR (-O2):
define double @Atof(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %124, label %3
3: ; preds = %1, %3
%4 = phi i8* [ %8, %3 ], [ %0, %1 ]
%5 = load i8, i8* %4
%6 = tail call i64 @isspace(i8 signext %5)
%7 = icmp eq i64 %6, 0
%8 = getelementptr inbounds i8, i8* %4, i64 1
br i1 %7, label %9, label %3
9: ; preds = %3
%10 = load i8, i8* %4
switch i8 %10, label %13 [
i8 45, label %11
i8 43, label %12
]
11: ; preds = %9
br label %13
12: ; preds = %9
br label %13
13: ; preds = %9, %12, %11
%14 = phi i8* [ %8, %11 ], [ %8, %12 ], [ %4, %9 ]
%15 = phi double [ -1.000000e+00, %11 ], [ 1.000000e+00, %12 ], [ 1.000000e+00, %9 ]
%16 = load i8, i8* %14
%17 = tail call i64 @isdigit(i8 signext %16)
%18 = icmp eq i64 %17, 0
br i1 %18, label %31, label %19
19: ; preds = %13, %19
%20 = phi double [ %26, %19 ], [ 0.000000e+00, %13 ]
%21 = phi i8* [ %27, %19 ], [ %14, %13 ]
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = add nsw i32 %23, -48
%25 = sitofp i32 %24 to double
%26 = tail call double @llvm.fmuladd.f64(double %20, double 1.000000e+01, double %25)
%27 = getelementptr inbounds i8, i8* %21, i64 1
%28 = load i8, i8* %27
%29 = tail call i64 @isdigit(i8 signext %28)
%30 = icmp eq i64 %29, 0
br i1 %30, label %31, label %19
31: ; preds = %19, %13
%32 = phi i8* [ %14, %13 ], [ %27, %19 ]
%33 = phi double [ 0.000000e+00, %13 ], [ %26, %19 ]
%34 = load i8, i8* %32
switch i8 %34, label %124 [
i8 46, label %35
i8 69, label %96
i8 101, label %96
]
35: ; preds = %31
%36 = getelementptr inbounds i8, i8* %32, i64 1
%37 = load i8, i8* %36
%38 = tail call i64 @isdigit(i8 signext %37)
%39 = icmp eq i64 %38, 0
br i1 %39, label %54, label %40
40: ; preds = %35, %40
%41 = phi i8* [ %50, %40 ], [ %36, %35 ]
%42 = phi double [ %48, %40 ], [ %33, %35 ]
%43 = phi double [ %49, %40 ], [ 1.000000e+00, %35 ]
%44 = load i8, i8* %41
%45 = sext i8 %44 to i32
%46 = add nsw i32 %45, -48
%47 = sitofp i32 %46 to double
%48 = tail call double @llvm.fmuladd.f64(double %42, double 1.000000e+01, double %47)
%49 = fmul double %43, 1.000000e+01
%50 = getelementptr inbounds i8, i8* %41, i64 1
%51 = load i8, i8* %50
%52 = tail call i64 @isdigit(i8 signext %51)
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %40
54: ; preds = %40, %35
%55 = phi i8* [ %32, %35 ], [ %41, %40 ]
%56 = phi double [ 1.000000e+00, %35 ], [ %49, %40 ]
%57 = phi double [ %33, %35 ], [ %48, %40 ]
%58 = phi i8* [ %36, %35 ], [ %50, %40 ]
%59 = load i8, i8* %58
switch i8 %59, label %93 [
i8 69, label %60
i8 101, label %60
]
60: ; preds = %54, %54
%61 = getelementptr inbounds i8, i8* %55, i64 2
%62 = load i8, i8* %61
switch i8 %62, label %67 [
i8 45, label %63
i8 43, label %65
]
63: ; preds = %60
%64 = getelementptr inbounds i8, i8* %55, i64 3
br label %67
65: ; preds = %60
%66 = getelementptr inbounds i8, i8* %55, i64 3
br label %67
67: ; preds = %60, %65, %63
%68 = phi i8* [ %64, %63 ], [ %66, %65 ], [ %61, %60 ]
%69 = phi double [ -1.000000e+00, %63 ], [ 1.000000e+00, %65 ], [ 1.000000e+00, %60 ]
%70 = load i8, i8* %68
%71 = tail call i64 @isdigit(i8 signext %70)
%72 = icmp eq i64 %71, 0
br i1 %72, label %85, label %73
73: ; preds = %67, %73
%74 = phi double [ %80, %73 ], [ 0.000000e+00, %67 ]
%75 = phi i8* [ %81, %73 ], [ %68, %67 ]
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = add nsw i32 %77, -48
%79 = sitofp i32 %78 to double
%80 = tail call double @llvm.fmuladd.f64(double %74, double 1.000000e+01, double %79)
%81 = getelementptr inbounds i8, i8* %75, i64 1
%82 = load i8, i8* %81
%83 = tail call i64 @isdigit(i8 signext %82)
%84 = icmp eq i64 %83, 0
br i1 %84, label %85, label %73
85: ; preds = %73, %67
%86 = phi double [ 0.000000e+00, %67 ], [ %80, %73 ]
%87 = fmul double %69, %86
%88 = fmul double %15, %57
%89 = fdiv double %88, %56
%90 = tail call i32 @pow(double 1.000000e+01, double %87)
%91 = sitofp i32 %90 to double
%92 = fmul double %89, %91
br label %124
93: ; preds = %54
%94 = fmul double %15, %57
%95 = fdiv double %94, %56
br label %124
96: ; preds = %31, %31
%97 = getelementptr inbounds i8, i8* %32, i64 1
%98 = load i8, i8* %97
%99 = icmp eq i8 %98, 45
%100 = getelementptr inbounds i8, i8* %32, i64 2
%101 = load i8, i8* %100
%102 = tail call i64 @isdigit(i8 signext %101)
%103 = icmp eq i64 %102, 0
br i1 %103, label %116, label %104
104: ; preds = %96, %104
%105 = phi double [ %111, %104 ], [ 0.000000e+00, %96 ]
%106 = phi i8* [ %112, %104 ], [ %100, %96 ]
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = add nsw i32 %108, -48
%110 = sitofp i32 %109 to double
%111 = tail call double @llvm.fmuladd.f64(double %105, double 1.000000e+01, double %110)
%112 = getelementptr inbounds i8, i8* %106, i64 1
%113 = load i8, i8* %112
%114 = tail call i64 @isdigit(i8 signext %113)
%115 = icmp eq i64 %114, 0
br i1 %115, label %116, label %104
116: ; preds = %104, %96
%117 = phi double [ 0.000000e+00, %96 ], [ %111, %104 ]
%118 = fneg double %117
%119 = select i1 %99, double %118, double %117
%120 = fmul double %15, %33
%121 = tail call i32 @pow(double 1.000000e+01, double %119)
%122 = sitofp i32 %121 to double
%123 = fmul double %120, %122
br label %124
124: ; preds = %85, %93, %116, %31, %1
%125 = phi double [ 0.000000e+00, %1 ], [ %92, %85 ], [ %95, %93 ], [ %123, %116 ], [ %33, %31 ]
ret double %125
}