double atof(char line[]) {
  double val = 0.0;
  int i, sign, power, esign, epower, etimes;
  for (i = 0; line[i] == ' '; i++)
    ;
  if (line[i] == '-') {
    sign = -1;
    i++;
  } else {
    sign = 1;
  }
  while (line[i] != '.' && line[i] != 'e' && line[i] != 'E' &&
         line[i] != '\0') {
    val = (10.0 * val + line[i] - '0');
    i++;
  }
  if (line[i] == '.') {
    i++;
  }
  power = 1.0;
  while (line[i] != 'e' && line[i] != 'E' && line[i] != '\0') {
    val = (10.0 * val + line[i] - '0');
    power *= 10.0;
    i++;
  }
  epower = 0;
  if (line[i] == 'e' || line[i] == 'E') {
    i++;
    if (line[i] == '-') {
      i++;
      esign = -1;
    } else {
      esign = 1;
    }
    while (line[i] != '\0') {
      epower = epower * 10 + line[i] - '0';
      i++;
    }
  }
  etimes = 1;
  while (epower > 0) {
    etimes *= 10;
    epower--;
  }
  val = sign * val / power;
  if (esign < 0) {
    val /= etimes;
  } else {
    val *= etimes;
  }
  return val;
  return val;
}


x86 assembly (clang, -O0):
<atof>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    113f <atof+0x3f>
jmp    1131 <atof+0x31>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1117 <atof+0x17>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1169 <atof+0x69>
movl   $0xffffffff,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1170 <atof+0x70>
movl   $0x1,-0x18(%rbp)
jmp    1175 <atof+0x75>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x2e,%ecx
mov    %al,-0x29(%rbp)
je     11d8 <atof+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x65,%ecx
mov    %al,-0x29(%rbp)
je     11d8 <atof+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x45,%ecx
mov    %al,-0x29(%rbp)
je     11d8 <atof+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    11e8 <atof+0xe8>
jmp    122c <atof+0x12c>
movsd  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
movsd  0xdfb(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xdf3(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1175 <atof+0x75>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    124a <atof+0x14a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x65,%ecx
mov    %al,-0x2a(%rbp)
je     129a <atof+0x19a>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x45,%ecx
mov    %al,-0x2a(%rbp)
je     129a <atof+0x19a>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
test   $0x1,%al
jne    12aa <atof+0x1aa>
jmp    1306 <atof+0x206>
movsd  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm1
movsd  0xd39(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd31(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm0
movsd  0xd13(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1251 <atof+0x151>
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x65,%eax
je     1337 <atof+0x237>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x45,%eax
jne    13b6 <atof+0x2b6>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    136a <atof+0x26a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
movl   $0xffffffff,-0x20(%rbp)
jmp    1371 <atof+0x271>
movl   $0x1,-0x20(%rbp)
jmp    1376 <atof+0x276>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     13b1 <atof+0x2b1>
imul   $0xa,-0x24(%rbp),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x24(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1376 <atof+0x276>
jmp    13b6 <atof+0x2b6>
movl   $0x1,-0x28(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    13dc <atof+0x2dc>
imul   $0xa,-0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    13bd <atof+0x2bd>
cvtsi2sdl -0x18(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    1416 <atof+0x316>
cvtsi2sdl -0x28(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1425 <atof+0x325>
cvtsi2sdl -0x28(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<atof>:
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%rdi,%rax,1),%ecx
cmp    $0x20,%cl
jne    111f <atof+0x1f>
add    $0x1,%rax
jmp    1110 <atof+0x10>
cmp    $0x2d,%cl
jne    1132 <atof+0x32>
add    $0x1,%rax
movsd  0xed0(%rip),%xmm0
jmp    113a <atof+0x3a>
movsd  0xece(%rip),%xmm0
movslq %eax,%rcx
add    %rdi,%rcx
xorpd  %xmm1,%xmm1
movsd  0xec4(%rip),%xmm3
movsd  0xec4(%rip),%xmm4
movabs $0x80000000800001,%r8
xchg   %ax,%ax
movzbl (%rcx),%esi
lea    -0x2e(%rsi),%edx
cmp    $0x37,%dl
ja     1174 <atof+0x74>
movzbl %dl,%edx
bt     %rdx,%r8
jb     1199 <atof+0x99>
test   %sil,%sil
je     1199 <atof+0x99>
movsbl %sil,%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm4,%xmm1
add    $0x1,%eax
add    $0x1,%rcx
jmp    1160 <atof+0x60>
xor    %edx,%edx
cmp    $0x2e,%sil
sete   %dl
lea    (%rdx,%rax,1),%r8d
lea    (%rdx,%rax,1),%ecx
add    $0x2,%ecx
lea    (%rdx,%rax,1),%esi
add    $0x1,%esi
movslq %r8d,%rax
add    %rdi,%rax
movsd  0xe48(%rip),%xmm2
movzbl (%rax),%edx
cmp    $0x65,%dl
je     1203 <atof+0x103>
cmp    $0x45,%dl
je     1203 <atof+0x103>
test   %dl,%dl
je     1295 <atof+0x195>
movsbl %dl,%edx
xorps  %xmm5,%xmm5
cvtsi2sd %edx,%xmm5
mulsd  %xmm3,%xmm1
addsd  %xmm5,%xmm1
mulsd  %xmm3,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
addsd  %xmm4,%xmm1
add    $0x1,%ecx
add    $0x1,%esi
add    $0x1,%rax
jmp    11c0 <atof+0xc0>
movslq %esi,%rax
mov    (%rdi,%rax,1),%r8b
cmp    $0x2d,%r8b
cmovne %esi,%ecx
movslq %ecx,%rcx
mov    (%rdi,%rcx,1),%al
movq   0xde9(%rip),%xmm3
test   %al,%al
je     13b4 <atof+0x2b4>
lea    (%rcx,%rdi,1),%rdx
add    $0x1,%rdx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl %al,%eax
lea    (%rcx,%rcx,4),%ecx
lea    (%rax,%rcx,2),%ecx
add    $0xffffffd0,%ecx
movzbl (%rdx),%eax
add    $0x1,%rdx
test   %al,%al
jne    1240 <atof+0x140>
test   %ecx,%ecx
jle    13b4 <atof+0x2b4>
mov    $0x1,%esi
cmp    $0x8,%ecx
jb     138e <atof+0x28e>
mov    %ecx,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%eax
mov    %eax,%edi
shr    $0x3,%edi
add    $0x1,%edi
mov    %edi,%esi
and    $0x7,%esi
cmp    $0x38,%eax
jae    12aa <atof+0x1aa>
movdqa 0xd91(%rip),%xmm3
movdqa %xmm3,%xmm4
jmp    130b <atof+0x20b>
mulsd  %xmm1,%xmm0
divsd  %xmm2,%xmm0
movq   0xd63(%rip),%xmm3
jmp    13c7 <atof+0x2c7>
and    $0xfffffff8,%edi
movdqa 0xd6b(%rip),%xmm3
movdqa 0xd73(%rip),%xmm5
movdqa %xmm3,%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
pshufd $0xf5,%xmm3,%xmm6
pmuludq %xmm5,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm5,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm3
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm5,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pmuludq %xmm5,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm4
add    $0xfffffff8,%edi
jne    12d0 <atof+0x1d0>
test   %esi,%esi
je     135b <atof+0x25b>
movdqa 0xd29(%rip),%xmm5
nopw   0x0(%rax,%rax,1)
pshufd $0xf5,%xmm3,%xmm6
pmuludq %xmm5,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm5,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm3
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm5,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pmuludq %xmm5,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm4
add    $0xffffffff,%esi
jne    1320 <atof+0x220>
pshufd $0xf5,%xmm3,%xmm5
pshufd $0xf5,%xmm4,%xmm6
pmuludq %xmm5,%xmm6
pmuludq %xmm3,%xmm4
pshufd $0xee,%xmm4,%xmm3
pmuludq %xmm4,%xmm3
pshufd $0xaa,%xmm6,%xmm4
pmuludq %xmm6,%xmm4
pmuludq %xmm3,%xmm4
movd   %xmm4,%esi
cmp    %edx,%ecx
je     13ad <atof+0x2ad>
and    $0x7,%ecx
add    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %esi,%esi
lea    (%rsi,%rsi,4),%esi
add    $0xffffffff,%ecx
cmp    $0x1,%ecx
ja     13a0 <atof+0x2a0>
xorps  %xmm3,%xmm3
cvtsi2sd %esi,%xmm3
mulsd  %xmm1,%xmm0
divsd  %xmm2,%xmm0
cmp    $0x2d,%r8b
jne    13c7 <atof+0x2c7>
divsd  %xmm3,%xmm0
ret
mulsd  %xmm3,%xmm0
ret

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

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