int strtoul(const char *number, unsigned long *result) {
  unsigned long n, n_num, weight;
  *result = 0;
  if (((number[0] == '0') && (number[1] == 'x')) ||
      ((number[0] == '0') && (number[1] == 'X'))) {
    weight = 16;
    n = 2;
  } else if (((number[0] == '0') && (number[1] == 'b')) ||
             ((number[0] == '0') && (number[1] == 'B'))) {
    weight = 2;
    n = 2;
  } else {
    weight = 10;
    n = 0;
  }
  for (; n < 16; n++) {
    if ((weight == 02) && ((number[n] < '0') || (number[n] > '1')))
      break;
    if ((weight == 10) && ((number[n] < '0') || (number[n] > '9')))
      break;
    if ((weight == 16) && ((number[n] < '0') || (number[n] > '9')) &&
        ((number[n] < 'a') || (number[n] > 'f')) &&
        ((number[n] < 'A') || (number[n] > 'F')))
      break;
    *result = *result * weight;
    if (number[n] <= '9') {
      *result = *result + (number[n] - '0');
    } else if (number[n] <= 'Z') {
      *result = *result + (number[n] - 'A' + 10);
    } else {
      *result = *result + (number[n] - 'a' + 10);
    }
  }
  if (n == 0)
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<strtoul>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1138 <strtoul+0x38>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
je     1159 <strtoul+0x59>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    116e <strtoul+0x6e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    116e <strtoul+0x6e>
movq   $0x10,-0x30(%rbp)
movq   $0x2,-0x20(%rbp)
jmp    11da <strtoul+0xda>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    118f <strtoul+0x8f>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x62,%eax
je     11b0 <strtoul+0xb0>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    11c5 <strtoul+0xc5>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x42,%eax
jne    11c5 <strtoul+0xc5>
movq   $0x2,-0x30(%rbp)
movq   $0x2,-0x20(%rbp)
jmp    11d5 <strtoul+0xd5>
movq   $0xa,-0x30(%rbp)
movq   $0x0,-0x20(%rbp)
jmp    11da <strtoul+0xda>
jmp    11df <strtoul+0xdf>
cmpq   $0x10,-0x20(%rbp)
jae    13ba <strtoul+0x2ba>
cmpq   $0x2,-0x30(%rbp)
jne    1224 <strtoul+0x124>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     121f <strtoul+0x11f>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x31,%eax
jle    1224 <strtoul+0x124>
jmp    13ba <strtoul+0x2ba>
cmpq   $0xa,-0x30(%rbp)
jne    125e <strtoul+0x15e>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1259 <strtoul+0x159>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    125e <strtoul+0x15e>
jmp    13ba <strtoul+0x2ba>
cmpq   $0x10,-0x30(%rbp)
jne    12ec <strtoul+0x1ec>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1293 <strtoul+0x193>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    12ec <strtoul+0x1ec>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     12bd <strtoul+0x1bd>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    12ec <strtoul+0x1ec>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     12e7 <strtoul+0x1e7>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jle    12ec <strtoul+0x1ec>
jmp    13ba <strtoul+0x2ba>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
imul   -0x30(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     133b <strtoul+0x23b>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rdx
movsbl (%rax,%rdx,1),%eax
sub    $0x30,%eax
cltq
add    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    13a4 <strtoul+0x2a4>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jg     137a <strtoul+0x27a>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rdx
movsbl (%rax,%rdx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
cltq
add    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    139f <strtoul+0x29f>
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rdx
movsbl (%rax,%rdx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
cltq
add    %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    13a4 <strtoul+0x2a4>
jmp    13a9 <strtoul+0x2a9>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11df <strtoul+0xdf>
cmpq   $0x0,-0x20(%rbp)
jne    13d1 <strtoul+0x2d1>
movl   $0x0,-0x4(%rbp)
jmp    13d8 <strtoul+0x2d8>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtoul>:
push   %rbp
push   %rbx
movq   $0x0,(%rsi)
cmpb   $0x30,(%rdi)
jne    1142 <strtoul+0x42>
mov    0x1(%rdi),%al
mov    $0x10,%r9d
mov    $0x1,%r10b
mov    $0x2,%ecx
xor    %r8d,%r8d
cmp    $0x61,%al
jg     1135 <strtoul+0x35>
cmp    $0x42,%al
je     1154 <strtoul+0x54>
mov    $0x0,%edx
cmp    $0x58,%al
je     1167 <strtoul+0x67>
jmp    1142 <strtoul+0x42>
cmp    $0x62,%al
je     1154 <strtoul+0x54>
mov    $0x0,%edx
cmp    $0x78,%al
je     1167 <strtoul+0x67>
mov    $0xa,%r9d
mov    $0x1,%dl
xor    %ecx,%ecx
xor    %r8d,%r8d
xor    %r10d,%r10d
jmp    1167 <strtoul+0x67>
mov    $0x1,%r8b
mov    $0x2,%ecx
xor    %edx,%edx
xor    %r10d,%r10d
mov    $0x2,%r9d
xor    %eax,%eax
movabs $0x3f0000003f,%r11
jmp    1197 <strtoul+0x97>
cs nopw 0x0(%rax,%rax,1)
nop
movslq %ebx,%rbx
add    $0xffffffffffffffd0,%rbx
add    %rbx,%rax
mov    %rax,(%rsi)
add    $0x1,%rcx
cmp    $0x10,%rcx
je     1205 <strtoul+0x105>
test   %r8b,%r8b
je     11a8 <strtoul+0xa8>
movzbl (%rdi,%rcx,1),%ebx
add    $0xce,%bl
cmp    $0xfe,%bl
jb     120a <strtoul+0x10a>
test   %dl,%dl
je     11b8 <strtoul+0xb8>
movzbl (%rdi,%rcx,1),%ebx
add    $0xc6,%bl
cmp    $0xf6,%bl
jb     120a <strtoul+0x10a>
test   %r10b,%r10b
je     11db <strtoul+0xdb>
movzbl (%rdi,%rcx,1),%ebx
lea    -0x3a(%rbx),%ebp
cmp    $0xf5,%bpl
ja     11db <strtoul+0xdb>
add    $0xbf,%bl
cmp    $0x25,%bl
ja     120a <strtoul+0x10a>
movzbl %bl,%ebx
bt     %rbx,%r11
jae    120a <strtoul+0x10a>
imul   %r9,%rax
mov    %rax,(%rsi)
movsbl (%rdi,%rcx,1),%ebx
cmp    $0x39,%ebx
jle    1180 <strtoul+0x80>
cmp    $0x5a,%bl
ja     1200 <strtoul+0x100>
add    $0xffffffc9,%ebx
jmp    1187 <strtoul+0x87>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0xffffffa9,%ebx
jmp    1187 <strtoul+0x87>
mov    $0x1,%ecx
xor    %eax,%eax
test   %rcx,%rcx
setne  %al
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @strtoul(i8* nocapture %0, i64* nocapture %1) {
store i64 0, i64* %1
%3 = load i8, i8* %0
%4 = icmp eq i8 %3, 48
br i1 %4, label %5, label %8
5: ; preds = %2
%6 = getelementptr inbounds i8, i8* %0, i64 1
%7 = load i8, i8* %6
switch i8 %7, label %8 [
i8 120, label %11
i8 88, label %11
i8 98, label %9
i8 66, label %10
]
8: ; preds = %5, %2
br label %11
9: ; preds = %5
br label %11
10: ; preds = %5
br label %11
11: ; preds = %5, %5, %10, %9, %8
%12 = phi i64 [ 0, %8 ], [ 2, %5 ], [ 2, %5 ], [ 2, %9 ], [ 2, %10 ]
%13 = phi i1 [ false, %8 ], [ false, %5 ], [ false, %5 ], [ true, %9 ], [ true, %10 ]
%14 = phi i1 [ true, %8 ], [ false, %5 ], [ false, %5 ], [ false, %9 ], [ false, %10 ]
%15 = phi i1 [ false, %8 ], [ true, %5 ], [ true, %5 ], [ false, %9 ], [ false, %10 ]
%16 = phi i64 [ 10, %8 ], [ 16, %5 ], [ 16, %5 ], [ 2, %9 ], [ 2, %10 ]
br label %17
17: ; preds = %11, %56
%18 = phi i64 [ 0, %11 ], [ %58, %56 ]
%19 = phi i64 [ %12, %11 ], [ %59, %56 ]
br i1 %13, label %20, label %25
20: ; preds = %17
%21 = getelementptr inbounds i8, i8* %0, i64 %19
%22 = load i8, i8* %21
%23 = add i8 %22, -50
%24 = icmp ult i8 %23, -2
br i1 %24, label %61, label %25
25: ; preds = %20, %17
br i1 %14, label %26, label %31
26: ; preds = %25
%27 = getelementptr inbounds i8, i8* %0, i64 %19
%28 = load i8, i8* %27
%29 = add i8 %28, -58
%30 = icmp ult i8 %29, -10
br i1 %30, label %61, label %31
31: ; preds = %26, %25
br i1 %15, label %32, label %39
32: ; preds = %31
%33 = getelementptr inbounds i8, i8* %0, i64 %19
%34 = load i8, i8* %33
%35 = freeze i8 %34
%36 = add i8 %35, -58
%37 = icmp ult i8 %36, -10
br i1 %37, label %38, label %39
38: ; preds = %32
switch i8 %35, label %61 [
i8 102, label %39
i8 101, label %39
i8 100, label %39
i8 99, label %39
i8 98, label %39
i8 97, label %39
i8 70, label %39
i8 69, label %39
i8 68, label %39
i8 67, label %39
i8 66, label %39
i8 65, label %39
]
39: ; preds = %38, %38, %38, %38, %38, %38, %38, %38, %38, %38, %38, %38, %32, %31
%40 = mul i64 %18, %16
store i64 %40, i64* %1
%41 = getelementptr inbounds i8, i8* %0, i64 %19
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp slt i8 %42, 58
br i1 %44, label %45, label %48
45: ; preds = %39
%46 = add nsw i32 %43, -48
%47 = sext i32 %46 to i64
br label %56
48: ; preds = %39
%49 = icmp ult i8 %42, 91
br i1 %49, label %50, label %53
50: ; preds = %48
%51 = add nsw i32 %43, -55
%52 = zext i32 %51 to i64
br label %56
53: ; preds = %48
%54 = add nsw i32 %43, -87
%55 = zext i32 %54 to i64
br label %56
56: ; preds = %45, %53, %50
%57 = phi i64 [ %47, %45 ], [ %55, %53 ], [ %52, %50 ]
%58 = add i64 %40, %57
store i64 %58, i64* %1
%59 = add nuw nsw i64 %19, 1
%60 = icmp eq i64 %59, 16
br i1 %60, label %61, label %17
61: ; preds = %38, %26, %20, %56
%62 = phi i64 [ %19, %38 ], [ %19, %26 ], [ %19, %20 ], [ 1, %56 ]
%63 = icmp ne i64 %62, 0
%64 = zext i1 %63 to i32
ret i32 %64
}