int strtol(nptr, endptr, base) const char *nptr;
char **endptr;
int base;
{
  int negative;
  register unsigned int cutoff;
  register unsigned int cutlim;
  register unsigned int i;
  register const char *s;
  register unsigned char c;
  const char *save, *end;
  int overflow;
  if (base < 0 || base == 1 || base > 36)
    base = 10;
  save = s = nptr;
  while (((unsigned char)*s) <= 32 && *s)
    ++s;
  if (*s == '\0')
    goto noconv;
  if (*s == '-') {
    negative = 1;
    ++s;
  } else if (*s == '+') {
    negative = 0;
    ++s;
  } else
    negative = 0;
  if ((base == 16 && s[0] == '0' && (s[1] == 'X')) || (s[1] == 'x'))
    s += 2;
  if (base == 0) {
    if (*s == '0') {
      if (s[1] == 'X' || s[1] == 'x') {
        s += 2;
        base = 16;
      } else
        base = 8;
    } else
      base = 10;
  }
  save = s;
  end = 0;
  cutoff = 0x7FFFFFFF / (unsigned int)base;
  cutlim = 0x7FFFFFFF % (unsigned int)base;
  overflow = 0;
  i = 0;
  for (c = *s; c != '\0'; c = *++s) {
    if (s == end)
      break;
    if (c >= '0' && c <= '9')
      c -= '0';
    else if (c >= 'A' && c <= 'Z')
      c = c - 'A' + 10;
    else if (c >= 'a' && c <= 'z')
      c = c - 'a' + 10;
    else
      break;
    if (c >= base)
      break;
    if (i > cutoff || (i == cutoff && c > cutlim))
      overflow = 1;
    else {
      i *= (unsigned int)base;
      i += c;
    }
  }
  if (s == save)
    goto noconv;
  if (endptr)
    *endptr = (char *)s;
  if (overflow)
    return negative ? (int)0x80000000 : (int)0x7FFFFFFF;
  return (negative ? -i : i);
noconv:
  if (endptr) {
    if (save - nptr >= 2 && __tolower(save[-1]) == 'x' && save[-2] == '0')
      *endptr = (char *)&save[-1];
    else
      *endptr = (char *)nptr;
  }
  return 0L;
}


x86 assembly (clang, -O0):
<strtol>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     1141 <strtol+0x31>
cmpl   $0x1,-0x1c(%rbp)
je     1141 <strtol+0x31>
cmpl   $0x24,-0x1c(%rbp)
jle    1148 <strtol+0x38>
movl   $0xa,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    %rax,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movzbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x55(%rbp)
jg     1179 <strtol+0x69>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x55(%rbp)
mov    -0x55(%rbp),%al
test   $0x1,%al
jne    1189 <strtol+0x79>
jmp    119a <strtol+0x8a>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1154 <strtol+0x44>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11af <strtol+0x9f>
jmp    149c <strtol+0x38c>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    11d7 <strtol+0xc7>
movl   $0x1,-0x20(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    120b <strtol+0xfb>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11ff <strtol+0xef>
movl   $0x0,-0x20(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1206 <strtol+0xf6>
movl   $0x0,-0x20(%rbp)
jmp    120b <strtol+0xfb>
cmpl   $0x10,-0x1c(%rbp)
jne    1236 <strtol+0x126>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1236 <strtol+0x126>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
je     1247 <strtol+0x137>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
jne    1253 <strtol+0x143>
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    12bf <strtol+0x1af>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    12b3 <strtol+0x1a3>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
je     128f <strtol+0x17f>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
jne    12a7 <strtol+0x197>
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
movl   $0x10,-0x1c(%rbp)
jmp    12ae <strtol+0x19e>
movl   $0x8,-0x1c(%rbp)
jmp    12ba <strtol+0x1aa>
movl   $0xa,-0x1c(%rbp)
jmp    12bf <strtol+0x1af>
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
mov    $0x7fffffff,%eax
xor    %edx,%edx
divl   -0x1c(%rbp)
mov    %eax,-0x24(%rbp)
mov    $0x7fffffff,%eax
xor    %edx,%edx
divl   -0x1c(%rbp)
mov    %edx,-0x28(%rbp)
movl   $0x0,-0x54(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x39(%rbp)
movzbl -0x39(%rbp),%eax
cmp    $0x0,%eax
je     1426 <strtol+0x316>
mov    -0x38(%rbp),%rax
cmp    -0x50(%rbp),%rax
jne    1320 <strtol+0x210>
jmp    1426 <strtol+0x316>
movzbl -0x39(%rbp),%eax
cmp    $0x30,%eax
jl     1349 <strtol+0x239>
movzbl -0x39(%rbp),%eax
cmp    $0x39,%eax
jg     1349 <strtol+0x239>
movzbl -0x39(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x39(%rbp)
jmp    13b0 <strtol+0x2a0>
movzbl -0x39(%rbp),%eax
cmp    $0x41,%eax
jl     1375 <strtol+0x265>
movzbl -0x39(%rbp),%eax
cmp    $0x5a,%eax
jg     1375 <strtol+0x265>
movzbl -0x39(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,-0x39(%rbp)
jmp    13ab <strtol+0x29b>
movzbl -0x39(%rbp),%eax
cmp    $0x61,%eax
jl     13a1 <strtol+0x291>
movzbl -0x39(%rbp),%eax
cmp    $0x7a,%eax
jg     13a1 <strtol+0x291>
movzbl -0x39(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,-0x39(%rbp)
jmp    13a6 <strtol+0x296>
jmp    1426 <strtol+0x316>
jmp    13ab <strtol+0x29b>
jmp    13b0 <strtol+0x2a0>
movzbl -0x39(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jl     13c2 <strtol+0x2b2>
jmp    1426 <strtol+0x316>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
ja     13e7 <strtol+0x2d7>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jne    13f3 <strtol+0x2e3>
movzbl -0x39(%rbp),%eax
cmp    -0x28(%rbp),%eax
jbe    13f3 <strtol+0x2e3>
movl   $0x1,-0x54(%rbp)
jmp    1407 <strtol+0x2f7>
mov    -0x1c(%rbp),%eax
imul   -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movzbl -0x39(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    140c <strtol+0x2fc>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x39(%rbp)
jmp    1300 <strtol+0x1f0>
mov    -0x38(%rbp),%rax
cmp    -0x48(%rbp),%rax
jne    1439 <strtol+0x329>
jmp    149c <strtol+0x38c>
cmpq   $0x0,-0x18(%rbp)
je     144f <strtol+0x33f>
mov    -0x38(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
cmpl   $0x0,-0x54(%rbp)
je     1474 <strtol+0x364>
mov    -0x20(%rbp),%edx
mov    $0x7fffffff,%eax
mov    $0x80000000,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1510 <strtol+0x400>
cmpl   $0x0,-0x20(%rbp)
je     148b <strtol+0x37b>
xor    %eax,%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    1491 <strtol+0x381>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1510 <strtol+0x400>
cmpq   $0x0,-0x18(%rbp)
je     1509 <strtol+0x3f9>
mov    -0x48(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x2,%rax
jl     14f9 <strtol+0x3e9>
mov    -0x48(%rbp),%rax
movsbl -0x1(%rax),%edi
mov    $0x0,%al
call   1030 <__tolower@plt>
cmp    $0x78,%eax
jne    14f9 <strtol+0x3e9>
mov    -0x48(%rbp),%rax
movsbl -0x2(%rax),%eax
cmp    $0x30,%eax
jne    14f9 <strtol+0x3e9>
mov    -0x48(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    1504 <strtol+0x3f4>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    1509 <strtol+0x3f9>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtol>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r9d
mov    %rsi,%r14
mov    %rdi,%r15
cmp    $0x1,%edx
sete   %al
cmp    $0x25,%edx
setae  %dl
or     %al,%dl
mov    %rdi,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%rax),%ecx
lea    -0x21(%rcx),%esi
add    $0x1,%rax
cmp    $0xdf,%sil
ja     1140 <strtol+0x30>
test   %dl,%dl
mov    $0xa,%edx
cmovne %edx,%r9d
cmp    $0x2d,%cl
je     117f <strtol+0x6f>
cmp    $0x2b,%cl
je     1174 <strtol+0x64>
mov    %r15,%r12
test   %cl,%cl
je     128a <strtol+0x17a>
add    $0xffffffffffffffff,%rax
mov    $0x1,%r8b
cmp    $0x10,%r9d
je     1188 <strtol+0x78>
jmp    1193 <strtol+0x83>
xor    %r8d,%r8d
cmp    $0x10,%r9d
jne    1193 <strtol+0x83>
cmpb   $0x30,(%rax)
jne    1193 <strtol+0x83>
cmpb   $0x58,0x1(%rax)
je     1199 <strtol+0x89>
cmpb   $0x78,0x1(%rax)
jne    119d <strtol+0x8d>
add    $0x2,%rax
mov    %rax,%r12
test   %r9d,%r9d
je     1235 <strtol+0x125>
mov    (%r12),%bpl
mov    $0x7fffffff,%eax
xor    %edx,%edx
div    %r9d
test   %bpl,%bpl
je     128a <strtol+0x17a>
xor    %esi,%esi
mov    %r12,%rdi
xor    %ebx,%ebx
jmp    11e9 <strtol+0xd9>
nopl   0x0(%rax)
mov    %ebx,%r10d
movzbl 0x1(%rdi),%ebp
add    $0x1,%rdi
mov    %ecx,%esi
mov    %r10d,%ebx
test   %bpl,%bpl
je     126c <strtol+0x15c>
lea    -0x30(%rbp),%ecx
cmp    $0xa,%cl
jb     120e <strtol+0xfe>
lea    -0x41(%rbp),%ecx
cmp    $0x19,%cl
ja     1200 <strtol+0xf0>
add    $0xc9,%bpl
jmp    120c <strtol+0xfc>
nop
lea    -0x61(%rbp),%ecx
cmp    $0x19,%cl
ja     1267 <strtol+0x157>
add    $0xa9,%bpl
mov    %ebp,%ecx
movzbl %cl,%ebp
cmp    %ebp,%r9d
jle    1267 <strtol+0x157>
mov    $0x1,%ecx
cmp    %eax,%ebx
ja     11d0 <strtol+0xc0>
jne    1228 <strtol+0x118>
mov    %eax,%r10d
cmp    %ebp,%edx
jb     11d3 <strtol+0xc3>
imul   %r9d,%ebx
add    %ebp,%ebx
mov    %ebx,%r10d
mov    %esi,%ecx
jmp    11d3 <strtol+0xc3>
mov    (%r12),%bpl
mov    $0xa,%r9d
cmp    $0x30,%bpl
jne    11ad <strtol+0x9d>
mov    0x1(%r12),%al
or     $0x20,%al
cmp    $0x78,%al
jne    12de <strtol+0x1ce>
add    $0x2,%r12
mov    $0x10,%r9d
jmp    11a9 <strtol+0x99>
mov    %ebx,%r10d
mov    %esi,%ecx
cmp    %r12,%rdi
je     128a <strtol+0x17a>
test   %r14,%r14
je     1279 <strtol+0x169>
mov    %rdi,(%r14)
test   %ecx,%ecx
je     12c7 <strtol+0x1b7>
movzbl %r8b,%eax
mov    $0x80000000,%ebp
sub    %eax,%ebp
jmp    12d3 <strtol+0x1c3>
xor    %ebp,%ebp
test   %r14,%r14
je     12d3 <strtol+0x1c3>
mov    %r12,%rax
sub    %r15,%rax
cmp    $0x2,%rax
jl     12c2 <strtol+0x1b2>
movsbl -0x1(%r12),%edi
xor    %eax,%eax
call   1030 <__tolower@plt>
cmp    $0x78,%eax
jne    12c2 <strtol+0x1b2>
cmpb   $0x30,-0x2(%r12)
jne    12c2 <strtol+0x1b2>
add    $0xffffffffffffffff,%r12
mov    %r12,(%r14)
xor    %ebp,%ebp
jmp    12d3 <strtol+0x1c3>
mov    %r15,(%r14)
jmp    12d3 <strtol+0x1c3>
mov    %r10d,%ebp
neg    %ebp
test   %r8b,%r8b
cmovne %r10d,%ebp
mov    %ebp,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x30,%bpl
mov    $0x8,%r9d
mov    $0xfffffff,%eax
mov    $0x7,%edx
jmp    11c0 <strtol+0xb0>

LLVM IR (-O0):
define i32 @strtol(i8* %0, i8** %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8**
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i8*
%13 = alloca i8
%14 = alloca i8*
%15 = alloca i8*
%16 = alloca i32
store i8* %0, i8** %5
store i8** %1, i8*** %6
store i32 %2, i32* %7
%17 = load i32, i32* %7
%18 = icmp slt i32 %17, 0
br i1 %18, label %25, label %19
19: ; preds = %3
%20 = load i32, i32* %7
%21 = icmp eq i32 %20, 1
br i1 %21, label %25, label %22
22: ; preds = %19
%23 = load i32, i32* %7
%24 = icmp sgt i32 %23, 36
br i1 %24, label %25, label %26
25: ; preds = %22, %19, %3
store i32 10, i32* %7
br label %26
26: ; preds = %25, %22
%27 = load i8*, i8** %5
store i8* %27, i8** %12
store i8* %27, i8** %14
br label %28
28: ; preds = %40, %26
%29 = load i8*, i8** %12
%30 = load i8, i8* %29
%31 = zext i8 %30 to i32
%32 = icmp sle i32 %31, 32
br i1 %32, label %33, label %38
33: ; preds = %28
%34 = load i8*, i8** %12
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = icmp ne i32 %36, 0
br label %38
38: ; preds = %33, %28
%39 = phi i1 [ false, %28 ], [ %37, %33 ]
br i1 %39, label %40, label %43
40: ; preds = %38
%41 = load i8*, i8** %12
%42 = getelementptr inbounds i8, i8* %41, i32 1
store i8* %42, i8** %12
br label %28
43: ; preds = %38
%44 = load i8*, i8** %12
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 0
br i1 %47, label %48, label %49
48: ; preds = %43
br label %241
49: ; preds = %43
%50 = load i8*, i8** %12
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp eq i32 %52, 45
br i1 %53, label %54, label %57
54: ; preds = %49
store i32 1, i32* %8
%55 = load i8*, i8** %12
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %12
br label %67
57: ; preds = %49
%58 = load i8*, i8** %12
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = icmp eq i32 %60, 43
br i1 %61, label %62, label %65
62: ; preds = %57
store i32 0, i32* %8
%63 = load i8*, i8** %12
%64 = getelementptr inbounds i8, i8* %63, i32 1
store i8* %64, i8** %12
br label %66
65: ; preds = %57
store i32 0, i32* %8
br label %66
66: ; preds = %65, %62
br label %67
67: ; preds = %66, %54
%68 = load i32, i32* %7
%69 = icmp eq i32 %68, 16
br i1 %69, label %70, label %82
70: ; preds = %67
%71 = load i8*, i8** %12
%72 = getelementptr inbounds i8, i8* %71, i64 0
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
%75 = icmp eq i32 %74, 48
br i1 %75, label %76, label %82
76: ; preds = %70
%77 = load i8*, i8** %12
%78 = getelementptr inbounds i8, i8* %77, i64 1
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %80, 88
br i1 %81, label %88, label %82
82: ; preds = %76, %70, %67
%83 = load i8*, i8** %12
%84 = getelementptr inbounds i8, i8* %83, i64 1
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = icmp eq i32 %86, 120
br i1 %87, label %88, label %91
88: ; preds = %82, %76
%89 = load i8*, i8** %12
%90 = getelementptr inbounds i8, i8* %89, i64 2
store i8* %90, i8** %12
br label %91
91: ; preds = %88, %82
%92 = load i32, i32* %7
%93 = icmp eq i32 %92, 0
br i1 %93, label %94, label %118
94: ; preds = %91
%95 = load i8*, i8** %12
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 48
br i1 %98, label %99, label %116
99: ; preds = %94
%100 = load i8*, i8** %12
%101 = getelementptr inbounds i8, i8* %100, i64 1
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp eq i32 %103, 88
br i1 %104, label %111, label %105
105: ; preds = %99
%106 = load i8*, i8** %12
%107 = getelementptr inbounds i8, i8* %106, i64 1
%108 = load i8, i8* %107
%109 = sext i8 %108 to i32
%110 = icmp eq i32 %109, 120
br i1 %110, label %111, label %114
111: ; preds = %105, %99
%112 = load i8*, i8** %12
%113 = getelementptr inbounds i8, i8* %112, i64 2
store i8* %113, i8** %12
store i32 16, i32* %7
br label %115
114: ; preds = %105
store i32 8, i32* %7
br label %115
115: ; preds = %114, %111
br label %117
116: ; preds = %94
store i32 10, i32* %7
br label %117
117: ; preds = %116, %115
br label %118
118: ; preds = %117, %91
%119 = load i8*, i8** %12
store i8* %119, i8** %14
store i8* null, i8** %15
%120 = load i32, i32* %7
%121 = udiv i32 2147483647, %120
store i32 %121, i32* %9
%122 = load i32, i32* %7
%123 = urem i32 2147483647, %122
store i32 %123, i32* %10
store i32 0, i32* %16
store i32 0, i32* %11
%124 = load i8*, i8** %12
%125 = load i8, i8* %124
store i8 %125, i8* %13
br label %126
126: ; preds = %208, %118
%127 = load i8, i8* %13
%128 = zext i8 %127 to i32
%129 = icmp ne i32 %128, 0
br i1 %129, label %130, label %212
130: ; preds = %126
%131 = load i8*, i8** %12
%132 = load i8*, i8** %15
%133 = icmp eq i8* %131, %132
br i1 %133, label %134, label %135
134: ; preds = %130
br label %212
135: ; preds = %130
%136 = load i8, i8* %13
%137 = zext i8 %136 to i32
%138 = icmp sge i32 %137, 48
br i1 %138, label %139, label %148
139: ; preds = %135
%140 = load i8, i8* %13
%141 = zext i8 %140 to i32
%142 = icmp sle i32 %141, 57
br i1 %142, label %143, label %148
143: ; preds = %139
%144 = load i8, i8* %13
%145 = zext i8 %144 to i32
%146 = sub nsw i32 %145, 48
%147 = trunc i32 %146 to i8
store i8 %147, i8* %13
br label %179
148: ; preds = %139, %135
%149 = load i8, i8* %13
%150 = zext i8 %149 to i32
%151 = icmp sge i32 %150, 65
br i1 %151, label %152, label %162
152: ; preds = %148
%153 = load i8, i8* %13
%154 = zext i8 %153 to i32
%155 = icmp sle i32 %154, 90
br i1 %155, label %156, label %162
156: ; preds = %152
%157 = load i8, i8* %13
%158 = zext i8 %157 to i32
%159 = sub nsw i32 %158, 65
%160 = add nsw i32 %159, 10
%161 = trunc i32 %160 to i8
store i8 %161, i8* %13
br label %178
162: ; preds = %152, %148
%163 = load i8, i8* %13
%164 = zext i8 %163 to i32
%165 = icmp sge i32 %164, 97
br i1 %165, label %166, label %176
166: ; preds = %162
%167 = load i8, i8* %13
%168 = zext i8 %167 to i32
%169 = icmp sle i32 %168, 122
br i1 %169, label %170, label %176
170: ; preds = %166
%171 = load i8, i8* %13
%172 = zext i8 %171 to i32
%173 = sub nsw i32 %172, 97
%174 = add nsw i32 %173, 10
%175 = trunc i32 %174 to i8
store i8 %175, i8* %13
br label %177
176: ; preds = %166, %162
br label %212
177: ; preds = %170
br label %178
178: ; preds = %177, %156
br label %179
179: ; preds = %178, %143
%180 = load i8, i8* %13
%181 = zext i8 %180 to i32
%182 = load i32, i32* %7
%183 = icmp sge i32 %181, %182
br i1 %183, label %184, label %185
184: ; preds = %179
br label %212
185: ; preds = %179
%186 = load i32, i32* %11
%187 = load i32, i32* %9
%188 = icmp ugt i32 %186, %187
br i1 %188, label %198, label %189
189: ; preds = %185
%190 = load i32, i32* %11
%191 = load i32, i32* %9
%192 = icmp eq i32 %190, %191
br i1 %192, label %193, label %199
193: ; preds = %189
%194 = load i8, i8* %13
%195 = zext i8 %194 to i32
%196 = load i32, i32* %10
%197 = icmp ugt i32 %195, %196
br i1 %197, label %198, label %199
198: ; preds = %193, %185
store i32 1, i32* %16
br label %207
199: ; preds = %193, %189
%200 = load i32, i32* %7
%201 = load i32, i32* %11
%202 = mul i32 %201, %200
store i32 %202, i32* %11
%203 = load i8, i8* %13
%204 = zext i8 %203 to i32
%205 = load i32, i32* %11
%206 = add i32 %205, %204
store i32 %206, i32* %11
br label %207
207: ; preds = %199, %198
br label %208
208: ; preds = %207
%209 = load i8*, i8** %12
%210 = getelementptr inbounds i8, i8* %209, i32 1
store i8* %210, i8** %12
%211 = load i8, i8* %210
store i8 %211, i8* %13
br label %126
212: ; preds = %184, %176, %134, %126
%213 = load i8*, i8** %12
%214 = load i8*, i8** %14
%215 = icmp eq i8* %213, %214
br i1 %215, label %216, label %217
216: ; preds = %212
br label %241
217: ; preds = %212
%218 = load i8**, i8*** %6
%219 = icmp ne i8** %218, null
br i1 %219, label %220, label %223
220: ; preds = %217
%221 = load i8*, i8** %12
%222 = load i8**, i8*** %6
store i8* %221, i8** %222
br label %223
223: ; preds = %220, %217
%224 = load i32, i32* %16
%225 = icmp ne i32 %224, 0
br i1 %225, label %226, label %231
226: ; preds = %223
%227 = load i32, i32* %8
%228 = icmp ne i32 %227, 0
%229 = zext i1 %228 to i64
%230 = select i1 %228, i32 -2147483648, i32 2147483647
store i32 %230, i32* %4
br label %273
231: ; preds = %223
%232 = load i32, i32* %8
%233 = icmp ne i32 %232, 0
br i1 %233, label %234, label %237
234: ; preds = %231
%235 = load i32, i32* %11
%236 = sub i32 0, %235
br label %239
237: ; preds = %231
%238 = load i32, i32* %11
br label %239
239: ; preds = %237, %234
%240 = phi i32 [ %236, %234 ], [ %238, %237 ]
store i32 %240, i32* %4
br label %273
241: ; preds = %216, %48
%242 = load i8**, i8*** %6
%243 = icmp ne i8** %242, null
br i1 %243, label %244, label %272
244: ; preds = %241
%245 = load i8*, i8** %14
%246 = load i8*, i8** %5
%247 = ptrtoint i8* %245 to i64
%248 = ptrtoint i8* %246 to i64
%249 = sub i64 %247, %248
%250 = icmp sge i64 %249, 2
br i1 %250, label %251, label %268
251: ; preds = %244
%252 = load i8*, i8** %14
%253 = getelementptr inbounds i8, i8* %252, i64 -1
%254 = load i8, i8* %253
%255 = sext i8 %254 to i32
%256 = call i32 (i32, ...) bitcast (i32 (...)* @__tolower to i32 (i32, ...)*)(i32 %255)
%257 = icmp eq i32 %256, 120
br i1 %257, label %258, label %268
258: ; preds = %251
%259 = load i8*, i8** %14
%260 = getelementptr inbounds i8, i8* %259, i64 -2
%261 = load i8, i8* %260
%262 = sext i8 %261 to i32
%263 = icmp eq i32 %262, 48
br i1 %263, label %264, label %268
264: ; preds = %258
%265 = load i8*, i8** %14
%266 = getelementptr inbounds i8, i8* %265, i64 -1
%267 = load i8**, i8*** %6
store i8* %266, i8** %267
br label %271
268: ; preds = %258, %251, %244
%269 = load i8*, i8** %5
%270 = load i8**, i8*** %6
store i8* %269, i8** %270
br label %271
271: ; preds = %268, %264
br label %272
272: ; preds = %271, %241
store i32 0, i32* %4
br label %273
273: ; preds = %272, %239, %226
%274 = load i32, i32* %4
ret i32 %274
}

LLVM IR (-O2):
define i32 @strtol(i8* %0, i8** writeonly %1, i32 %2) {
%4 = icmp eq i32 %2, 1
%5 = icmp ugt i32 %2, 36
%6 = or i1 %5, %4
br label %7
7: ; preds = %7, %3
%8 = phi i8* [ %0, %3 ], [ %12, %7 ]
%9 = load i8, i8* %8
%10 = add i8 %9, -33
%11 = icmp ult i8 %10, -32
%12 = getelementptr inbounds i8, i8* %8, i64 1
br i1 %11, label %13, label %7
13: ; preds = %7
%14 = select i1 %6, i32 10, i32 %2
switch i8 %9, label %17 [
i8 0, label %113
i8 45, label %15
i8 43, label %16
]
15: ; preds = %13
br label %17
16: ; preds = %13
br label %17
17: ; preds = %13, %16, %15
%18 = phi i1 [ true, %16 ], [ false, %15 ], [ true, %13 ]
%19 = phi i8* [ %12, %16 ], [ %12, %15 ], [ %8, %13 ]
%20 = icmp eq i32 %14, 16
br i1 %20, label %21, label %28
21: ; preds = %17
%22 = load i8, i8* %19
%23 = icmp eq i8 %22, 48
br i1 %23, label %24, label %28
24: ; preds = %21
%25 = getelementptr inbounds i8, i8* %19, i64 1
%26 = load i8, i8* %25
%27 = icmp eq i8 %26, 88
br i1 %27, label %32, label %28
28: ; preds = %24, %21, %17
%29 = getelementptr inbounds i8, i8* %19, i64 1
%30 = load i8, i8* %29
%31 = icmp eq i8 %30, 120
br i1 %31, label %32, label %34
32: ; preds = %28, %24
%33 = getelementptr inbounds i8, i8* %19, i64 2
br label %34
34: ; preds = %32, %28
%35 = phi i8* [ %33, %32 ], [ %19, %28 ]
%36 = icmp eq i32 %14, 0
br i1 %36, label %37, label %45
37: ; preds = %34
%38 = load i8, i8* %35
%39 = icmp eq i8 %38, 48
br i1 %39, label %40, label %49
40: ; preds = %37
%41 = getelementptr inbounds i8, i8* %35, i64 1
%42 = load i8, i8* %41
switch i8 %42, label %56 [
i8 88, label %43
i8 120, label %43
]
43: ; preds = %40, %40
%44 = getelementptr inbounds i8, i8* %35, i64 2
br label %45
45: ; preds = %34, %43
%46 = phi i32 [ %14, %34 ], [ 16, %43 ]
%47 = phi i8* [ %35, %34 ], [ %44, %43 ]
%48 = load i8, i8* %47
br label %49
49: ; preds = %45, %37
%50 = phi i8 [ %48, %45 ], [ %38, %37 ]
%51 = phi i32 [ %46, %45 ], [ 10, %37 ]
%52 = phi i8* [ %47, %45 ], [ %35, %37 ]
%53 = udiv i32 2147483647, %51
%54 = urem i32 2147483647, %51
%55 = icmp eq i8 %50, 0
br i1 %55, label %113, label %56
56: ; preds = %40, %49
%57 = phi i32 [ %54, %49 ], [ 7, %40 ]
%58 = phi i32 [ %53, %49 ], [ 268435455, %40 ]
%59 = phi i8* [ %52, %49 ], [ %35, %40 ]
%60 = phi i32 [ %51, %49 ], [ 8, %40 ]
%61 = phi i8 [ %50, %49 ], [ 48, %40 ]
br label %62
62: ; preds = %56, %92
%63 = phi i8 [ %96, %92 ], [ %61, %56 ]
%64 = phi i32 [ %94, %92 ], [ 0, %56 ]
%65 = phi i8* [ %95, %92 ], [ %59, %56 ]
%66 = phi i32 [ %93, %92 ], [ 0, %56 ]
%67 = add i8 %63, -48
%68 = icmp ult i8 %67, 10
br i1 %68, label %79, label %69
69: ; preds = %62
%70 = add i8 %63, -65
%71 = icmp ult i8 %70, 26
br i1 %71, label %72, label %74
72: ; preds = %69
%73 = add nsw i8 %63, -55
br label %79
74: ; preds = %69
%75 = add i8 %63, -97
%76 = icmp ult i8 %75, 26
br i1 %76, label %77, label %98
77: ; preds = %74
%78 = add nsw i8 %63, -87
br label %79
79: ; preds = %62, %72, %77
%80 = phi i8 [ %73, %72 ], [ %78, %77 ], [ %67, %62 ]
%81 = zext i8 %80 to i32
%82 = icmp sgt i32 %60, %81
br i1 %82, label %83, label %98
83: ; preds = %79
%84 = icmp ugt i32 %66, %58
br i1 %84, label %92, label %85
85: ; preds = %83
%86 = icmp eq i32 %66, %58
%87 = icmp ult i32 %57, %81
%88 = select i1 %86, i1 %87, i1 false
br i1 %88, label %92, label %89
89: ; preds = %85
%90 = mul i32 %66, %60
%91 = add i32 %90, %81
br label %92
92: ; preds = %83, %85, %89
%93 = phi i32 [ %91, %89 ], [ %58, %85 ], [ %66, %83 ]
%94 = phi i32 [ %64, %89 ], [ 1, %85 ], [ 1, %83 ]
%95 = getelementptr inbounds i8, i8* %65, i64 1
%96 = load i8, i8* %95
%97 = icmp eq i8 %96, 0
br i1 %97, label %98, label %62
98: ; preds = %92, %74, %79
%99 = phi i32 [ %93, %92 ], [ %66, %74 ], [ %66, %79 ]
%100 = phi i8* [ %95, %92 ], [ %65, %74 ], [ %65, %79 ]
%101 = phi i32 [ %94, %92 ], [ %64, %74 ], [ %64, %79 ]
%102 = icmp eq i8* %100, %59
br i1 %102, label %113, label %103
103: ; preds = %98
%104 = icmp eq i8** %1, null
br i1 %104, label %106, label %105
105: ; preds = %103
store i8* %100, i8** %1
br label %106
106: ; preds = %105, %103
%107 = icmp eq i32 %101, 0
br i1 %107, label %110, label %108
108: ; preds = %106
%109 = select i1 %18, i32 2147483647, i32 -2147483648
br label %133
110: ; preds = %106
%111 = sub i32 0, %99
%112 = select i1 %18, i32 %99, i32 %111
br label %133
113: ; preds = %49, %13, %98
%114 = phi i8* [ %0, %13 ], [ %59, %98 ], [ %52, %49 ]
%115 = icmp eq i8** %1, null
br i1 %115, label %133, label %116
116: ; preds = %113
%117 = ptrtoint i8* %114 to i64
%118 = ptrtoint i8* %0 to i64
%119 = sub i64 %117, %118
%120 = icmp sgt i64 %119, 1
br i1 %120, label %121, label %132
121: ; preds = %116
%122 = getelementptr inbounds i8, i8* %114, i64 -1
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = tail call i32 (i32, ...) bitcast (i32 (...)* @__tolower to i32 (i32, ...)*)(i32 %124)
%126 = icmp eq i32 %125, 120
br i1 %126, label %127, label %132
127: ; preds = %121
%128 = getelementptr inbounds i8, i8* %114, i64 -2
%129 = load i8, i8* %128
%130 = icmp eq i8 %129, 48
br i1 %130, label %131, label %132
131: ; preds = %127
store i8* %122, i8** %1
br label %133
132: ; preds = %127, %121, %116
store i8* %0, i8** %1
br label %133
133: ; preds = %113, %132, %131, %110, %108
%134 = phi i32 [ %109, %108 ], [ %112, %110 ], [ 0, %131 ], [ 0, %132 ], [ 0, %113 ]
ret i32 %134
}