#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 */
int multiply_convert_str_to_int(int *value_out, const char *str,
                                const size_t len) {
  int sign = 0;
  int value = 0;
  int base = 10;
  int digit = 0;
  const char *str_p = str, *str_endp = str + len;
  char ch;
  static const int base_shift[17] = {
      0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,
  };
  if ((len >= 1) && (*str_p == '-')) {
    sign = 1;
    str_p++;
  }
  if (len >= 2) {
    if (*str_p == '0' && (*(str_p + 1) == 'x' || *(str_p + 1) == 'X')) {
      base = 16;
      str_p += 2;
    } else if (*str_p == '0' && (*(str_p + 1) == 'b' || *(str_p + 1) == 'B')) {
      base = 2;
      str_p += 2;
    } else if (*str_p == '0') {
      base = 8;
      str_p += 1;
    } else {
      base = 10;
    }
  } else if (len >= 1) {
    if (*str_p == '0') {
      base = 8;
      str_p += 1;
    } else {
      base = 10;
    }
  } else {
    return -1;
  }
  while (str_p != str_endp) {
    ch = *str_p;
    switch (base) {
    case 2:
    case 8:
      if (ch < '0' && ch >= base) {
        return -1;
      } else {
        value = (value << base_shift[base]) | (ch - (int)('0'));
      }
      break;
    case 10:
      if (ch < '0' && ch >= base) {
        return -1;
      } else {
        value = (value * 10) + (ch - (int)('0'));
      }
      break;
    case 16:
      if (ch >= '0' && ch <= '9') {
        digit = ch - (int)('0');
      } else if (ch >= 'a' && ch <= 'f') {
        digit = ch - (int)('a') + 10;
      } else if (ch >= 'A' && ch <= 'F') {
        digit = ch - (int)('A') + 10;
      } else {
        return -1;
      }
      value = value << base_shift[base] | digit;
      break;
    default:
      break;
    }
    str_p++;
  }
  if (sign != 0)
    value = -value;
  *value_out = value;
  return 0;
}


x86 assembly (clang, -O0):
<multiply_convert_str_to_int>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0xa,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x1,-0x20(%rbp)
jb     116e <multiply_convert_str_to_int+0x6e>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    116e <multiply_convert_str_to_int+0x6e>
movl   $0x1,-0x24(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x2,-0x20(%rbp)
jb     124b <multiply_convert_str_to_int+0x14b>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    11c3 <multiply_convert_str_to_int+0xc3>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
je     11ab <multiply_convert_str_to_int+0xab>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    11c3 <multiply_convert_str_to_int+0xc3>
movl   $0x10,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    1246 <multiply_convert_str_to_int+0x146>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    120d <multiply_convert_str_to_int+0x10d>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x62,%eax
je     11f5 <multiply_convert_str_to_int+0xf5>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x42,%eax
jne    120d <multiply_convert_str_to_int+0x10d>
movl   $0x2,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    1241 <multiply_convert_str_to_int+0x141>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1235 <multiply_convert_str_to_int+0x135>
movl   $0x8,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    123c <multiply_convert_str_to_int+0x13c>
movl   $0xa,-0x2c(%rbp)
jmp    1241 <multiply_convert_str_to_int+0x141>
jmp    1246 <multiply_convert_str_to_int+0x146>
jmp    129b <multiply_convert_str_to_int+0x19b>
cmpq   $0x1,-0x20(%rbp)
jb     128a <multiply_convert_str_to_int+0x18a>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    127e <multiply_convert_str_to_int+0x17e>
movl   $0x8,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1285 <multiply_convert_str_to_int+0x185>
movl   $0xa,-0x2c(%rbp)
jmp    1296 <multiply_convert_str_to_int+0x196>
movl   $0xffffffff,-0x4(%rbp)
jmp    1452 <multiply_convert_str_to_int+0x352>
jmp    129b <multiply_convert_str_to_int+0x19b>
jmp    12a0 <multiply_convert_str_to_int+0x1a0>
mov    -0x38(%rbp),%rax
cmp    -0x40(%rbp),%rax
je     1430 <multiply_convert_str_to_int+0x330>
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x41(%rbp)
mov    -0x2c(%rbp),%eax
add    $0xfffffffe,%eax
mov    %eax,%ecx
mov    %rcx,-0x50(%rbp)
sub    $0xe,%eax
ja     141a <multiply_convert_str_to_int+0x31a>
mov    -0x50(%rbp),%rax
lea    0xd29(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsbl -0x41(%rbp),%eax
cmp    $0x30,%eax
jge    1306 <multiply_convert_str_to_int+0x206>
movsbl -0x41(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     1306 <multiply_convert_str_to_int+0x206>
movl   $0xffffffff,-0x4(%rbp)
jmp    1452 <multiply_convert_str_to_int+0x352>
mov    -0x28(%rbp),%eax
movslq -0x2c(%rbp),%rdx
lea    0xd2c(%rip),%rcx
mov    (%rcx,%rdx,4),%ecx
shl    %cl,%eax
movsbl -0x41(%rbp),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x28(%rbp)
jmp    141f <multiply_convert_str_to_int+0x31f>
movsbl -0x41(%rbp),%eax
cmp    $0x30,%eax
jge    1350 <multiply_convert_str_to_int+0x250>
movsbl -0x41(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     1350 <multiply_convert_str_to_int+0x250>
movl   $0xffffffff,-0x4(%rbp)
jmp    1452 <multiply_convert_str_to_int+0x352>
imul   $0xa,-0x28(%rbp),%eax
movsbl -0x41(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x28(%rbp)
jmp    141f <multiply_convert_str_to_int+0x31f>
movsbl -0x41(%rbp),%eax
cmp    $0x30,%eax
jl     138e <multiply_convert_str_to_int+0x28e>
movsbl -0x41(%rbp),%eax
cmp    $0x39,%eax
jg     138e <multiply_convert_str_to_int+0x28e>
movsbl -0x41(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x30(%rbp)
jmp    13fc <multiply_convert_str_to_int+0x2fc>
movsbl -0x41(%rbp),%eax
cmp    $0x61,%eax
jl     13ba <multiply_convert_str_to_int+0x2ba>
movsbl -0x41(%rbp),%eax
cmp    $0x66,%eax
jg     13ba <multiply_convert_str_to_int+0x2ba>
movsbl -0x41(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x30(%rbp)
jmp    13f7 <multiply_convert_str_to_int+0x2f7>
movsbl -0x41(%rbp),%eax
cmp    $0x41,%eax
jl     13e6 <multiply_convert_str_to_int+0x2e6>
movsbl -0x41(%rbp),%eax
cmp    $0x46,%eax
jg     13e6 <multiply_convert_str_to_int+0x2e6>
movsbl -0x41(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x30(%rbp)
jmp    13f2 <multiply_convert_str_to_int+0x2f2>
movl   $0xffffffff,-0x4(%rbp)
jmp    1452 <multiply_convert_str_to_int+0x352>
jmp    13f7 <multiply_convert_str_to_int+0x2f7>
jmp    13fc <multiply_convert_str_to_int+0x2fc>
mov    -0x28(%rbp),%eax
movslq -0x2c(%rbp),%rdx
lea    0xc36(%rip),%rcx
mov    (%rcx,%rdx,4),%ecx
shl    %cl,%eax
or     -0x30(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    141f <multiply_convert_str_to_int+0x31f>
jmp    141f <multiply_convert_str_to_int+0x31f>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    12a0 <multiply_convert_str_to_int+0x1a0>
cmpl   $0x0,-0x24(%rbp)
je     1442 <multiply_convert_str_to_int+0x342>
xor    %eax,%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<multiply_convert_str_to_int>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %rdx,%rdx
je     126d <multiply_convert_str_to_int+0x16d>
lea    (%rsi,%rdx,1),%r11
mov    (%rsi),%bl
xor    %ecx,%ecx
cmp    $0x2d,%bl
sete   %cl
lea    (%rsi,%rcx,1),%r14
mov    (%rsi,%rcx,1),%al
cmp    $0x1,%rdx
mov    %bl,-0x1(%rsp)
jne    1148 <multiply_convert_str_to_int+0x48>
xor    %r9d,%r9d
xor    %ebp,%ebp
cmp    $0x30,%al
sete   %r9b
setne  %bpl
lea    0x8(%rbp,%rbp,1),%r10d
jmp    1195 <multiply_convert_str_to_int+0x95>
mov    $0xa,%ebp
cmp    $0x30,%al
jne    1189 <multiply_convert_str_to_int+0x89>
mov    0x1(%r14),%bl
mov    $0x10,%r10d
mov    $0x2,%r9d
mov    $0x8,%ebp
cmp    $0x61,%bl
jg     1177 <multiply_convert_str_to_int+0x77>
cmp    $0x42,%bl
je     1181 <multiply_convert_str_to_int+0x81>
cmp    $0x58,%bl
je     1195 <multiply_convert_str_to_int+0x95>
jmp    1189 <multiply_convert_str_to_int+0x89>
cmp    $0x78,%bl
je     1195 <multiply_convert_str_to_int+0x95>
cmp    $0x62,%bl
jne    1189 <multiply_convert_str_to_int+0x89>
mov    $0x2,%r10d
jmp    1195 <multiply_convert_str_to_int+0x95>
xor    %r9d,%r9d
cmp    $0x30,%al
sete   %r9b
mov    %ebp,%r10d
add    %r9,%r14
xor    %eax,%eax
mov    $0x0,%ebx
cmp    %r11,%r14
je     1274 <multiply_convert_str_to_int+0x174>
lea    -0x2(%r10),%r11d
shr    %r11d
mov    %r10d,%r14d
add    %rcx,%r9
xor    %ebx,%ebx
mov    %r11d,%r15d
lea    0xe3f(%rip),%r12
lea    0xe58(%rip),%r13
jmp    11ea <multiply_convert_str_to_int+0xea>
nopw   0x0(%rax,%rax,1)
movzbl 0x0(%r13,%r14,4),%ecx
shl    %cl,%ebx
add    $0xffffffd0,%ebp
or     %ebp,%ebx
add    $0x1,%r9
cmp    %r9,%rdx
je     1274 <multiply_convert_str_to_int+0x174>
cmp    $0x7,%r11d
ja     11dd <multiply_convert_str_to_int+0xdd>
movsbl (%rsi,%r9,1),%ebp
movslq (%r12,%r15,4),%rcx
add    %r12,%rcx
jmp    *%rcx
cmp    $0x2f,%bpl
jg     11d0 <multiply_convert_str_to_int+0xd0>
cmp    %ebp,%r10d
jg     11d0 <multiply_convert_str_to_int+0xd0>
jmp    126d <multiply_convert_str_to_int+0x16d>
nopl   0x0(%rax,%rax,1)
cmp    $0x2f,%bpl
jg     121b <multiply_convert_str_to_int+0x11b>
cmp    %ebp,%r10d
jle    126d <multiply_convert_str_to_int+0x16d>
lea    (%rbx,%rbx,4),%ecx
lea    -0x30(%rbp,%rcx,2),%ebx
jmp    11dd <multiply_convert_str_to_int+0xdd>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x30(%rbp),%ecx
mov    $0xffffffd0,%r8d
cmp    $0xa,%cl
jb     125a <multiply_convert_str_to_int+0x15a>
lea    -0x61(%rbp),%ecx
mov    $0xffffffa9,%r8d
cmp    $0x6,%cl
jb     125a <multiply_convert_str_to_int+0x15a>
lea    -0x41(%rbp),%ecx
mov    $0xffffffc9,%r8d
cmp    $0x5,%cl
ja     126d <multiply_convert_str_to_int+0x16d>
add    %ebp,%r8d
movzbl 0x0(%r13,%r14,4),%ecx
shl    %cl,%ebx
or     %r8d,%ebx
jmp    11dd <multiply_convert_str_to_int+0xdd>
mov    $0xffffffff,%eax
jmp    1282 <multiply_convert_str_to_int+0x182>
mov    %ebx,%ecx
neg    %ecx
cmpb   $0x2d,-0x1(%rsp)
cmovne %ebx,%ecx
mov    %ecx,(%rdi)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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