#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 */
char tolower(char const);
int strtol(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    1253 <strtol+0x143>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1253 <strtol+0x143>
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    1511 <strtol+0x401>
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    1511 <strtol+0x401>
cmpq   $0x0,-0x18(%rbp)
je     150a <strtol+0x3fa>
mov    -0x48(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x2,%rax
jl     14fa <strtol+0x3ea>
mov    -0x48(%rbp),%rax
movsbl -0x1(%rax),%edi
call   1030 <tolower@plt>
movsbl %al,%eax
cmp    $0x78,%eax
jne    14fa <strtol+0x3ea>
mov    -0x48(%rbp),%rax
movsbl -0x2(%rax),%eax
cmp    $0x30,%eax
jne    14fa <strtol+0x3ea>
mov    -0x48(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    1505 <strtol+0x3f5>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    150a <strtol+0x3fa>
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     11aa <strtol+0x9a>
cmp    $0x2b,%cl
je     1174 <strtol+0x64>
mov    %r15,%r12
test   %cl,%cl
je     1288 <strtol+0x178>
add    $0xffffffffffffffff,%rax
mov    $0x1,%r8b
test   %r9d,%r9d
je     11b2 <strtol+0xa2>
cmp    $0x10,%r9d
jne    11da <strtol+0xca>
mov    (%rax),%dil
mov    $0x10,%r9d
cmp    $0x30,%dil
jne    11dd <strtol+0xcd>
mov    0x1(%rax),%cl
or     $0x20,%cl
cmp    $0x78,%cl
je     11d0 <strtol+0xc0>
mov    $0x30,%dil
mov    $0x10,%r9d
mov    %rax,%r12
jmp    11e9 <strtol+0xd9>
xor    %r8d,%r8d
test   %r9d,%r9d
jne    117c <strtol+0x6c>
mov    (%rax),%dil
mov    $0xa,%r9d
cmp    $0x30,%dil
jne    11dd <strtol+0xcd>
mov    0x1(%rax),%cl
or     $0x20,%cl
cmp    $0x78,%cl
jne    12d7 <strtol+0x1c7>
add    $0x2,%rax
mov    $0x10,%r9d
mov    (%rax),%dil
mov    %rax,%r12
test   %dil,%dil
je     1288 <strtol+0x178>
mov    $0x7fffffff,%eax
xor    %edx,%edx
div    %r9d
xor    %ebp,%ebp
mov    %r12,%rbx
xor    %esi,%esi
jmp    1215 <strtol+0x105>
nopl   0x0(%rax)
mov    %esi,%r10d
movzbl 0x1(%rbx),%edi
add    $0x1,%rbx
mov    %ecx,%ebp
mov    %r10d,%esi
test   %dil,%dil
je     126a <strtol+0x15a>
lea    -0x30(%rdi),%ecx
cmp    $0xa,%cl
jb     123e <strtol+0x12e>
lea    -0x41(%rdi),%ecx
cmp    $0x19,%cl
ja     1230 <strtol+0x120>
add    $0xc9,%dil
jmp    123c <strtol+0x12c>
nopl   0x0(%rax,%rax,1)
lea    -0x61(%rdi),%ecx
cmp    $0x19,%cl
ja     1265 <strtol+0x155>
add    $0xa9,%dil
mov    %edi,%ecx
movzbl %cl,%edi
cmp    %edi,%r9d
jle    1265 <strtol+0x155>
mov    $0x1,%ecx
cmp    %eax,%esi
ja     1200 <strtol+0xf0>
jne    1258 <strtol+0x148>
mov    %eax,%r10d
cmp    %edi,%edx
jb     1203 <strtol+0xf3>
imul   %r9d,%esi
add    %edi,%esi
mov    %esi,%r10d
mov    %ebp,%ecx
jmp    1203 <strtol+0xf3>
mov    %esi,%r10d
mov    %ebp,%ecx
cmp    %r12,%rbx
je     1288 <strtol+0x178>
test   %r14,%r14
je     1277 <strtol+0x167>
mov    %rbx,(%r14)
test   %ecx,%ecx
je     12c0 <strtol+0x1b0>
movzbl %r8b,%eax
mov    $0x80000000,%ebp
sub    %eax,%ebp
jmp    12cc <strtol+0x1bc>
xor    %ebp,%ebp
test   %r14,%r14
je     12cc <strtol+0x1bc>
mov    %r12,%rax
sub    %r15,%rax
cmp    $0x2,%rax
jl     12bb <strtol+0x1ab>
movsbl -0x1(%r12),%edi
call   1030 <tolower@plt>
cmp    $0x78,%al
jne    12bb <strtol+0x1ab>
cmpb   $0x30,-0x2(%r12)
jne    12bb <strtol+0x1ab>
add    $0xffffffffffffffff,%r12
mov    %r12,(%r14)
jmp    12cc <strtol+0x1bc>
mov    %r15,(%r14)
jmp    12cc <strtol+0x1bc>
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,%dil
mov    $0x8,%r9d
mov    %rax,%r12
jmp    11e9 <strtol+0xd9>

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 %91
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 %91
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
%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, %70, %67
%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 = call signext i8 @tolower(i8 signext %254)
%256 = sext i8 %255 to i32
%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 %102
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 ]
switch i32 %14, label %36 [
i32 16, label %20
i32 0, label %28
]
20: ; preds = %17
%21 = load i8, i8* %19
%22 = icmp eq i8 %21, 48
br i1 %22, label %23, label %40
23: ; preds = %20
%24 = getelementptr inbounds i8, i8* %19, i64 1
%25 = load i8, i8* %24
switch i8 %25, label %45 [
i8 88, label %26
i8 120, label %26
]
26: ; preds = %23, %23
%27 = getelementptr inbounds i8, i8* %19, i64 2
br label %36
28: ; preds = %17
%29 = load i8, i8* %19
%30 = icmp eq i8 %29, 48
br i1 %30, label %31, label %40
31: ; preds = %28
%32 = getelementptr inbounds i8, i8* %19, i64 1
%33 = load i8, i8* %32
switch i8 %33, label %45 [
i8 88, label %34
i8 120, label %34
]
34: ; preds = %31, %31
%35 = getelementptr inbounds i8, i8* %19, i64 2
br label %36
36: ; preds = %34, %26, %17
%37 = phi i32 [ %14, %17 ], [ 16, %26 ], [ 16, %34 ]
%38 = phi i8* [ %19, %17 ], [ %27, %26 ], [ %35, %34 ]
%39 = load i8, i8* %38
br label %40
40: ; preds = %36, %20, %28
%41 = phi i8 [ %39, %36 ], [ %21, %20 ], [ %29, %28 ]
%42 = phi i32 [ %37, %36 ], [ 16, %20 ], [ 10, %28 ]
%43 = phi i8* [ %38, %36 ], [ %19, %20 ], [ %19, %28 ]
%44 = icmp eq i8 %41, 0
br i1 %44, label %102, label %45
45: ; preds = %31, %23, %40
%46 = phi i8* [ %43, %40 ], [ %19, %23 ], [ %19, %31 ]
%47 = phi i32 [ %42, %40 ], [ 16, %23 ], [ 8, %31 ]
%48 = phi i8 [ %41, %40 ], [ 48, %23 ], [ 48, %31 ]
%49 = udiv i32 2147483647, %47
%50 = urem i32 2147483647, %47
br label %51
51: ; preds = %45, %81
%52 = phi i8 [ %85, %81 ], [ %48, %45 ]
%53 = phi i32 [ %83, %81 ], [ 0, %45 ]
%54 = phi i8* [ %84, %81 ], [ %46, %45 ]
%55 = phi i32 [ %82, %81 ], [ 0, %45 ]
%56 = add i8 %52, -48
%57 = icmp ult i8 %56, 10
br i1 %57, label %68, label %58
58: ; preds = %51
%59 = add i8 %52, -65
%60 = icmp ult i8 %59, 26
br i1 %60, label %61, label %63
61: ; preds = %58
%62 = add nsw i8 %52, -55
br label %68
63: ; preds = %58
%64 = add i8 %52, -97
%65 = icmp ult i8 %64, 26
br i1 %65, label %66, label %87
66: ; preds = %63
%67 = add nsw i8 %52, -87
br label %68
68: ; preds = %51, %61, %66
%69 = phi i8 [ %62, %61 ], [ %67, %66 ], [ %56, %51 ]
%70 = zext i8 %69 to i32
%71 = icmp sgt i32 %47, %70
br i1 %71, label %72, label %87
72: ; preds = %68
%73 = icmp ugt i32 %55, %49
br i1 %73, label %81, label %74
74: ; preds = %72
%75 = icmp eq i32 %55, %49
%76 = icmp ult i32 %50, %70
%77 = select i1 %75, i1 %76, i1 false
br i1 %77, label %81, label %78
78: ; preds = %74
%79 = mul i32 %55, %47
%80 = add i32 %79, %70
br label %81
81: ; preds = %72, %74, %78
%82 = phi i32 [ %80, %78 ], [ %49, %74 ], [ %55, %72 ]
%83 = phi i32 [ %53, %78 ], [ 1, %74 ], [ 1, %72 ]
%84 = getelementptr inbounds i8, i8* %54, i64 1
%85 = load i8, i8* %84
%86 = icmp eq i8 %85, 0
br i1 %86, label %87, label %51
87: ; preds = %81, %63, %68
%88 = phi i32 [ %82, %81 ], [ %55, %63 ], [ %55, %68 ]
%89 = phi i8* [ %84, %81 ], [ %54, %63 ], [ %54, %68 ]
%90 = phi i32 [ %83, %81 ], [ %53, %63 ], [ %53, %68 ]
%91 = icmp eq i8* %89, %46
br i1 %91, label %102, label %92
92: ; preds = %87
%93 = icmp eq i8** %1, null
br i1 %93, label %95, label %94
94: ; preds = %92
store i8* %89, i8** %1
br label %95
95: ; preds = %94, %92
%96 = icmp eq i32 %90, 0
br i1 %96, label %99, label %97
97: ; preds = %95
%98 = select i1 %18, i32 2147483647, i32 -2147483648
br label %121
99: ; preds = %95
%100 = sub i32 0, %88
%101 = select i1 %18, i32 %88, i32 %100
br label %121
102: ; preds = %40, %13, %87
%103 = phi i8* [ %0, %13 ], [ %46, %87 ], [ %43, %40 ]
%104 = icmp eq i8** %1, null
br i1 %104, label %121, label %105
105: ; preds = %102
%106 = ptrtoint i8* %103 to i64
%107 = ptrtoint i8* %0 to i64
%108 = sub i64 %106, %107
%109 = icmp sgt i64 %108, 1
br i1 %109, label %110, label %120
110: ; preds = %105
%111 = getelementptr inbounds i8, i8* %103, i64 -1
%112 = load i8, i8* %111
%113 = tail call signext i8 @tolower(i8 signext %112)
%114 = icmp eq i8 %113, 120
br i1 %114, label %115, label %120
115: ; preds = %110
%116 = getelementptr inbounds i8, i8* %103, i64 -2
%117 = load i8, i8* %116
%118 = icmp eq i8 %117, 48
br i1 %118, label %119, label %120
119: ; preds = %115
store i8* %111, i8** %1
br label %121
120: ; preds = %115, %110, %105
store i8* %0, i8** %1
br label %121
121: ; preds = %102, %120, %119, %99, %97
%122 = phi i32 [ %98, %97 ], [ %101, %99 ], [ 0, %119 ], [ 0, %120 ], [ 0, %102 ]
ret i32 %122
}