double os_atof_alt(const char *s) {
  double output = 0.0;
  int mantissa = 0;
  char this_char;
  int sign = +1;
  if (*s == '-') {
    sign = -1;
    s++;
  } else if (*s == '+')
    s++;
  while ((this_char = *s++) != '\0' && (this_char >= '0' && this_char <= '9')) {
    output = (output * 10.0) + (this_char - '0');
  }
  if (this_char == '.') {
    double fraction = 0.1;
    while ((this_char = *s++) != '\0' &&
           (this_char >= '0' && this_char <= '9')) {
      output += fraction * (this_char - '0');
      fraction *= 0.1;
    }
  }
  if (this_char == 'e' || this_char == 'E') {
    int exponent_sign = +1;
    int exponent = 0;
    this_char = *s++;
    if (this_char == '+')
      this_char = *s++;
    else if (this_char == '-') {
      this_char = *s++;
      exponent_sign = -1;
    }
    while (this_char >= '0' && this_char <= '9') {
      exponent = exponent * 10 + (this_char - '0');
      this_char = *s++;
    }
    mantissa += exponent * exponent_sign;
  }
  while (mantissa > 0) {
    output *= 10.0;
    mantissa--;
  }
  while (mantissa < 0) {
    output *= 0.1;
    mantissa++;
  }
  output *= sign;
  return output;
}


x86 assembly (clang, -O0):
<os_atof_alt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1146 <os_atof_alt+0x46>
movl   $0xffffffff,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1167 <os_atof_alt+0x67>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1162 <os_atof_alt+0x62>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1167 <os_atof_alt+0x67>
jmp    116c <os_atof_alt+0x6c>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x31(%rbp)
je     11b6 <os_atof_alt+0xb6>
movsbl -0x15(%rbp),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x32(%rbp)
jl     11b0 <os_atof_alt+0xb0>
movsbl -0x15(%rbp),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    11c6 <os_atof_alt+0xc6>
jmp    11f0 <os_atof_alt+0xf0>
movsd  -0x10(%rbp),%xmm0
movsbl -0x15(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe2a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    116c <os_atof_alt+0x6c>
movsbl -0x15(%rbp),%eax
cmp    $0x2e,%eax
jne    12a2 <os_atof_alt+0x1a2>
movsd  0xdfb(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x33(%rbp)
je     1254 <os_atof_alt+0x154>
movsbl -0x15(%rbp),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x34(%rbp)
jl     124e <os_atof_alt+0x14e>
movsbl -0x15(%rbp),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x34(%rbp)
mov    -0x34(%rbp),%al
mov    %al,-0x33(%rbp)
mov    -0x33(%rbp),%al
test   $0x1,%al
jne    1264 <os_atof_alt+0x164>
jmp    129d <os_atof_alt+0x19d>
movsd  -0x28(%rbp),%xmm0
movsbl -0x15(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm2
movsd  -0x10(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xd72(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    120a <os_atof_alt+0x10a>
jmp    12a2 <os_atof_alt+0x1a2>
movsbl -0x15(%rbp),%eax
cmp    $0x65,%eax
je     12bc <os_atof_alt+0x1bc>
movsbl -0x15(%rbp),%eax
cmp    $0x45,%eax
jne    139b <os_atof_alt+0x29b>
movl   $0x1,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
movsbl -0x15(%rbp),%eax
cmp    $0x2b,%eax
jne    1304 <os_atof_alt+0x204>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
jmp    1331 <os_atof_alt+0x231>
movsbl -0x15(%rbp),%eax
cmp    $0x2d,%eax
jne    132c <os_atof_alt+0x22c>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
movl   $0xffffffff,-0x2c(%rbp)
jmp    1331 <os_atof_alt+0x231>
jmp    1336 <os_atof_alt+0x236>
movsbl -0x15(%rbp),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x35(%rbp)
jl     1355 <os_atof_alt+0x255>
movsbl -0x15(%rbp),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    1365 <os_atof_alt+0x265>
jmp    138e <os_atof_alt+0x28e>
imul   $0xa,-0x30(%rbp),%eax
movsbl -0x15(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%al
mov    %al,-0x15(%rbp)
jmp    1336 <os_atof_alt+0x236>
mov    -0x30(%rbp),%eax
imul   -0x2c(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    13a0 <os_atof_alt+0x2a0>
cmpl   $0x0,-0x14(%rbp)
jle    13ca <os_atof_alt+0x2ca>
movsd  0xc56(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    13a0 <os_atof_alt+0x2a0>
jmp    13cf <os_atof_alt+0x2cf>
cmpl   $0x0,-0x14(%rbp)
jge    13f9 <os_atof_alt+0x2f9>
movsd  0xc1f(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    13cf <os_atof_alt+0x2cf>
cvtsi2sdl -0x1c(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<os_atof_alt>:
mov    (%rdi),%al
movsd  0xef6(%rip),%xmm0
cmp    $0x2b,%al
je     1120 <os_atof_alt+0x20>
cmp    $0x2d,%al
jne    1124 <os_atof_alt+0x24>
add    $0x1,%rdi
movsd  0xeea(%rip),%xmm0
jmp    1124 <os_atof_alt+0x24>
add    $0x1,%rdi
mov    (%rdi),%al
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
xorpd  %xmm1,%xmm1
cmp    $0x9,%cl
ja     1174 <os_atof_alt+0x74>
xorpd  %xmm1,%xmm1
movsd  0xece(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl %al,%eax
add    $0xffffffd0,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm2,%xmm1
addsd  %xmm3,%xmm1
movzbl (%rdi),%eax
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     1150 <os_atof_alt+0x50>
cmp    $0x2e,%al
jne    11c8 <os_atof_alt+0xc8>
mov    (%rdi),%al
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0x9,%cl
ja     11c8 <os_atof_alt+0xc8>
movsd  0xe8a(%rip),%xmm2
movapd %xmm2,%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl %al,%eax
add    $0xffffffd0,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm4,%xmm1
mulsd  %xmm2,%xmm3
movzbl (%rdi),%eax
add    $0x1,%rdi
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     11a0 <os_atof_alt+0xa0>
and    $0xdf,%al
cmp    $0x45,%al
jne    1315 <os_atof_alt+0x215>
mov    (%rdi),%al
mov    $0x1,%ecx
cmp    $0x2b,%al
je     11e6 <os_atof_alt+0xe6>
cmp    $0x2d,%al
jne    11ef <os_atof_alt+0xef>
mov    $0xffffffff,%ecx
mov    0x1(%rdi),%al
add    $0x2,%rdi
jmp    11f3 <os_atof_alt+0xf3>
add    $0x1,%rdi
lea    -0x30(%rax),%esi
xor    %edx,%edx
cmp    $0x9,%sil
ja     121c <os_atof_alt+0x11c>
xor    %edx,%edx
movzbl %al,%eax
lea    (%rdx,%rdx,4),%edx
lea    (%rax,%rdx,2),%edx
add    $0xffffffd0,%edx
movzbl (%rdi),%eax
add    $0x1,%rdi
lea    -0x30(%rax),%esi
cmp    $0xa,%sil
jb     1200 <os_atof_alt+0x100>
mov    %edx,%eax
imul   %ecx,%eax
test   %eax,%eax
jle    129a <os_atof_alt+0x19a>
lea    -0x1(%rax),%ecx
mov    %eax,%edx
and    $0x7,%edx
je     124d <os_atof_alt+0x14d>
xor    %esi,%esi
movsd  0xdd7(%rip),%xmm2
nopl   0x0(%rax)
mulsd  %xmm2,%xmm1
add    $0x1,%esi
cmp    %esi,%edx
jne    1240 <os_atof_alt+0x140>
sub    %esi,%eax
cmp    $0x7,%ecx
jb     1315 <os_atof_alt+0x215>
add    $0xffffffff,%eax
movsd  0xdaf(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
add    $0xfffffff8,%eax
cmp    $0xfffffffe,%eax
jb     1270 <os_atof_alt+0x170>
jmp    1315 <os_atof_alt+0x215>
jns    1315 <os_atof_alt+0x215>
imul   %ecx,%edx
neg    %edx
and    $0x7,%edx
je     12d6 <os_atof_alt+0x1d6>
neg    %edx
xor    %esi,%esi
movsd  0xd66(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mulsd  %xmm2,%xmm1
add    $0xffffffff,%esi
cmp    %esi,%edx
jne    12c0 <os_atof_alt+0x1c0>
mov    %eax,%ecx
sub    %esi,%ecx
cmp    $0xfffffff8,%eax
jbe    12dd <os_atof_alt+0x1dd>
jmp    1315 <os_atof_alt+0x215>
mov    %eax,%ecx
cmp    $0xfffffff8,%eax
ja     1315 <os_atof_alt+0x215>
movsd  0xd33(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
add    $0x8,%ecx
jne    12f0 <os_atof_alt+0x1f0>
mulsd  %xmm1,%xmm0
ret

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

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