long strtol(const char *s, char **end, int base) {
  int i;
  unsigned long ch, value = 0, neg = 0;
  if (s[0] == '-') {
    neg = 1;
    ++s;
  }
  if (s[0] == '0' && s[1] == 'x') {
    base = 16;
    s += 2;
  }
  for (i = 0; i <= 8; ++i) {
    ch = *s++;
    if ('0' <= ch && ch <= '9')
      ch -= '0';
    else if ('A' <= ch && ch <= 'Z')
      ch = ch - 'A' + 10;
    else if ('a' <= ch && ch <= 'z')
      ch = ch - 'a' + 10;
    else
      break;
    value = value * base + ch;
  }
  if (end)
    *end = (char *)s - 1;
  if (neg)
    value = -(int)value;
  return value;
}


x86 assembly (clang, -O0):
<strtol>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1143 <strtol+0x43>
movq   $0x1,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1177 <strtol+0x77>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
jne    1177 <strtol+0x77>
movl   $0x10,-0x14(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x8,-0x18(%rbp)
jg     1259 <strtol+0x159>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbq (%rax),%rax
mov    %rax,-0x20(%rbp)
mov    $0x30,%eax
cmp    -0x20(%rbp),%rax
ja     11ca <strtol+0xca>
cmpq   $0x39,-0x20(%rbp)
ja     11ca <strtol+0xca>
mov    -0x20(%rbp),%rax
sub    $0x30,%rax
mov    %rax,-0x20(%rbp)
jmp    1237 <strtol+0x137>
mov    $0x41,%eax
cmp    -0x20(%rbp),%rax
ja     11f9 <strtol+0xf9>
cmpq   $0x5a,-0x20(%rbp)
ja     11f9 <strtol+0xf9>
mov    -0x20(%rbp),%rax
sub    $0x41,%rax
add    $0xa,%rax
mov    %rax,-0x20(%rbp)
jmp    1232 <strtol+0x132>
mov    $0x61,%eax
cmp    -0x20(%rbp),%rax
ja     1228 <strtol+0x128>
cmpq   $0x7a,-0x20(%rbp)
ja     1228 <strtol+0x128>
mov    -0x20(%rbp),%rax
sub    $0x61,%rax
add    $0xa,%rax
mov    %rax,-0x20(%rbp)
jmp    122d <strtol+0x12d>
jmp    1259 <strtol+0x159>
jmp    1232 <strtol+0x132>
jmp    1237 <strtol+0x137>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rcx,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    117e <strtol+0x7e>
cmpq   $0x0,-0x10(%rbp)
je     1273 <strtol+0x173>
mov    -0x8(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
cmpq   $0x0,-0x30(%rbp)
je     128e <strtol+0x18e>
mov    -0x28(%rbp),%rax
mov    %eax,%ecx
xor    %eax,%eax
sub    %ecx,%eax
cltq
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtol>:
push   %rbx
mov    (%rdi),%r8b
xor    %eax,%eax
cmp    $0x2d,%r8b
sete   %al
lea    (%rdi,%rax,1),%r10
mov    (%rdi,%rax,1),%dil
cmp    $0x30,%dil
jne    1135 <strtol+0x35>
xor    %eax,%eax
cmpb   $0x78,0x1(%r10)
sete   %al
mov    (%r10,%rax,2),%dil
lea    (%r10,%rax,2),%r10
mov    $0x10,%eax
cmove  %eax,%edx
lea    -0x30(%rdi),%ecx
mov    $0xffffffffffffffd0,%r9
mov    $0xffffffffffffffd0,%rax
cmp    $0xa,%cl
jb     116d <strtol+0x6d>
lea    -0x41(%rdi),%ecx
mov    $0xffffffffffffffc9,%rax
cmp    $0x1a,%cl
jb     116d <strtol+0x6d>
lea    -0x61(%rdi),%ecx
mov    $0xffffffffffffffa9,%rax
cmp    $0x19,%cl
ja     137a <strtol+0x27a>
movsbq %dil,%rdi
add    %rax,%rdi
movsbq 0x1(%r10),%rax
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     11a3 <strtol+0xa3>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%r9
cmp    $0x1a,%cl
jb     11a3 <strtol+0xa3>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%r9
cmp    $0x19,%cl
ja     1383 <strtol+0x283>
movslq %edx,%r11
add    %rax,%r9
imul   %r11,%rdi
add    %r9,%rdi
movsbq 0x2(%r10),%rax
lea    -0x30(%rax),%ecx
mov    $0xffffffffffffffd0,%r9
mov    $0xffffffffffffffd0,%rdx
cmp    $0xa,%cl
jb     11ed <strtol+0xed>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%rdx
cmp    $0x1a,%cl
jb     11ed <strtol+0xed>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%rdx
cmp    $0x19,%cl
ja     138e <strtol+0x28e>
add    %rax,%rdx
imul   %r11,%rdi
add    %rdx,%rdi
movsbq 0x3(%r10),%rax
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     1226 <strtol+0x126>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%r9
cmp    $0x1a,%cl
jb     1226 <strtol+0x126>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%r9
cmp    $0x19,%cl
ja     1399 <strtol+0x299>
add    %rax,%r9
imul   %r11,%rdi
add    %r9,%rdi
movsbq 0x4(%r10),%rax
lea    -0x30(%rax),%ecx
mov    $0xffffffffffffffd0,%r9
mov    $0xffffffffffffffd0,%rdx
cmp    $0xa,%cl
jb     126d <strtol+0x16d>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%rdx
cmp    $0x1a,%cl
jb     126d <strtol+0x16d>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%rdx
cmp    $0x19,%cl
ja     13a4 <strtol+0x2a4>
add    %rax,%rdx
imul   %r11,%rdi
add    %rdx,%rdi
movsbq 0x5(%r10),%rax
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     12a6 <strtol+0x1a6>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%r9
cmp    $0x1a,%cl
jb     12a6 <strtol+0x1a6>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%r9
cmp    $0x19,%cl
ja     13af <strtol+0x2af>
add    %rax,%r9
imul   %r11,%rdi
add    %r9,%rdi
movsbq 0x6(%r10),%rax
lea    -0x30(%rax),%ecx
mov    $0xffffffffffffffd0,%rbx
mov    $0xffffffffffffffd0,%rdx
cmp    $0xa,%cl
jb     12ed <strtol+0x1ed>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%rdx
cmp    $0x1a,%cl
jb     12ed <strtol+0x1ed>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%rdx
cmp    $0x19,%cl
ja     13ba <strtol+0x2ba>
add    %rax,%rdx
imul   %r11,%rdi
add    %rdx,%rdi
movsbq 0x7(%r10),%rax
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     1326 <strtol+0x226>
lea    -0x41(%rax),%ecx
mov    $0xffffffffffffffc9,%rbx
cmp    $0x1a,%cl
jb     1326 <strtol+0x226>
lea    -0x61(%rax),%ecx
mov    $0xffffffffffffffa9,%rbx
cmp    $0x19,%cl
ja     13c5 <strtol+0x2c5>
lea    0x8(%r10),%r9
add    %rax,%rbx
imul   %r11,%rdi
add    %rbx,%rdi
movsbq (%r9),%rcx
lea    -0x30(%rcx),%edx
mov    $0xffffffffffffffd0,%rax
cmp    $0xa,%dl
jb     1365 <strtol+0x265>
lea    -0x41(%rcx),%edx
mov    $0xffffffffffffffc9,%rax
cmp    $0x1a,%dl
jb     1365 <strtol+0x265>
lea    -0x61(%rcx),%edx
mov    $0xffffffffffffffa9,%rax
cmp    $0x19,%dl
ja     13d0 <strtol+0x2d0>
add    $0x8,%r10
add    %rcx,%rax
imul   %r11,%rdi
add    %rax,%rdi
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
xor    %edi,%edi
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x1,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x2,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x3,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x4,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x5,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x6,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
add    $0x7,%r10
test   %rsi,%rsi
jne    13d8 <strtol+0x2d8>
jmp    13db <strtol+0x2db>
mov    %r9,%r10
test   %rsi,%rsi
je     13db <strtol+0x2db>
mov    %r10,(%rsi)
mov    %rdi,%rax
shl    $0x20,%rax
neg    %rax
sar    $0x20,%rax
cmp    $0x2d,%r8b
cmovne %rdi,%rax
pop    %rbx
ret

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

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