long long yalex_atoll_s(const char *buf, char **end, int radix) {
  end = 0;
  register const char *s = buf;
  register unsigned long long acc;
  register int c;
  register unsigned long long cutoff;
  register int neg = 0, any, cutlim;
  c = *s++;
  if (c == '-') {
    neg = 1;
    c = *s++;
  } else if (c == '+') {
    c = *s++;
  }
  if ((radix == 0 || radix == 16) && c == '0' && (*s == 'x' || *s == 'X')) {
    c = s[1];
    s += 2;
    radix = 16;
  }
  if (radix == 0)
    radix = c == '0' ? 8 : 10;
  cutoff = neg ? (0x8000000000000000) : (0x7FFFFFFFFFFFFFFF);
  cutlim = cutoff % (long long)radix;
  cutoff /= (long long)radix;
  for (acc = 0, any = 0;; c = *s++) {
    if ((c >= '0' && c <= '9'))
      c -= '0';
    else if (((c >= 'A' && c <= 'Z') || c >= 'a' && c <= 'z'))
      c -= (c >= 'A' && c <= 'Z') ? 'A' - 10 : 'a' - 10;
    else
      break;
    if (c >= radix)
      break;
    if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
      any = -1;
    else {
      any = 1;
      acc *= radix;
      acc += c;
    }
  }
  if (any < 0) {
    return neg ? (0x8000000000000000) : (0x7FFFFFFFFFFFFFFF);
  } else if (neg) {
    return -1 * ((long long)acc);
  }
  return (long long)acc;
}


x86 assembly (clang, -O0):
<yalex_atoll_s>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x2d,-0x34(%rbp)
jne    1166 <yalex_atoll_s+0x66>
movl   $0x1,-0x44(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
jmp    118a <yalex_atoll_s+0x8a>
cmpl   $0x2b,-0x34(%rbp)
jne    1185 <yalex_atoll_s+0x85>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
jmp    118a <yalex_atoll_s+0x8a>
cmpl   $0x0,-0x1c(%rbp)
je     119e <yalex_atoll_s+0x9e>
cmpl   $0x10,-0x1c(%rbp)
jne    11e6 <yalex_atoll_s+0xe6>
cmpl   $0x30,-0x34(%rbp)
jne    11e6 <yalex_atoll_s+0xe6>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x78,%eax
je     11c8 <yalex_atoll_s+0xc8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x58,%eax
jne    11e6 <yalex_atoll_s+0xe6>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
movl   $0x10,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    1206 <yalex_atoll_s+0x106>
mov    -0x34(%rbp),%edx
mov    $0xa,%eax
mov    $0x8,%ecx
cmp    $0x30,%edx
cmove  %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x44(%rbp),%edx
movabs $0x7fffffffffffffff,%rax
ff ff 7f
movabs $0x8000000000000000,%rcx
cmp    $0x0,%edx
cmovne %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movslq -0x1c(%rbp),%rcx
xor    %edx,%edx
div    %rcx
mov    %edx,%eax
mov    %eax,-0x4c(%rbp)
movslq -0x1c(%rbp),%rcx
mov    -0x40(%rbp),%rax
xor    %edx,%edx
div    %rcx
mov    %rax,-0x40(%rbp)
movq   $0x0,-0x30(%rbp)
movl   $0x0,-0x48(%rbp)
cmpl   $0x30,-0x34(%rbp)
jl     127c <yalex_atoll_s+0x17c>
cmpl   $0x39,-0x34(%rbp)
jg     127c <yalex_atoll_s+0x17c>
mov    -0x34(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x34(%rbp)
jmp    12e7 <yalex_atoll_s+0x1e7>
cmpl   $0x41,-0x34(%rbp)
jl     1290 <yalex_atoll_s+0x190>
cmpl   $0x5a,-0x34(%rbp)
jle    12a4 <yalex_atoll_s+0x1a4>
cmpl   $0x61,-0x34(%rbp)
jl     12dd <yalex_atoll_s+0x1dd>
cmpl   $0x7a,-0x34(%rbp)
jg     12dd <yalex_atoll_s+0x1dd>
xor    %eax,%eax
cmpl   $0x41,-0x34(%rbp)
mov    %al,-0x4d(%rbp)
jl     12bd <yalex_atoll_s+0x1bd>
cmpl   $0x5a,-0x34(%rbp)
setle  %al
mov    %al,-0x4d(%rbp)
mov    -0x4d(%rbp),%dl
mov    $0x57,%ecx
mov    $0x37,%eax
test   $0x1,%dl
cmovne %eax,%ecx
mov    -0x34(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x34(%rbp)
jmp    12e2 <yalex_atoll_s+0x1e2>
jmp    1375 <yalex_atoll_s+0x275>
jmp    12e7 <yalex_atoll_s+0x1e7>
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jl     12f8 <yalex_atoll_s+0x1f8>
jmp    1375 <yalex_atoll_s+0x275>
cmpl   $0x0,-0x48(%rbp)
jl     132a <yalex_atoll_s+0x22a>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
ja     132a <yalex_atoll_s+0x22a>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jne    1336 <yalex_atoll_s+0x236>
mov    -0x34(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jle    1336 <yalex_atoll_s+0x236>
movl   $0xffffffff,-0x48(%rbp)
jmp    1356 <yalex_atoll_s+0x256>
movl   $0x1,-0x48(%rbp)
movslq -0x1c(%rbp),%rax
imul   -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movslq -0x34(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    135b <yalex_atoll_s+0x25b>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
jmp    125a <yalex_atoll_s+0x15a>
cmpl   $0x0,-0x48(%rbp)
jge    13a6 <yalex_atoll_s+0x2a6>
mov    -0x44(%rbp),%edx
movabs $0x7fffffffffffffff,%rax
ff ff 7f
movabs $0x8000000000000000,%rcx
cmp    $0x0,%edx
cmovne %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    13cb <yalex_atoll_s+0x2cb>
cmpl   $0x0,-0x44(%rbp)
je     13be <yalex_atoll_s+0x2be>
imul   $0xffffffffffffffff,-0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13cb <yalex_atoll_s+0x2cb>
jmp    13c3 <yalex_atoll_s+0x2c3>
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<yalex_atoll_s>:
push   %rbp
push   %r14
push   %rbx
mov    %edx,%r11d
mov    (%rdi),%al
cmp    $0x2d,%al
je     1116 <yalex_atoll_s+0x16>
cmp    $0x2b,%al
jne    112b <yalex_atoll_s+0x2b>
mov    $0x1,%r8b
jmp    1119 <yalex_atoll_s+0x19>
xor    %r8d,%r8d
mov    0x1(%rdi),%al
add    $0x2,%rdi
test   $0xffffffef,%r11d
je     113b <yalex_atoll_s+0x3b>
jmp    1158 <yalex_atoll_s+0x58>
add    $0x1,%rdi
mov    $0x1,%r8b
test   $0xffffffef,%r11d
jne    1158 <yalex_atoll_s+0x58>
cmp    $0x30,%al
jne    1158 <yalex_atoll_s+0x58>
mov    (%rdi),%al
or     $0x20,%al
cmp    $0x78,%al
jne    1174 <yalex_atoll_s+0x74>
movsbl 0x1(%rdi),%r14d
add    $0x2,%rdi
mov    $0x10,%r11d
jmp    1185 <yalex_atoll_s+0x85>
movsbl %al,%r14d
xor    %ecx,%ecx
cmp    $0x30,%al
setne  %al
test   %r11d,%r11d
jne    1185 <yalex_atoll_s+0x85>
mov    %al,%cl
lea    (%rcx,%rcx,1),%r11d
add    $0x8,%r11d
jmp    1185 <yalex_atoll_s+0x85>
mov    $0x30,%r14d
test   %r11d,%r11d
jne    1185 <yalex_atoll_s+0x85>
mov    $0x8,%r11d
movabs $0x7fffffffffffffff,%rax
ff ff 7f
lea    0x1(%rax),%r9
test   %r8b,%r8b
cmovne %rax,%r9
movslq %r11d,%r10
mov    %r9,%rax
or     %r10,%rax
shr    $0x20,%rax
je     11b3 <yalex_atoll_s+0xb3>
mov    %r9,%rax
xor    %edx,%edx
div    %r10
jmp    11bb <yalex_atoll_s+0xbb>
mov    %r9d,%eax
xor    %edx,%edx
div    %r11d
xor    %esi,%esi
xor    %ecx,%ecx
jmp    11de <yalex_atoll_s+0xde>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rsi,%rbx
movsbl (%rdi),%r14d
add    $0x1,%rdi
mov    %rbx,%rsi
lea    -0x30(%r14),%ebp
cmp    $0xa,%ebp
jb     1206 <yalex_atoll_s+0x106>
lea    -0x41(%r14),%ebx
mov    $0xffffffc9,%ebp
cmp    $0x1a,%ebx
jb     1203 <yalex_atoll_s+0x103>
lea    -0x61(%r14),%ebx
mov    $0xffffffa9,%ebp
cmp    $0x19,%ebx
ja     1233 <yalex_atoll_s+0x133>
add    %r14d,%ebp
cmp    %r11d,%ebp
jge    1233 <yalex_atoll_s+0x133>
test   %ecx,%ecx
mov    $0xffffffff,%ecx
js     11d0 <yalex_atoll_s+0xd0>
cmp    %rax,%rsi
ja     11d0 <yalex_atoll_s+0xd0>
jne    1222 <yalex_atoll_s+0x122>
mov    %rax,%rbx
cmp    %edx,%ebp
jg     11d3 <yalex_atoll_s+0xd3>
imul   %r10,%rsi
movslq %ebp,%rbx
add    %rsi,%rbx
mov    $0x1,%ecx
jmp    11d3 <yalex_atoll_s+0xd3>
mov    %rsi,%rax
neg    %rax
test   %r8b,%r8b
cmovne %rsi,%rax
test   %ecx,%ecx
cmovs  %r9,%rax
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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