double atof(const char *p) {
  int frac;
  double sign, value, scale;
  while (((*p) == ' ' || (*p) == '\t')) {
    p += 1;
  }
  sign = 1.0;
  if (*p == '-') {
    sign = -1.0;
    p += 1;
  } else if (*p == '+') {
    p += 1;
  }
  for (value = 0.0; ((*p) >= '0' && (*p) <= '9'); p += 1) {
    value = value * 10.0 + (*p - '0');
  }
  if (*p == '.') {
    double pow10 = 10.0;
    p += 1;
    while (((*p) >= '0' && (*p) <= '9')) {
      value += (*p - '0') / pow10;
      pow10 *= 10.0;
      p += 1;
    }
  }
  frac = 0;
  scale = 1.0;
  if ((*p == 'e') || (*p == 'E')) {
    unsigned int expon;
    p += 1;
    if (*p == '-') {
      frac = 1;
      p += 1;
    } else if (*p == '+') {
      p += 1;
    }
    for (expon = 0; ((*p) >= '0' && (*p) <= '9'); p += 1) {
      expon = expon * 10 + (*p - '0');
    }
    if (expon > 308)
      expon = 308;
    while (expon >= 50) {
      scale *= 1E50;
      expon -= 50;
    }
    while (expon >= 8) {
      scale *= 1E8;
      expon -= 8;
    }
    while (expon > 0) {
      scale *= 10.0;
      expon -= 1;
    }
  }
  return sign * (frac ? (value / scale) : (value * scale));
}


x86 assembly (clang, -O0):
<atof>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x35(%rbp)
je     112d <atof+0x2d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    113d <atof+0x3d>
jmp    114e <atof+0x4e>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1108 <atof+0x8>
movsd  0xeaa(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1189 <atof+0x89>
movsd  0xe95(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11aa <atof+0xaa>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11a5 <atof+0xa5>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11aa <atof+0xaa>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x36(%rbp)
jl     11d7 <atof+0xd7>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x36(%rbp)
mov    -0x36(%rbp),%al
test   $0x1,%al
jne    11e7 <atof+0xe7>
jmp    1220 <atof+0x120>
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe0e(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11b2 <atof+0xb2>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12c3 <atof+0x1c3>
movsd  0xdd8(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x37(%rbp)
jl     126e <atof+0x16e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x37(%rbp)
mov    -0x37(%rbp),%al
test   $0x1,%al
jne    127e <atof+0x17e>
jmp    12be <atof+0x1be>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
divsd  -0x30(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xd6d(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1249 <atof+0x149>
jmp    12c3 <atof+0x1c3>
movl   $0x0,-0xc(%rbp)
movsd  0xd2e(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
je     12f7 <atof+0x1f7>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
jne    1452 <atof+0x352>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    132b <atof+0x22b>
movl   $0x1,-0xc(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    134c <atof+0x24c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1347 <atof+0x247>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    134c <atof+0x24c>
movl   $0x0,-0x34(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x38(%rbp)
jl     1378 <atof+0x278>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x38(%rbp)
mov    -0x38(%rbp),%al
test   $0x1,%al
jne    1388 <atof+0x288>
jmp    13ac <atof+0x2ac>
imul   $0xa,-0x34(%rbp),%eax
mov    -0x8(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1353 <atof+0x253>
cmpl   $0x134,-0x34(%rbp)
jbe    13c0 <atof+0x2c0>
movl   $0x134,-0x34(%rbp)
jmp    13c5 <atof+0x2c5>
cmpl   $0x32,-0x34(%rbp)
jb     13ef <atof+0x2ef>
movsd  0xc49(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x32,%eax
mov    %eax,-0x34(%rbp)
jmp    13c5 <atof+0x2c5>
jmp    13f4 <atof+0x2f4>
cmpl   $0x8,-0x34(%rbp)
jb     141e <atof+0x31e>
movsd  0xc12(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x34(%rbp)
jmp    13f4 <atof+0x2f4>
jmp    1423 <atof+0x323>
cmpl   $0x0,-0x34(%rbp)
jbe    144d <atof+0x34d>
movsd  0xbdb(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1423 <atof+0x323>
jmp    1452 <atof+0x352>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     147a <atof+0x37a>
movsd  -0x20(%rbp),%xmm0
divsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1489 <atof+0x389>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<atof>:
lea    0xf21(%rip),%rax
nopw   0x0(%rax,%rax,1)
movzbl (%rdi),%ecx
add    $0xf7,%cl
cmp    $0x24,%cl
ja     1131 <atof+0x31>
movzbl %cl,%ecx
movslq (%rax,%rcx,4),%rcx
add    %rax,%rcx
jmp    *%rcx
add    $0x1,%rdi
jmp    1110 <atof+0x10>
add    $0x1,%rdi
movsd  0xec7(%rip),%xmm0
jmp    1147 <atof+0x47>
add    $0x1,%rdi
movsd  0xec1(%rip),%xmm0
mov    (%rdi),%al
lea    -0x30(%rax),%ecx
xorpd  %xmm1,%xmm1
cmp    $0x9,%cl
ja     1195 <atof+0x95>
xorpd  %xmm1,%xmm1
movsd  0xeaf(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl %al,%eax
add    $0xffffffd0,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm2,%xmm1
addsd  %xmm3,%xmm1
movzbl 0x1(%rdi),%eax
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     1170 <atof+0x70>
cmp    $0x2e,%al
jne    11e9 <atof+0xe9>
mov    0x1(%rdi),%al
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0x9,%cl
ja     11e9 <atof+0xe9>
movsd  0xe60(%rip),%xmm2
movapd %xmm2,%xmm3
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl %al,%eax
add    $0xffffffd0,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
divsd  %xmm3,%xmm4
addsd  %xmm4,%xmm1
mulsd  %xmm2,%xmm3
movzbl 0x1(%rdi),%eax
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     11c0 <atof+0xc0>
or     $0x20,%al
cmp    $0x65,%al
jne    1206 <atof+0x106>
mov    0x1(%rdi),%cl
mov    $0x1,%al
cmp    $0x2b,%cl
je     1213 <atof+0x113>
cmp    $0x2d,%cl
jne    1219 <atof+0x119>
add    $0x2,%rdi
xor    %eax,%eax
jmp    121d <atof+0x11d>
movsd  0xdf2(%rip),%xmm2
jmp    1379 <atof+0x279>
add    $0x2,%rdi
jmp    121d <atof+0x11d>
add    $0x1,%rdi
mov    (%rdi),%dl
lea    -0x30(%rdx),%ecx
cmp    $0x9,%cl
ja     1296 <atof+0x196>
add    $0x1,%rdi
xor    %ecx,%ecx
nopl   (%rax)
movzbl %dl,%edx
lea    (%rcx,%rcx,4),%ecx
lea    (%rdx,%rcx,2),%ecx
add    $0xffffffd0,%ecx
movzbl (%rdi),%edx
lea    -0x30(%rdx),%esi
add    $0x1,%rdi
cmp    $0xa,%sil
jb     1230 <atof+0x130>
mov    $0x134,%edx
cmp    $0x133,%ecx
ja     1260 <atof+0x160>
cmp    $0x32,%ecx
jb     12a3 <atof+0x1a3>
mov    %ecx,%edx
movsd  0xd98(%rip),%xmm2
movsd  0xda8(%rip),%xmm3
mov    %edx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mulsd  %xmm3,%xmm2
add    $0xffffffce,%ecx
cmp    $0x31,%ecx
ja     1280 <atof+0x180>
cmp    $0x8,%ecx
jae    12b0 <atof+0x1b0>
jmp    1318 <atof+0x218>
movsd  0xd62(%rip),%xmm2
jmp    1375 <atof+0x275>
movsd  0xd55(%rip),%xmm2
cmp    $0x8,%ecx
jb     1318 <atof+0x218>
lea    -0x8(%rcx),%edx
mov    %edx,%esi
shr    $0x3,%esi
add    $0x1,%esi
and    $0x7,%esi
je     12dd <atof+0x1dd>
shl    $0x3,%esi
xor    %edi,%edi
movsd  0xd53(%rip),%xmm3
nopl   (%rax)
mulsd  %xmm3,%xmm2
add    $0x8,%edi
cmp    %edi,%esi
jne    12d0 <atof+0x1d0>
sub    %edi,%ecx
cmp    $0x38,%edx
jb     1318 <atof+0x218>
movsd  0xd36(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
add    $0xffffffc0,%ecx
cmp    $0x7,%ecx
ja     12f0 <atof+0x1f0>
test   %ecx,%ecx
je     1375 <atof+0x275>
lea    -0x1(%rcx),%edx
mov    %ecx,%esi
and    $0x7,%esi
je     133d <atof+0x23d>
xor    %edi,%edi
movsd  0xce0(%rip),%xmm3
mulsd  %xmm3,%xmm2
add    $0x1,%edi
cmp    %edi,%esi
jne    1330 <atof+0x230>
sub    %edi,%ecx
cmp    $0x7,%edx
jb     1375 <atof+0x275>
movsd  0xcc6(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
add    $0xfffffff8,%ecx
jne    1350 <atof+0x250>
test   %al,%al
je     1382 <atof+0x282>
mulsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
ret
divsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
ret

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

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