#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 */
int /*<<< orphan*/ ERANGE;
double HUGE_VAL;
int /*<<< orphan*/ errno;
scalar_t__ isspace(char);
float strtof(const char *__restrict nptr, char **__restrict endptr) {
  union {
    float d;
    unsigned short s[2];
  } val;
  int frac = 0;
  int exp = 0;
  signed char sign = 1;
  signed char exp_sign = 1;
  char *str = (char *)nptr;
  while (isspace(*str))
    ++str;
  if (*str == '-') {
    sign = -1;
    ++str;
  } else if (*str == '+')
    ++str;
  val.d = 0;
  while (*str >= '0' && *str <= '9') {
    val.d = val.d * 10 + (*str - '0');
    ++str;
  }
  if (*str == '.') {
    ++str;
    while (*str >= '0' && *str <= '9') {
      val.d = val.d * 10 + (*str - '0');
      ++frac;
      ++str;
    }
  }
  if (*str == 'e' || *str == 'E') {
    ++str;
    if (*str == '-') {
      exp_sign = -1;
      ++str;
    } else if (*str == '+') {
      exp_sign = 1;
      ++str;
    }
    while (*str >= '0' && *str <= '9') {
      exp = exp * 10 + (*str - '0');
      ++str;
    }
  }
  if (endptr)
    *endptr = (char *)str;
  if (exp_sign < 0)
    exp = -exp;
  exp -= frac;
  if (val.d != 0) {
    while (exp > 0) {
      val.d *= 10.0;
      if (val.s[1] == 0x7f80) {
        errno = ERANGE;
        val.d = HUGE_VAL;
        break;
      }
      --exp;
    }
    while (exp < 0) {
      val.d *= .1;
      if (val.s[1] == 0) {
        errno = ERANGE;
        break;
      }
      ++exp;
    }
    if (sign < 0)
      val.s[1] |= 0x8000;
  }
  return val.d;
}


x86 assembly (clang, -O0):
<strtof>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movb   $0x1,-0x21(%rbp)
movb   $0x1,-0x22(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isspace@plt>
cmp    $0x0,%rax
je     1165 <strtof+0x55>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    113e <strtof+0x2e>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    118a <strtof+0x7a>
movb   $0xff,-0x21(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    11ab <strtof+0x9b>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11a6 <strtof+0x96>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    11ab <strtof+0x9b>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x31(%rbp)
jl     11d8 <strtof+0xc8>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    11e8 <strtof+0xd8>
jmp    1221 <strtof+0x111>
movss  -0x18(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2ss %eax,%xmm1
movss  0xe0d(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    11b3 <strtof+0xa3>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12b9 <strtof+0x1a9>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x32(%rbp)
jl     1262 <strtof+0x152>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%al
test   $0x1,%al
jne    1272 <strtof+0x162>
jmp    12b4 <strtof+0x1a4>
movss  -0x18(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2ss %eax,%xmm1
movss  0xd83(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    123d <strtof+0x12d>
jmp    12b9 <strtof+0x1a9>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
je     12d9 <strtof+0x1c9>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
jne    1392 <strtof+0x282>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    130a <strtof+0x1fa>
movb   $0xff,-0x22(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    132f <strtof+0x21f>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    132a <strtof+0x21a>
movb   $0x1,-0x22(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    132f <strtof+0x21f>
jmp    1334 <strtof+0x224>
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x33(%rbp)
jl     1359 <strtof+0x249>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x33(%rbp)
mov    -0x33(%rbp),%al
test   $0x1,%al
jne    1369 <strtof+0x259>
jmp    138d <strtof+0x27d>
imul   $0xa,-0x20(%rbp),%eax
mov    -0x30(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1334 <strtof+0x224>
jmp    1392 <strtof+0x282>
cmpq   $0x0,-0x10(%rbp)
je     13a8 <strtof+0x298>
mov    -0x30(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x22(%rbp),%eax
cmp    $0x0,%eax
jge    13bd <strtof+0x2ad>
xor    %eax,%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
movss  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    13e4 <strtof+0x2d4>
jp     13e4 <strtof+0x2d4>
jmp    14d7 <strtof+0x3c7>
jmp    13e9 <strtof+0x2d9>
cmpl   $0x0,-0x20(%rbp)
jle    1459 <strtof+0x349>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbfc(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movzwl -0x16(%rbp),%eax
cmp    $0x7f80,%eax
jne    144b <strtof+0x33b>
mov    0x2bb9(%rip),%rax
mov    (%rax),%ecx
mov    0x2ba0(%rip),%rax
mov    %ecx,(%rax)
mov    0x2baf(%rip),%rax
movsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1459 <strtof+0x349>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    13e9 <strtof+0x2d9>
jmp    145e <strtof+0x34e>
cmpl   $0x0,-0x20(%rbp)
jge    14b8 <strtof+0x3a8>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb8f(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movzwl -0x16(%rbp),%eax
cmp    $0x0,%eax
jne    14aa <strtof+0x39a>
mov    0x2b46(%rip),%rax
mov    (%rax),%ecx
mov    0x2b2d(%rip),%rax
mov    %ecx,(%rax)
jmp    14b8 <strtof+0x3a8>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    145e <strtof+0x34e>
movsbl -0x21(%rbp),%eax
cmp    $0x0,%eax
jge    14d2 <strtof+0x3c2>
movzwl -0x16(%rbp),%eax
or     $0x8000,%eax
mov    %ax,-0x16(%rbp)
jmp    14d7 <strtof+0x3c7>
movss  -0x18(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtof>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
nopw   0x0(%rax,%rax,1)
movsbl (%rbx),%edi
call   1030 <isspace@plt>
add    $0x1,%rbx
test   %rax,%rax
jne    1120 <strtof+0x10>
mov    -0x1(%rbx),%al
cmp    $0x2b,%al
je     1145 <strtof+0x35>
cmp    $0x2d,%al
jne    1141 <strtof+0x31>
mov    $0x1,%dil
jmp    1147 <strtof+0x37>
add    $0xffffffffffffffff,%rbx
xor    %edi,%edi
mov    (%rbx),%sil
lea    -0x30(%rsi),%eax
xorps  %xmm0,%xmm0
cmp    $0x9,%al
ja     1185 <strtof+0x75>
xorps  %xmm0,%xmm0
movss  0xea1(%rip),%xmm1
nop
movzbl %sil,%eax
add    $0xffffffd0,%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
mulss  %xmm1,%xmm0
addss  %xmm2,%xmm0
movzbl 0x1(%rbx),%esi
add    $0x1,%rbx
lea    -0x30(%rsi),%eax
cmp    $0xa,%al
jb     1160 <strtof+0x50>
xor    %edx,%edx
cmp    $0x2e,%sil
jne    11da <strtof+0xca>
mov    0x1(%rbx),%sil
add    $0x1,%rbx
lea    -0x30(%rsi),%eax
xor    %ecx,%ecx
cmp    $0x9,%al
ja     11dc <strtof+0xcc>
movss  0xe5a(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
movzbl %sil,%eax
add    $0xffffffd0,%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
mulss  %xmm1,%xmm0
addss  %xmm2,%xmm0
add    $0x1,%ecx
movzbl 0x1(%rbx),%esi
add    $0x1,%rbx
lea    -0x30(%rsi),%eax
cmp    $0xa,%al
jb     11b0 <strtof+0xa0>
jmp    11dc <strtof+0xcc>
xor    %ecx,%ecx
or     $0x20,%sil
cmp    $0x65,%sil
jne    11fd <strtof+0xed>
mov    0x1(%rbx),%al
mov    $0x1,%r8b
cmp    $0x2b,%al
je     1202 <strtof+0xf2>
cmp    $0x2d,%al
jne    1208 <strtof+0xf8>
add    $0x2,%rbx
mov    $0xff,%r8b
jmp    120c <strtof+0xfc>
mov    $0x1,%r8b
jmp    123c <strtof+0x12c>
add    $0x2,%rbx
jmp    120c <strtof+0xfc>
add    $0x1,%rbx
mov    (%rbx),%sil
lea    -0x30(%rsi),%eax
cmp    $0x9,%al
ja     123c <strtof+0x12c>
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movzbl %sil,%eax
lea    (%rdx,%rdx,4),%edx
lea    (%rax,%rdx,2),%edx
add    $0xffffffd0,%edx
movzbl 0x1(%rbx),%esi
add    $0x1,%rbx
lea    -0x30(%rsi),%eax
cmp    $0xa,%al
jb     1220 <strtof+0x110>
test   %r14,%r14
je     1244 <strtof+0x134>
mov    %rbx,(%r14)
mov    %edx,%esi
neg    %esi
test   %r8b,%r8b
cmovns %edx,%esi
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    125c <strtof+0x14c>
jnp    12eb <strtof+0x1db>
mov    %esi,%eax
sub    %ecx,%eax
test   %eax,%eax
jle    1290 <strtof+0x180>
add    $0x1,%eax
movss  0xd91(%rip),%xmm1
nop
mulss  %xmm1,%xmm0
movd   %xmm0,%ecx
and    $0xffff0000,%ecx
cmp    $0x7f800000,%ecx
je     12be <strtof+0x1ae>
add    $0xffffffff,%eax
cmp    $0x1,%eax
jg     1270 <strtof+0x160>
jmp    12df <strtof+0x1cf>
jns    12df <strtof+0x1cf>
sub    %esi,%ecx
movsd  0xd6c(%rip),%xmm1
nopl   0x0(%rax)
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movd   %xmm0,%eax
cmp    $0xffff,%eax
jbe    12f3 <strtof+0x1e3>
add    $0xffffffff,%ecx
jne    12a0 <strtof+0x190>
jmp    12df <strtof+0x1cf>
mov    0x2d1b(%rip),%rax
mov    (%rax),%eax
mov    0x2d02(%rip),%rcx
mov    %eax,(%rcx)
mov    0x2d11(%rip),%rax
movsd  (%rax),%xmm0
cvtsd2ss %xmm0,%xmm0
test   %dil,%dil
je     12eb <strtof+0x1db>
orps   0xd25(%rip),%xmm0
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
mov    0x2ce6(%rip),%rax
mov    (%rax),%eax
mov    0x2ccd(%rip),%rcx
mov    %eax,(%rcx)
test   %dil,%dil
jne    12e4 <strtof+0x1d4>
jmp    12eb <strtof+0x1db>

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

LLVM IR (-O2):
@ERANGE = global i32 0
@errno = global i32 0
@HUGE_VAL = global double 0.000000e+00
define float @strtof(i8* noalias %0, i8** noalias writeonly %1) {
br label %3
3: ; preds = %3, %2
%4 = phi i8* [ %0, %2 ], [ %8, %3 ]
%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 i1 [ false, %12 ], [ true, %11 ], [ false, %9 ]
%15 = phi i8* [ %8, %12 ], [ %8, %11 ], [ %4, %9 ]
%16 = load i8, i8* %15
%17 = add i8 %16, -48
%18 = icmp ult i8 %17, 10
br i1 %18, label %19, label %31
19: ; preds = %13, %19
%20 = phi i8 [ %28, %19 ], [ %16, %13 ]
%21 = phi i8* [ %27, %19 ], [ %15, %13 ]
%22 = phi float [ %26, %19 ], [ 0.000000e+00, %13 ]
%23 = zext i8 %20 to i32
%24 = add nsw i32 %23, -48
%25 = sitofp i32 %24 to float
%26 = tail call float @llvm.fmuladd.f32(float %22, float 1.000000e+01, float %25)
%27 = getelementptr inbounds i8, i8* %21, i64 1
%28 = load i8, i8* %27
%29 = add i8 %28, -48
%30 = icmp ult i8 %29, 10
br i1 %30, label %19, label %31
31: ; preds = %19, %13
%32 = phi float [ 0.000000e+00, %13 ], [ %26, %19 ]
%33 = phi i8* [ %15, %13 ], [ %27, %19 ]
%34 = phi i8 [ %16, %13 ], [ %28, %19 ]
%35 = icmp eq i8 %34, 46
br i1 %35, label %36, label %55
36: ; preds = %31
%37 = getelementptr inbounds i8, i8* %33, i64 1
%38 = load i8, i8* %37
%39 = add i8 %38, -48
%40 = icmp ult i8 %39, 10
br i1 %40, label %41, label %55
41: ; preds = %36, %41
%42 = phi i8 [ %52, %41 ], [ %38, %36 ]
%43 = phi i8* [ %51, %41 ], [ %37, %36 ]
%44 = phi i32 [ %50, %41 ], [ 0, %36 ]
%45 = phi float [ %49, %41 ], [ %32, %36 ]
%46 = zext i8 %42 to i32
%47 = add nsw i32 %46, -48
%48 = sitofp i32 %47 to float
%49 = tail call float @llvm.fmuladd.f32(float %45, float 1.000000e+01, float %48)
%50 = add nuw nsw i32 %44, 1
%51 = getelementptr inbounds i8, i8* %43, i64 1
%52 = load i8, i8* %51
%53 = add i8 %52, -48
%54 = icmp ult i8 %53, 10
br i1 %54, label %41, label %55
55: ; preds = %41, %31, %36
%56 = phi i8 [ %38, %36 ], [ %34, %31 ], [ %52, %41 ]
%57 = phi float [ %32, %36 ], [ %32, %31 ], [ %49, %41 ]
%58 = phi i32 [ 0, %36 ], [ 0, %31 ], [ %50, %41 ]
%59 = phi i8* [ %37, %36 ], [ %33, %31 ], [ %51, %41 ]
switch i8 %56, label %85 [
i8 101, label %60
i8 69, label %60
]
60: ; preds = %55, %55
%61 = getelementptr inbounds i8, i8* %59, i64 1
%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* %59, i64 2
br label %67
65: ; preds = %60
%66 = getelementptr inbounds i8, i8* %59, i64 2
br label %67
67: ; preds = %60, %65, %63
%68 = phi i8 [ -1, %63 ], [ 1, %65 ], [ 1, %60 ]
%69 = phi i8* [ %64, %63 ], [ %66, %65 ], [ %61, %60 ]
%70 = load i8, i8* %69
%71 = add i8 %70, -48
%72 = icmp ult i8 %71, 10
br i1 %72, label %73, label %85
73: ; preds = %67, %73
%74 = phi i8 [ %82, %73 ], [ %70, %67 ]
%75 = phi i8* [ %81, %73 ], [ %69, %67 ]
%76 = phi i32 [ %80, %73 ], [ 0, %67 ]
%77 = zext i8 %74 to i32
%78 = mul nsw i32 %76, 10
%79 = add i32 %78, -48
%80 = add i32 %79, %77
%81 = getelementptr inbounds i8, i8* %75, i64 1
%82 = load i8, i8* %81
%83 = add i8 %82, -48
%84 = icmp ult i8 %83, 10
br i1 %84, label %73, label %85
85: ; preds = %73, %67, %55
%86 = phi i32 [ 0, %55 ], [ 0, %67 ], [ %80, %73 ]
%87 = phi i8 [ 1, %55 ], [ %68, %67 ], [ %68, %73 ]
%88 = phi i8* [ %59, %55 ], [ %69, %67 ], [ %81, %73 ]
%89 = icmp eq i8** %1, null
br i1 %89, label %91, label %90
90: ; preds = %85
store i8* %88, i8** %1
br label %91
91: ; preds = %90, %85
%92 = icmp slt i8 %87, 0
%93 = sub nsw i32 0, %86
%94 = select i1 %92, i32 %93, i32 %86
%95 = sub nsw i32 %94, %58
%96 = fcmp une float %57, 0.000000e+00
br i1 %96, label %97, label %134
97: ; preds = %91
%98 = icmp sgt i32 %95, 0
br i1 %98, label %99, label %113
99: ; preds = %97, %110
%100 = phi i32 [ %111, %110 ], [ %95, %97 ]
%101 = phi float [ %102, %110 ], [ %57, %97 ]
%102 = fmul float %101, 1.000000e+01
%103 = bitcast float %102 to i32
%104 = and i32 %103, -65536
%105 = icmp eq i32 %104, 2139095040
br i1 %105, label %106, label %110
106: ; preds = %99
%107 = load i32, i32* @ERANGE
store i32 %107, i32* @errno
%108 = load double, double* @HUGE_VAL
%109 = fptrunc double %108 to float
br label %128
110: ; preds = %99
%111 = add nsw i32 %100, -1
%112 = icmp sgt i32 %100, 1
br i1 %112, label %99, label %128
113: ; preds = %97
%114 = icmp slt i32 %95, 0
br i1 %114, label %118, label %128
115: ; preds = %118
%116 = add i32 %119, 1
%117 = icmp eq i32 %116, 0
br i1 %117, label %128, label %118
118: ; preds = %113, %115
%119 = phi i32 [ %116, %115 ], [ %95, %113 ]
%120 = phi float [ %123, %115 ], [ %57, %113 ]
%121 = fpext float %120 to double
%122 = fmul double %121, 1.000000e-01
%123 = fptrunc double %122 to float
%124 = bitcast float %123 to i32
%125 = icmp ult i32 %124, 65536
br i1 %125, label %126, label %115
126: ; preds = %118
%127 = load i32, i32* @ERANGE
store i32 %127, i32* @errno
br label %128
128: ; preds = %115, %110, %106, %113, %126
%129 = phi float [ %123, %126 ], [ %57, %113 ], [ %109, %106 ], [ %102, %110 ], [ %123, %115 ]
br i1 %14, label %130, label %134
130: ; preds = %128
%131 = bitcast float %129 to i32
%132 = or i32 %131, -2147483648
%133 = bitcast i32 %132 to float
br label %134
134: ; preds = %128, %130, %91
%135 = phi float [ %133, %130 ], [ %129, %128 ], [ %57, %91 ]
ret float %135
}