#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 */
unsigned long strtoul(const char *nptr, char **endptr, int base) {
  int c;
  unsigned long result = 0L;
  unsigned long limit;
  int negative = 0;
  int overflow = 0;
  int digit;
  while ((c = *nptr) && (c == 0x20))
    nptr++;
  if ((c = *nptr) == '+' || c == '-') {
    negative = (c == '-');
    nptr++;
  }
  if (base == 0) {
    base = 10;
    if (*nptr == '0') {
      base = 8;
      nptr++;
      if ((c = *nptr) == 'x' || c == 'X') {
        base = 16;
        nptr++;
      }
    }
  } else if (base == 16 && *nptr == '0') {
    nptr++;
    if ((c = *nptr == 'x') || c == 'X')
      nptr++;
  }
  limit = 4294967295UL / base;
  nptr--;
  while ((c = *++nptr) != 0) {
    if ((((c) >= '0') && ((c) <= '9')))
      digit = c - '0';
    else if (((((c) >= 'A') && ((c) <= 'Z')) || (((c) >= 'a') && ((c) <= 'z'))))
      digit = c - ((c >= 'A' && c <= 'Z') ? 'A' : 'a') + 10;
    else
      break;
    if (digit < 0 || digit >= base)
      break;
    if (result > limit)
      overflow = 1;
    if (!overflow) {
      result = base * result;
      if (digit > 4294967295UL - result)
        overflow = 1;
      else
        result += digit;
    }
  }
  if (negative && !overflow)
    result = 0L - result;
  if (overflow) {
    result = 4294967295UL;
  }
  if (endptr != NULL)
    *endptr = (char *)nptr;
  return result;
}


x86 assembly (clang, -O0):
<strtoul>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movq   $0x0,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    %ecx,-0x18(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x35(%rbp)
je     1147 <strtoul+0x47>
cmpl   $0x20,-0x18(%rbp)
sete   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    1157 <strtoul+0x57>
jmp    1168 <strtoul+0x68>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1125 <strtoul+0x25>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x2b,%eax
je     1185 <strtoul+0x85>
cmpl   $0x2d,-0x18(%rbp)
jne    11a0 <strtoul+0xa0>
cmpl   $0x2d,-0x18(%rbp)
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    120e <strtoul+0x10e>
movl   $0xa,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1209 <strtoul+0x109>
movl   $0x8,-0x14(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x78,%eax
je     11f1 <strtoul+0xf1>
cmpl   $0x58,-0x18(%rbp)
jne    1204 <strtoul+0x104>
movl   $0x10,-0x14(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1209 <strtoul+0x109>
jmp    1274 <strtoul+0x174>
cmpl   $0x10,-0x14(%rbp)
jne    126f <strtoul+0x16f>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    126f <strtoul+0x16f>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x78,%eax
sete   %al
mov    %al,%cl
and    $0x1,%cl
movzbl %cl,%ecx
mov    %ecx,-0x18(%rbp)
test   $0x1,%al
jne    125e <strtoul+0x15e>
cmpl   $0x58,-0x18(%rbp)
jne    126a <strtoul+0x16a>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    126f <strtoul+0x16f>
jmp    1274 <strtoul+0x174>
movslq -0x14(%rbp),%rcx
mov    $0xffffffff,%eax
xor    %edx,%edx
div    %rcx
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
je     13c8 <strtoul+0x2c8>
cmpl   $0x30,-0x18(%rbp)
jl     12d3 <strtoul+0x1d3>
cmpl   $0x39,-0x18(%rbp)
jg     12d3 <strtoul+0x1d3>
mov    -0x18(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x34(%rbp)
jmp    1349 <strtoul+0x249>
cmpl   $0x41,-0x18(%rbp)
jl     12e7 <strtoul+0x1e7>
cmpl   $0x5a,-0x18(%rbp)
jle    12fb <strtoul+0x1fb>
cmpl   $0x61,-0x18(%rbp)
jl     133f <strtoul+0x23f>
cmpl   $0x7a,-0x18(%rbp)
jg     133f <strtoul+0x23f>
mov    -0x18(%rbp),%eax
mov    %eax,-0x3c(%rbp)
xor    %eax,%eax
cmpl   $0x41,-0x18(%rbp)
mov    %al,-0x36(%rbp)
jl     131a <strtoul+0x21a>
cmpl   $0x5a,-0x18(%rbp)
setle  %al
mov    %al,-0x36(%rbp)
mov    -0x3c(%rbp),%eax
mov    -0x36(%rbp),%sil
mov    $0x61,%ecx
mov    $0x41,%edx
test   $0x1,%sil
cmovne %edx,%ecx
sub    %ecx,%eax
add    $0xa,%eax
mov    %eax,-0x34(%rbp)
jmp    1344 <strtoul+0x244>
jmp    13c8 <strtoul+0x2c8>
jmp    1349 <strtoul+0x249>
cmpl   $0x0,-0x34(%rbp)
jl     135f <strtoul+0x25f>
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1364 <strtoul+0x264>
jmp    13c8 <strtoul+0x2c8>
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
jbe    1379 <strtoul+0x279>
movl   $0x1,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
jne    13c3 <strtoul+0x2c3>
movslq -0x14(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
movslq -0x34(%rbp),%rax
mov    $0xffffffff,%ecx
sub    -0x20(%rbp),%rcx
cmp    %rcx,%rax
jbe    13b2 <strtoul+0x2b2>
movl   $0x1,-0x30(%rbp)
jmp    13be <strtoul+0x2be>
movslq -0x34(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    13c3 <strtoul+0x2c3>
jmp    1292 <strtoul+0x192>
cmpl   $0x0,-0x2c(%rbp)
je     13e6 <strtoul+0x2e6>
cmpl   $0x0,-0x30(%rbp)
jne    13e6 <strtoul+0x2e6>
xor    %eax,%eax
sub    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x30(%rbp)
je     13f9 <strtoul+0x2f9>
mov    $0xffffffff,%eax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     140f <strtoul+0x30f>
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtoul>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r11d
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%eax
cmp    $0x20,%al
jne    111d <strtoul+0x1d>
add    $0x1,%rdi
jmp    1110 <strtoul+0x10>
cmp    $0x2b,%al
je     1125 <strtoul+0x25>
cmp    $0x2d,%al
jne    116e <strtoul+0x6e>
xor    %r8d,%r8d
cmp    $0x2d,%al
sete   %r8b
add    $0x1,%rdi
cmp    $0x10,%r11d
je     1177 <strtoul+0x77>
test   %r11d,%r11d
jne    119a <strtoul+0x9a>
mov    (%rdi),%cl
mov    $0xa,%r11d
cmp    $0x30,%cl
jne    119c <strtoul+0x9c>
lea    0x1(%rdi),%rax
mov    0x1(%rdi),%cl
and    $0xdf,%cl
add    $0x2,%rdi
xor    %edx,%edx
cmp    $0x58,%cl
sete   %dl
lea    0x8(,%rdx,8),%r11d
cmovne %rax,%rdi
jmp    119a <strtoul+0x9a>
xor    %r8d,%r8d
cmp    $0x10,%r11d
jne    1138 <strtoul+0x38>
mov    (%rdi),%cl
mov    $0x10,%r11d
cmp    $0x30,%cl
jne    119c <strtoul+0x9c>
lea    0x2(%rdi),%rax
cmpb   $0x78,0x1(%rdi)
lea    0x1(%rdi),%rdi
cmove  %rax,%rdi
mov    $0x10,%r11d
mov    (%rdi),%cl
movslq %r11d,%r10
xor    %r14d,%r14d
mov    %r10,%rax
shr    $0x20,%rax
jne    11b7 <strtoul+0xb7>
mov    $0xffffffff,%eax
xor    %edx,%edx
div    %r11d
jmp    11b9 <strtoul+0xb9>
xor    %eax,%eax
mov    $0xffffffff,%r9d
test   %cl,%cl
je     1262 <strtoul+0x162>
xor    %r12d,%r12d
xor    %r15d,%r15d
jmp    11e3 <strtoul+0xe3>
nop
movzbl 0x1(%rdi),%ecx
add    $0x1,%rdi
mov    %r14d,%r12d
test   %cl,%cl
je     1279 <strtoul+0x179>
movsbl %cl,%edx
lea    -0x30(%rdx),%ebx
cmp    $0x9,%bl
ja     1200 <strtoul+0x100>
add    $0xffffffd0,%edx
test   %edx,%edx
jns    1224 <strtoul+0x124>
jmp    126c <strtoul+0x16c>
nopw   0x0(%rax,%rax,1)
lea    -0x41(%rcx),%ebp
mov    $0xffffffbf,%ebx
cmp    $0x1a,%bpl
jb     121b <strtoul+0x11b>
add    $0x9f,%cl
mov    $0xffffff9f,%ebx
cmp    $0x19,%cl
ja     126c <strtoul+0x16c>
add    %ebx,%edx
add    $0xa,%edx
test   %edx,%edx
js     126c <strtoul+0x16c>
cmp    %r11d,%edx
jge    1276 <strtoul+0x176>
mov    $0x1,%r14d
cmp    %rax,%r15
ja     11d0 <strtoul+0xd0>
test   %r12d,%r12d
jne    11d0 <strtoul+0xd0>
imul   %r10,%r15
mov    %edx,%ecx
mov    $0xffffffff,%edx
sub    %r15,%rdx
xor    %r14d,%r14d
cmp    %rcx,%rdx
setb   %r14b
mov    $0x0,%edx
cmovae %rcx,%rdx
add    %rdx,%r15
jmp    11d0 <strtoul+0xd0>
xor    %r15d,%r15d
test   %rsi,%rsi
jne    127e <strtoul+0x17e>
jmp    1281 <strtoul+0x181>
mov    %r12d,%r14d
test   %rsi,%rsi
jne    127e <strtoul+0x17e>
jmp    1281 <strtoul+0x181>
mov    %r12d,%r14d
test   %rsi,%rsi
je     1281 <strtoul+0x181>
mov    %rdi,(%rsi)
mov    %r15,%rax
neg    %rax
test   %r14d,%r14d
cmovne %r15,%rax
test   %r8d,%r8d
cmove  %r15,%rax
test   %r14d,%r14d
cmovne %r9,%rax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i64 @strtoul(i8* %0, i8** writeonly %1, i32 %2) {
br label %4
4: ; preds = %7, %3
%5 = phi i8* [ %0, %3 ], [ %8, %7 ]
%6 = load i8, i8* %5
switch i8 %6, label %13 [
i8 32, label %7
i8 45, label %9
i8 43, label %9
]
7: ; preds = %4
%8 = getelementptr inbounds i8, i8* %5, i64 1
br label %4
9: ; preds = %4, %4
%10 = icmp eq i8 %6, 45
%11 = zext i1 %10 to i32
%12 = getelementptr inbounds i8, i8* %5, i64 1
br label %13
13: ; preds = %4, %9
%14 = phi i8* [ %12, %9 ], [ %5, %4 ]
%15 = phi i32 [ %11, %9 ], [ 0, %4 ]
switch i32 %2, label %36 [
i32 0, label %16
i32 16, label %27
]
16: ; preds = %13
%17 = load i8, i8* %14
%18 = icmp eq i8 %17, 48
br i1 %18, label %19, label %40
19: ; preds = %16
%20 = getelementptr inbounds i8, i8* %14, i64 1
%21 = load i8, i8* %20
%22 = and i8 %21, -33
%23 = icmp eq i8 %22, 88
%24 = getelementptr inbounds i8, i8* %14, i64 2
%25 = select i1 %23, i32 16, i32 8
%26 = select i1 %23, i8* %24, i8* %20
br label %36
27: ; preds = %13
%28 = load i8, i8* %14
%29 = icmp eq i8 %28, 48
br i1 %29, label %30, label %40
30: ; preds = %27
%31 = getelementptr inbounds i8, i8* %14, i64 1
%32 = load i8, i8* %31
%33 = icmp eq i8 %32, 120
%34 = getelementptr inbounds i8, i8* %14, i64 2
%35 = select i1 %33, i8* %34, i8* %31
br label %36
36: ; preds = %13, %19, %30
%37 = phi i32 [ 16, %30 ], [ %2, %13 ], [ %25, %19 ]
%38 = phi i8* [ %35, %30 ], [ %14, %13 ], [ %26, %19 ]
%39 = load i8, i8* %38
br label %40
40: ; preds = %36, %27, %16
%41 = phi i8 [ %39, %36 ], [ %28, %27 ], [ %17, %16 ]
%42 = phi i32 [ %37, %36 ], [ 16, %27 ], [ 10, %16 ]
%43 = phi i8* [ %38, %36 ], [ %14, %27 ], [ %14, %16 ]
%44 = sext i32 %42 to i64
%45 = udiv i64 4294967295, %44
%46 = icmp eq i8 %41, 0
br i1 %46, label %90, label %47
47: ; preds = %40, %84
%48 = phi i8 [ %88, %84 ], [ %41, %40 ]
%49 = phi i8* [ %87, %84 ], [ %43, %40 ]
%50 = phi i32 [ %86, %84 ], [ 0, %40 ]
%51 = phi i64 [ %85, %84 ], [ 0, %40 ]
%52 = sext i8 %48 to i32
%53 = add i8 %48, -48
%54 = icmp ult i8 %53, 10
br i1 %54, label %55, label %57
55: ; preds = %47
%56 = add nsw i32 %52, -48
br label %67
57: ; preds = %47
%58 = add i8 %48, -65
%59 = icmp ult i8 %58, 26
br i1 %59, label %63, label %60
60: ; preds = %57
%61 = add i8 %48, -97
%62 = icmp ult i8 %61, 26
br i1 %62, label %63, label %90
63: ; preds = %60, %57
%64 = phi i32 [ -97, %60 ], [ -65, %57 ]
%65 = add nsw i32 %52, 10
%66 = add nsw i32 %65, %64
br label %67
67: ; preds = %63, %55
%68 = phi i32 [ %56, %55 ], [ %66, %63 ]
%69 = icmp sgt i32 %68, -1
%70 = icmp slt i32 %68, %42
%71 = select i1 %69, i1 %70, i1 false
br i1 %71, label %72, label %90
72: ; preds = %67
%73 = icmp ule i64 %51, %45
%74 = icmp eq i32 %50, 0
%75 = select i1 %73, i1 %74, i1 false
br i1 %75, label %76, label %84
76: ; preds = %72
%77 = mul i64 %51, %44
%78 = zext i32 %68 to i64
%79 = sub i64 4294967295, %77
%80 = icmp ult i64 %79, %78
%81 = select i1 %80, i64 0, i64 %78
%82 = add i64 %81, %77
%83 = zext i1 %80 to i32
br label %84
84: ; preds = %76, %72
%85 = phi i64 [ %51, %72 ], [ %82, %76 ]
%86 = phi i32 [ 1, %72 ], [ %83, %76 ]
%87 = getelementptr inbounds i8, i8* %49, i64 1
%88 = load i8, i8* %87
%89 = icmp eq i8 %88, 0
br i1 %89, label %90, label %47
90: ; preds = %84, %60, %67, %40
%91 = phi i64 [ 0, %40 ], [ %51, %67 ], [ %51, %60 ], [ %85, %84 ]
%92 = phi i32 [ 0, %40 ], [ %50, %67 ], [ %50, %60 ], [ %86, %84 ]
%93 = phi i8* [ %43, %40 ], [ %49, %67 ], [ %49, %60 ], [ %87, %84 ]
%94 = icmp ne i32 %92, 0
%95 = icmp eq i8** %1, null
br i1 %95, label %97, label %96
96: ; preds = %90
store i8* %93, i8** %1
br label %97
97: ; preds = %96, %90
%98 = icmp eq i32 %15, 0
%99 = or i1 %98, %94
%100 = sub i64 0, %91
%101 = select i1 %99, i64 %91, i64 %100
%102 = select i1 %94, i64 4294967295, i64 %101
ret i64 %102
}