int _get_next_number(char *in, int *out) {
  int i = 0, o, n;
  if (in[i] >= '0' && in[i] <= '9') {
    n = 0;
    for (o = 0; 1; o++) {
      if (in[i + o] >= '0' && in[i + o] <= '9')
        continue;
      if (in[i + o] >= 'a' && in[i + o] <= 'f') {
        n = 1;
        break;
      }
      if (in[i + o] >= 'A' && in[i + o] <= 'F') {
        n = 1;
        break;
      }
      if (in[i + o] == 'h' || in[i + o] == 'H') {
        n = 1;
        break;
      }
      break;
    }
    if (n == 1) {
      o = 0;
      while (1) {
        if (in[i] >= '0' && in[i] <= '9')
          o = (o * 16) + in[i] - '0';
        else if (in[i] >= 'a' && in[i] <= 'f')
          o = (o * 16) + in[i] - 'a' + 0xA;
        else if (in[i] >= 'A' && in[i] <= 'F')
          o = (o * 16) + in[i] - 'A' + 0xA;
        else if (in[i] == 'h' || in[i] == 'H')
          break;
        else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
          break;
        else
          return 0;
        i++;
      }
    } else {
      for (o = 0; in[i] >= '0' && in[i] <= '9'; i++)
        o = (o * 10) + in[i] - '0';
      if (!(in[i] == ' ' || in[i] == 0x09 || in[i] == 0))
        return 0;
    }
  } else if (in[i] == '$') {
    i++;
    o = 0;
    while (1) {
      if (in[i] >= '0' && in[i] <= '9')
        o = (o * 16) + in[i] - '0';
      else if (in[i] >= 'a' && in[i] <= 'f')
        o = (o * 16) + in[i] - 'a' + 0xA;
      else if (in[i] >= 'A' && in[i] <= 'F')
        o = (o * 16) + in[i] - 'A' + 0xA;
      else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
        break;
      else
        return 0;
      i++;
    }
  } else
    return 0;
  *out = o;
  return 1;
}


x86 assembly (clang, -O0):
<_get_next_number>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     14b5 <_get_next_number+0x3b5>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     14b5 <_get_next_number+0x3b5>
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x20(%rbp)
mov    $0x1,%al
test   $0x1,%al
jne    115a <_get_next_number+0x5a>
jmp    1266 <_get_next_number+0x166>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1193 <_get_next_number+0x93>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     1193 <_get_next_number+0x93>
jmp    1258 <_get_next_number+0x158>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     11d3 <_get_next_number+0xd3>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     11d3 <_get_next_number+0xd3>
movl   $0x1,-0x24(%rbp)
jmp    1266 <_get_next_number+0x166>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1213 <_get_next_number+0x113>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1213 <_get_next_number+0x113>
movl   $0x1,-0x24(%rbp)
jmp    1266 <_get_next_number+0x166>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x68,%eax
je     1247 <_get_next_number+0x147>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x48,%eax
jne    1253 <_get_next_number+0x153>
movl   $0x1,-0x24(%rbp)
jmp    1266 <_get_next_number+0x166>
jmp    1266 <_get_next_number+0x166>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    114b <_get_next_number+0x4b>
cmpl   $0x1,-0x24(%rbp)
jne    13f4 <_get_next_number+0x2f4>
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12c0 <_get_next_number+0x1c0>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     12c0 <_get_next_number+0x1c0>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
jmp    13e1 <_get_next_number+0x2e1>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     130c <_get_next_number+0x20c>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     130c <_get_next_number+0x20c>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    13dc <_get_next_number+0x2dc>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1358 <_get_next_number+0x258>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1358 <_get_next_number+0x258>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    13d7 <_get_next_number+0x2d7>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x68,%eax
je     1382 <_get_next_number+0x282>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x48,%eax
jne    1387 <_get_next_number+0x287>
jmp    13ef <_get_next_number+0x2ef>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     13c6 <_get_next_number+0x2c6>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
je     13c6 <_get_next_number+0x2c6>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    13cb <_get_next_number+0x2cb>
jmp    13ef <_get_next_number+0x2ef>
movl   $0x0,-0x4(%rbp)
jmp    1649 <_get_next_number+0x549>
jmp    13dc <_get_next_number+0x2dc>
jmp    13e1 <_get_next_number+0x2e1>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1277 <_get_next_number+0x177>
jmp    14b0 <_get_next_number+0x3b0>
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x25(%rbp)
jl     142a <_get_next_number+0x32a>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    143a <_get_next_number+0x33a>
jmp    1460 <_get_next_number+0x360>
imul   $0xa,-0x20(%rbp),%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    13fb <_get_next_number+0x2fb>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     14ab <_get_next_number+0x3ab>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
je     14ab <_get_next_number+0x3ab>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     14ab <_get_next_number+0x3ab>
movl   $0x0,-0x4(%rbp)
jmp    1649 <_get_next_number+0x549>
jmp    14b0 <_get_next_number+0x3b0>
jmp    1639 <_get_next_number+0x539>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x24,%eax
jne    1628 <_get_next_number+0x528>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1523 <_get_next_number+0x423>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     1523 <_get_next_number+0x423>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
jmp    1615 <_get_next_number+0x515>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     156f <_get_next_number+0x46f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     156f <_get_next_number+0x46f>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    1610 <_get_next_number+0x510>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     15bb <_get_next_number+0x4bb>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     15bb <_get_next_number+0x4bb>
mov    -0x20(%rbp),%eax
shl    $0x4,%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x20(%rbp)
jmp    160b <_get_next_number+0x50b>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     15fa <_get_next_number+0x4fa>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
je     15fa <_get_next_number+0x4fa>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    15ff <_get_next_number+0x4ff>
jmp    1623 <_get_next_number+0x523>
movl   $0x0,-0x4(%rbp)
jmp    1649 <_get_next_number+0x549>
jmp    1610 <_get_next_number+0x510>
jmp    1615 <_get_next_number+0x515>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    14da <_get_next_number+0x3da>
jmp    1634 <_get_next_number+0x534>
movl   $0x0,-0x4(%rbp)
jmp    1649 <_get_next_number+0x549>
jmp    1639 <_get_next_number+0x539>
mov    -0x20(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_get_next_number>:
mov    (%rdi),%r8b
lea    -0x30(%r8),%eax
cmp    $0x9,%al
ja     11c8 <_get_next_number+0xc8>
mov    %r8d,%eax
ja     112f <_get_next_number+0x2f>
lea    0x1(%rdi),%rcx
nopl   0x0(%rax,%rax,1)
movzbl (%rcx),%eax
lea    -0x30(%rax),%edx
add    $0x1,%rcx
cmp    $0xa,%dl
jb     1120 <_get_next_number+0x20>
add    $0xbf,%al
cmp    $0x27,%al
ja     123e <_get_next_number+0x13e>
movzbl %al,%eax
movabs $0xbf000000bf,%rcx
bt     %rax,%rcx
jae    123e <_get_next_number+0x13e>
add    $0x1,%rdi
xor    %ecx,%ecx
jmp    1170 <_get_next_number+0x70>
nopl   0x0(%rax,%rax,1)
shl    $0x4,%ecx
add    %edx,%ecx
add    %r9d,%ecx
movzbl (%rdi),%r8d
add    $0x1,%rdi
movsbl %r8b,%r9d
lea    -0x30(%r9),%eax
mov    $0xffffffd0,%edx
cmp    $0xa,%al
jb     1160 <_get_next_number+0x60>
lea    -0x61(%r8),%eax
mov    $0xffffffa9,%edx
cmp    $0x6,%al
jb     1160 <_get_next_number+0x60>
lea    -0x41(%r8),%eax
mov    $0xffffffc9,%edx
cmp    $0x6,%al
jb     1160 <_get_next_number+0x60>
cmp    $0x20,%r8b
ja     11b9 <_get_next_number+0xb9>
movzbl %r9b,%eax
movabs $0x100000201,%rdx
bt     %rax,%rdx
jb     1236 <_get_next_number+0x136>
cmp    $0x48,%r8b
je     1236 <_get_next_number+0x136>
xor    %eax,%eax
cmp    $0x68,%r8b
je     1236 <_get_next_number+0x136>
ret
xor    %eax,%eax
cmp    $0x24,%r8b
jne    11c7 <_get_next_number+0xc7>
add    $0x1,%rdi
xor    %ecx,%ecx
jmp    11ec <_get_next_number+0xec>
nopl   0x0(%rax,%rax,1)
shl    $0x4,%ecx
add    %eax,%ecx
add    %r8d,%ecx
add    $0x1,%rdi
movsbl (%rdi),%r8d
lea    -0x30(%r8),%edx
mov    $0xffffffd0,%eax
cmp    $0xa,%dl
jb     11e0 <_get_next_number+0xe0>
lea    -0x61(%r8),%edx
mov    $0xffffffa9,%eax
cmp    $0x6,%dl
jb     11e0 <_get_next_number+0xe0>
lea    -0x41(%r8),%edx
mov    $0xffffffc9,%eax
cmp    $0x6,%dl
jb     11e0 <_get_next_number+0xe0>
xor    %eax,%eax
cmp    $0x20,%r8b
ja     11c7 <_get_next_number+0xc7>
movzbl %r8b,%edx
movabs $0x100000201,%rdi
bt     %rdx,%rdi
jae    11c7 <_get_next_number+0xc7>
mov    %ecx,(%rsi)
mov    $0x1,%eax
ret
add    $0x1,%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsbl %r8b,%eax
lea    (%rcx,%rcx,4),%ecx
lea    (%rax,%rcx,2),%ecx
add    $0xffffffd0,%ecx
movzbl (%rdi),%r8d
lea    -0x30(%r8),%eax
add    $0x1,%rdi
cmp    $0xa,%al
jb     1250 <_get_next_number+0x150>
jmp    121a <_get_next_number+0x11a>

LLVM IR (-O0):
define i32 @_get_next_number(i8* %0, i32* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i32* %1, i32** %5
store i32 0, i32* %6
%9 = load i8*, i8** %4
%10 = load i32, i32* %6
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds i8, i8* %9, i64 %11
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = icmp sge i32 %14, 48
br i1 %15, label %16, label %310
16: ; preds = %2
%17 = load i8*, i8** %4
%18 = load i32, i32* %6
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %17, i64 %19
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp sle i32 %22, 57
br i1 %23, label %24, label %310
24: ; preds = %16
store i32 0, i32* %8
store i32 0, i32* %7
br label %25
25: ; preds = %111, %24
br i1 true, label %26, label %114
26: ; preds = %25
%27 = load i8*, i8** %4
%28 = load i32, i32* %6
%29 = load i32, i32* %7
%30 = add nsw i32 %28, %29
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %27, i64 %31
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp sge i32 %34, 48
br i1 %35, label %36, label %47
36: ; preds = %26
%37 = load i8*, i8** %4
%38 = load i32, i32* %6
%39 = load i32, i32* %7
%40 = add nsw i32 %38, %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %37, i64 %41
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp sle i32 %44, 57
br i1 %45, label %46, label %47
46: ; preds = %36
br label %111
47: ; preds = %36, %26
%48 = load i8*, i8** %4
%49 = load i32, i32* %6
%50 = load i32, i32* %7
%51 = add nsw i32 %49, %50
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %48, i64 %52
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp sge i32 %55, 97
br i1 %56, label %57, label %68
57: ; preds = %47
%58 = load i8*, i8** %4
%59 = load i32, i32* %6
%60 = load i32, i32* %7
%61 = add nsw i32 %59, %60
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %58, i64 %62
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = icmp sle i32 %65, 102
br i1 %66, label %67, label %68
67: ; preds = %57
store i32 1, i32* %8
br label %114
68: ; preds = %57, %47
%69 = load i8*, i8** %4
%70 = load i32, i32* %6
%71 = load i32, i32* %7
%72 = add nsw i32 %70, %71
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i8, i8* %69, i64 %73
%75 = load i8, i8* %74
%76 = sext i8 %75 to i32
%77 = icmp sge i32 %76, 65
br i1 %77, label %78, label %89
78: ; preds = %68
%79 = load i8*, i8** %4
%80 = load i32, i32* %6
%81 = load i32, i32* %7
%82 = add nsw i32 %80, %81
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds i8, i8* %79, i64 %83
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = icmp sle i32 %86, 70
br i1 %87, label %88, label %89
88: ; preds = %78
store i32 1, i32* %8
br label %114
89: ; preds = %78, %68
%90 = load i8*, i8** %4
%91 = load i32, i32* %6
%92 = load i32, i32* %7
%93 = add nsw i32 %91, %92
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i8, i8* %90, i64 %94
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 104
br i1 %98, label %109, label %99
99: ; preds = %89
%100 = load i8*, i8** %4
%101 = load i32, i32* %6
%102 = load i32, i32* %7
%103 = add nsw i32 %101, %102
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds i8, i8* %100, i64 %104
%106 = load i8, i8* %105
%107 = sext i8 %106 to i32
%108 = icmp eq i32 %107, 72
br i1 %108, label %109, label %110
109: ; preds = %99, %89
store i32 1, i32* %8
br label %114
110: ; preds = %99
br label %114
111: ; preds = %46
%112 = load i32, i32* %7
%113 = add nsw i32 %112, 1
store i32 %113, i32* %7
br label %25
114: ; preds = %110, %109, %88, %67, %25
%115 = load i32, i32* %8
%116 = icmp eq i32 %115, 1
br i1 %116, label %117, label %250
117: ; preds = %114
store i32 0, i32* %7
br label %118
118: ; preds = %117, %246
%119 = load i8*, i8** %4
%120 = load i32, i32* %6
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %119, i64 %121
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = icmp sge i32 %124, 48
br i1 %125, label %126, label %145
126: ; preds = %118
%127 = load i8*, i8** %4
%128 = load i32, i32* %6
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i8, i8* %127, i64 %129
%131 = load i8, i8* %130
%132 = sext i8 %131 to i32
%133 = icmp sle i32 %132, 57
br i1 %133, label %134, label %145
134: ; preds = %126
%135 = load i32, i32* %7
%136 = mul nsw i32 %135, 16
%137 = load i8*, i8** %4
%138 = load i32, i32* %6
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds i8, i8* %137, i64 %139
%141 = load i8, i8* %140
%142 = sext i8 %141 to i32
%143 = add nsw i32 %136, %142
%144 = sub nsw i32 %143, 48
store i32 %144, i32* %7
br label %246
145: ; preds = %126, %118
%146 = load i8*, i8** %4
%147 = load i32, i32* %6
%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 sge i32 %151, 97
br i1 %152, label %153, label %173
153: ; preds = %145
%154 = load i8*, i8** %4
%155 = load i32, i32* %6
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds i8, i8* %154, i64 %156
%158 = load i8, i8* %157
%159 = sext i8 %158 to i32
%160 = icmp sle i32 %159, 102
br i1 %160, label %161, label %173
161: ; preds = %153
%162 = load i32, i32* %7
%163 = mul nsw i32 %162, 16
%164 = load i8*, i8** %4
%165 = load i32, i32* %6
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds i8, i8* %164, i64 %166
%168 = load i8, i8* %167
%169 = sext i8 %168 to i32
%170 = add nsw i32 %163, %169
%171 = sub nsw i32 %170, 97
%172 = add nsw i32 %171, 10
store i32 %172, i32* %7
br label %245
173: ; preds = %153, %145
%174 = load i8*, i8** %4
%175 = load i32, i32* %6
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds i8, i8* %174, i64 %176
%178 = load i8, i8* %177
%179 = sext i8 %178 to i32
%180 = icmp sge i32 %179, 65
br i1 %180, label %181, label %201
181: ; preds = %173
%182 = load i8*, i8** %4
%183 = load i32, i32* %6
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds i8, i8* %182, i64 %184
%186 = load i8, i8* %185
%187 = sext i8 %186 to i32
%188 = icmp sle i32 %187, 70
br i1 %188, label %189, label %201
189: ; preds = %181
%190 = load i32, i32* %7
%191 = mul nsw i32 %190, 16
%192 = load i8*, i8** %4
%193 = load i32, i32* %6
%194 = sext i32 %193 to i64
%195 = getelementptr inbounds i8, i8* %192, i64 %194
%196 = load i8, i8* %195
%197 = sext i8 %196 to i32
%198 = add nsw i32 %191, %197
%199 = sub nsw i32 %198, 65
%200 = add nsw i32 %199, 10
store i32 %200, i32* %7
br label %244
201: ; preds = %181, %173
%202 = load i8*, i8** %4
%203 = load i32, i32* %6
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds i8, i8* %202, i64 %204
%206 = load i8, i8* %205
%207 = sext i8 %206 to i32
%208 = icmp eq i32 %207, 104
br i1 %208, label %217, label %209
209: ; preds = %201
%210 = load i8*, i8** %4
%211 = load i32, i32* %6
%212 = sext i32 %211 to i64
%213 = getelementptr inbounds i8, i8* %210, i64 %212
%214 = load i8, i8* %213
%215 = sext i8 %214 to i32
%216 = icmp eq i32 %215, 72
br i1 %216, label %217, label %218
217: ; preds = %209, %201
br label %249
218: ; preds = %209
%219 = load i8*, i8** %4
%220 = load i32, i32* %6
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds i8, i8* %219, i64 %221
%223 = load i8, i8* %222
%224 = sext i8 %223 to i32
%225 = icmp eq i32 %224, 32
br i1 %225, label %242, label %226
226: ; preds = %218
%227 = load i8*, i8** %4
%228 = load i32, i32* %6
%229 = sext i32 %228 to i64
%230 = getelementptr inbounds i8, i8* %227, i64 %229
%231 = load i8, i8* %230
%232 = sext i8 %231 to i32
%233 = icmp eq i32 %232, 9
br i1 %233, label %242, label %234
234: ; preds = %226
%235 = load i8*, i8** %4
%236 = load i32, i32* %6
%237 = sext i32 %236 to i64
%238 = getelementptr inbounds i8, i8* %235, i64 %237
%239 = load i8, i8* %238
%240 = sext i8 %239 to i32
%241 = icmp eq i32 %240, 0
br i1 %241, label %242, label %243
242: ; preds = %234, %226, %218
br label %249
243: ; preds = %234
store i32 0, i32* %3
br label %441
244: ; preds = %189
br label %245
245: ; preds = %244, %161
br label %246
246: ; preds = %245, %134
%247 = load i32, i32* %6
%248 = add nsw i32 %247, 1
store i32 %248, i32* %6
br label %118
249: ; preds = %242, %217
br label %309
250: ; preds = %114
store i32 0, i32* %7
br label %251
251: ; preds = %280, %250
%252 = load i8*, i8** %4
%253 = load i32, i32* %6
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds i8, i8* %252, i64 %254
%256 = load i8, i8* %255
%257 = sext i8 %256 to i32
%258 = icmp sge i32 %257, 48
br i1 %258, label %259, label %267
259: ; preds = %251
%260 = load i8*, i8** %4
%261 = load i32, i32* %6
%262 = sext i32 %261 to i64
%263 = getelementptr inbounds i8, i8* %260, i64 %262
%264 = load i8, i8* %263
%265 = sext i8 %264 to i32
%266 = icmp sle i32 %265, 57
br label %267
267: ; preds = %259, %251
%268 = phi i1 [ false, %251 ], [ %266, %259 ]
br i1 %268, label %269, label %283
269: ; preds = %267
%270 = load i32, i32* %7
%271 = mul nsw i32 %270, 10
%272 = load i8*, i8** %4
%273 = load i32, i32* %6
%274 = sext i32 %273 to i64
%275 = getelementptr inbounds i8, i8* %272, i64 %274
%276 = load i8, i8* %275
%277 = sext i8 %276 to i32
%278 = add nsw i32 %271, %277
%279 = sub nsw i32 %278, 48
store i32 %279, i32* %7
br label %280
280: ; preds = %269
%281 = load i32, i32* %6
%282 = add nsw i32 %281, 1
store i32 %282, i32* %6
br label %251
283: ; preds = %267
%284 = load i8*, i8** %4
%285 = load i32, i32* %6
%286 = sext i32 %285 to i64
%287 = getelementptr inbounds i8, i8* %284, i64 %286
%288 = load i8, i8* %287
%289 = sext i8 %288 to i32
%290 = icmp eq i32 %289, 32
br i1 %290, label %308, label %291
291: ; preds = %283
%292 = load i8*, i8** %4
%293 = load i32, i32* %6
%294 = sext i32 %293 to i64
%295 = getelementptr inbounds i8, i8* %292, i64 %294
%296 = load i8, i8* %295
%297 = sext i8 %296 to i32
%298 = icmp eq i32 %297, 9
br i1 %298, label %308, label %299
299: ; preds = %291
%300 = load i8*, i8** %4
%301 = load i32, i32* %6
%302 = sext i32 %301 to i64
%303 = getelementptr inbounds i8, i8* %300, i64 %302
%304 = load i8, i8* %303
%305 = sext i8 %304 to i32
%306 = icmp eq i32 %305, 0
br i1 %306, label %308, label %307
307: ; preds = %299
store i32 0, i32* %3
br label %441
308: ; preds = %299, %291, %283
br label %309
309: ; preds = %308, %249
br label %438
310: ; preds = %16, %2
%311 = load i8*, i8** %4
%312 = load i32, i32* %6
%313 = sext i32 %312 to i64
%314 = getelementptr inbounds i8, i8* %311, i64 %313
%315 = load i8, i8* %314
%316 = sext i8 %315 to i32
%317 = icmp eq i32 %316, 36
br i1 %317, label %318, label %436
318: ; preds = %310
%319 = load i32, i32* %6
%320 = add nsw i32 %319, 1
store i32 %320, i32* %6
store i32 0, i32* %7
br label %321
321: ; preds = %318, %432
%322 = load i8*, i8** %4
%323 = load i32, i32* %6
%324 = sext i32 %323 to i64
%325 = getelementptr inbounds i8, i8* %322, i64 %324
%326 = load i8, i8* %325
%327 = sext i8 %326 to i32
%328 = icmp sge i32 %327, 48
br i1 %328, label %329, label %348
329: ; preds = %321
%330 = load i8*, i8** %4
%331 = load i32, i32* %6
%332 = sext i32 %331 to i64
%333 = getelementptr inbounds i8, i8* %330, i64 %332
%334 = load i8, i8* %333
%335 = sext i8 %334 to i32
%336 = icmp sle i32 %335, 57
br i1 %336, label %337, label %348
337: ; preds = %329
%338 = load i32, i32* %7
%339 = mul nsw i32 %338, 16
%340 = load i8*, i8** %4
%341 = load i32, i32* %6
%342 = sext i32 %341 to i64
%343 = getelementptr inbounds i8, i8* %340, i64 %342
%344 = load i8, i8* %343
%345 = sext i8 %344 to i32
%346 = add nsw i32 %339, %345
%347 = sub nsw i32 %346, 48
store i32 %347, i32* %7
br label %432
348: ; preds = %329, %321
%349 = load i8*, i8** %4
%350 = load i32, i32* %6
%351 = sext i32 %350 to i64
%352 = getelementptr inbounds i8, i8* %349, i64 %351
%353 = load i8, i8* %352
%354 = sext i8 %353 to i32
%355 = icmp sge i32 %354, 97
br i1 %355, label %356, label %376
356: ; preds = %348
%357 = load i8*, i8** %4
%358 = load i32, i32* %6
%359 = sext i32 %358 to i64
%360 = getelementptr inbounds i8, i8* %357, i64 %359
%361 = load i8, i8* %360
%362 = sext i8 %361 to i32
%363 = icmp sle i32 %362, 102
br i1 %363, label %364, label %376
364: ; preds = %356
%365 = load i32, i32* %7
%366 = mul nsw i32 %365, 16
%367 = load i8*, i8** %4
%368 = load i32, i32* %6
%369 = sext i32 %368 to i64
%370 = getelementptr inbounds i8, i8* %367, i64 %369
%371 = load i8, i8* %370
%372 = sext i8 %371 to i32
%373 = add nsw i32 %366, %372
%374 = sub nsw i32 %373, 97
%375 = add nsw i32 %374, 10
store i32 %375, i32* %7
br label %431
376: ; preds = %356, %348
%377 = load i8*, i8** %4
%378 = load i32, i32* %6
%379 = sext i32 %378 to i64
%380 = getelementptr inbounds i8, i8* %377, i64 %379
%381 = load i8, i8* %380
%382 = sext i8 %381 to i32
%383 = icmp sge i32 %382, 65
br i1 %383, label %384, label %404
384: ; preds = %376
%385 = load i8*, i8** %4
%386 = load i32, i32* %6
%387 = sext i32 %386 to i64
%388 = getelementptr inbounds i8, i8* %385, i64 %387
%389 = load i8, i8* %388
%390 = sext i8 %389 to i32
%391 = icmp sle i32 %390, 70
br i1 %391, label %392, label %404
392: ; preds = %384
%393 = load i32, i32* %7
%394 = mul nsw i32 %393, 16
%395 = load i8*, i8** %4
%396 = load i32, i32* %6
%397 = sext i32 %396 to i64
%398 = getelementptr inbounds i8, i8* %395, i64 %397
%399 = load i8, i8* %398
%400 = sext i8 %399 to i32
%401 = add nsw i32 %394, %400
%402 = sub nsw i32 %401, 65
%403 = add nsw i32 %402, 10
store i32 %403, i32* %7
br label %430
404: ; preds = %384, %376
%405 = load i8*, i8** %4
%406 = load i32, i32* %6
%407 = sext i32 %406 to i64
%408 = getelementptr inbounds i8, i8* %405, i64 %407
%409 = load i8, i8* %408
%410 = sext i8 %409 to i32
%411 = icmp eq i32 %410, 32
br i1 %411, label %428, label %412
412: ; preds = %404
%413 = load i8*, i8** %4
%414 = load i32, i32* %6
%415 = sext i32 %414 to i64
%416 = getelementptr inbounds i8, i8* %413, i64 %415
%417 = load i8, i8* %416
%418 = sext i8 %417 to i32
%419 = icmp eq i32 %418, 9
br i1 %419, label %428, label %420
420: ; preds = %412
%421 = load i8*, i8** %4
%422 = load i32, i32* %6
%423 = sext i32 %422 to i64
%424 = getelementptr inbounds i8, i8* %421, i64 %423
%425 = load i8, i8* %424
%426 = sext i8 %425 to i32
%427 = icmp eq i32 %426, 0
br i1 %427, label %428, label %429
428: ; preds = %420, %412, %404
br label %435
429: ; preds = %420
store i32 0, i32* %3
br label %441
430: ; preds = %392
br label %431
431: ; preds = %430, %364
br label %432
432: ; preds = %431, %337
%433 = load i32, i32* %6
%434 = add nsw i32 %433, 1
store i32 %434, i32* %6
br label %321
435: ; preds = %428
br label %437
436: ; preds = %310
store i32 0, i32* %3
br label %441
437: ; preds = %435
br label %438
438: ; preds = %437, %309
%439 = load i32, i32* %7
%440 = load i32*, i32** %5
store i32 %439, i32* %440
store i32 1, i32* %3
br label %441
441: ; preds = %438, %436, %429, %307, %243
%442 = load i32, i32* %3
ret i32 %442
}

LLVM IR (-O2):
define i32 @_get_next_number(i8* nocapture %0, i32* nocapture writeonly %1) {
%3 = load i8, i8* %0
%4 = add i8 %3, -48
%5 = icmp ult i8 %4, 10
br i1 %5, label %6, label %55
6: ; preds = %2
%7 = add i8 %3, -48
%8 = icmp ult i8 %7, 10
br i1 %8, label %9, label %16
9: ; preds = %6, %9
%10 = phi i64 [ %15, %9 ], [ 1, %6 ]
%11 = getelementptr inbounds i8, i8* %0, i64 %10
%12 = load i8, i8* %11
%13 = add i8 %12, -48
%14 = icmp ult i8 %13, 10
%15 = add nuw i64 %10, 1
br i1 %14, label %9, label %16
16: ; preds = %9, %6
%17 = phi i8 [ %3, %6 ], [ %12, %9 ]
switch i8 %17, label %41 [
i8 102, label %18
i8 101, label %18
i8 100, label %18
i8 99, label %18
i8 98, label %18
i8 97, label %18
i8 70, label %18
i8 69, label %18
i8 68, label %18
i8 67, label %18
i8 66, label %18
i8 65, label %18
i8 104, label %18
i8 72, label %18
]
18: ; preds = %16, %16, %16, %16, %16, %16, %16, %16, %16, %16, %16, %16, %16, %16
br label %19
19: ; preds = %18, %33
%20 = phi i8 [ %40, %33 ], [ %3, %18 ]
%21 = phi i64 [ %38, %33 ], [ 0, %18 ]
%22 = phi i32 [ %37, %33 ], [ 0, %18 ]
%23 = sext i8 %20 to i32
%24 = add i8 %20, -48
%25 = icmp ult i8 %24, 10
br i1 %25, label %33, label %26
26: ; preds = %19
%27 = add i8 %20, -97
%28 = icmp ult i8 %27, 6
br i1 %28, label %33, label %29
29: ; preds = %26
%30 = add i8 %20, -65
%31 = icmp ult i8 %30, 6
br i1 %31, label %33, label %32
32: ; preds = %29
switch i8 %20, label %80 [
i8 104, label %78
i8 72, label %78
i8 32, label %78
i8 9, label %78
i8 0, label %78
]
33: ; preds = %29, %26, %19
%34 = phi i32 [ -48, %19 ], [ -87, %26 ], [ -55, %29 ]
%35 = shl nsw i32 %22, 4
%36 = add i32 %35, %34
%37 = add i32 %36, %23
%38 = add nuw i64 %21, 1
%39 = getelementptr inbounds i8, i8* %0, i64 %38
%40 = load i8, i8* %39
br label %19
41: ; preds = %16, %41
%42 = phi i64 [ %49, %41 ], [ 0, %16 ]
%43 = phi i8 [ %51, %41 ], [ %3, %16 ]
%44 = phi i32 [ %48, %41 ], [ 0, %16 ]
%45 = sext i8 %43 to i32
%46 = mul nsw i32 %44, 10
%47 = add i32 %46, -48
%48 = add i32 %47, %45
%49 = add nuw nsw i64 %42, 1
%50 = getelementptr inbounds i8, i8* %0, i64 %49
%51 = load i8, i8* %50
%52 = add i8 %51, -48
%53 = icmp ult i8 %52, 10
br i1 %53, label %41, label %54
54: ; preds = %41
switch i8 %51, label %80 [
i8 32, label %78
i8 9, label %78
i8 0, label %78
]
55: ; preds = %2
%56 = icmp eq i8 %3, 36
br i1 %56, label %57, label %80
57: ; preds = %55, %72
%58 = phi i64 [ %77, %72 ], [ 1, %55 ]
%59 = phi i32 [ %76, %72 ], [ 0, %55 ]
%60 = getelementptr inbounds i8, i8* %0, i64 %58
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = add i8 %61, -48
%64 = icmp ult i8 %63, 10
br i1 %64, label %72, label %65
65: ; preds = %57
%66 = add i8 %61, -97
%67 = icmp ult i8 %66, 6
br i1 %67, label %72, label %68
68: ; preds = %65
%69 = add i8 %61, -65
%70 = icmp ult i8 %69, 6
br i1 %70, label %72, label %71
71: ; preds = %68
switch i8 %61, label %80 [
i8 32, label %78
i8 9, label %78
i8 0, label %78
]
72: ; preds = %68, %65, %57
%73 = phi i32 [ -48, %57 ], [ -87, %65 ], [ -55, %68 ]
%74 = shl nsw i32 %59, 4
%75 = add i32 %74, %73
%76 = add i32 %75, %62
%77 = add nuw i64 %58, 1
br label %57
78: ; preds = %71, %71, %71, %54, %54, %54, %32, %32, %32, %32, %32
%79 = phi i32 [ %22, %32 ], [ %48, %54 ], [ %59, %71 ], [ %22, %32 ], [ %22, %32 ], [ %22, %32 ], [ %22, %32 ], [ %48, %54 ], [ %48, %54 ], [ %59, %71 ], [ %59, %71 ]
store i32 %79, i32* %1
br label %80
80: ; preds = %55, %71, %54, %32, %78
%81 = phi i32 [ 1, %78 ], [ 0, %32 ], [ 0, %54 ], [ 0, %71 ], [ 0, %55 ]
ret i32 %81
}