int check_firmware(unsigned char *buf, int len) {
  unsigned char *current_block;
  int remaining_len;
  unsigned int addr;
  unsigned int size, extra_size;
  int boot_block_seen = 0;
  int last_block_seen = 0;
  current_block = buf;
  remaining_len = len;
  while (remaining_len > 0) {
    if (remaining_len < 8) {
      return (0);
    }
    addr = current_block[2] | (current_block[3] << 8) |
           (current_block[4] << 16) | (current_block[5] << 24);
    size = current_block[6] | (current_block[7] << 8);
    extra_size = current_block[1] | ((current_block[0] & 0x80) << 1);
    switch (current_block[0]) {
    case 0x08:
    case 0x88:
      if (extra_size <= 0x1f8 && extra_size > 6) {
        if (boot_block_seen || last_block_seen)
          return 0;
        if (extra_size < 0x1f8)
          last_block_seen = 1;
        if (extra_size != size + 6)
          return 0;
        current_block += 2;
        remaining_len -= 2;
        if (remaining_len < extra_size)
          return (0);
        current_block += extra_size;
        remaining_len -= extra_size;
        if (remaining_len < 3)
          return (0);
        if (current_block[0] != 0x40 || current_block[1] != 0x01 ||
            current_block[2] != 0x12)
          return (0);
        current_block += 3;
        remaining_len -= 3;
      } else if (extra_size == 4) {
        if (boot_block_seen)
          return (0);
        boot_block_seen = 1;
        current_block += 2;
        remaining_len -= 2;
        if (remaining_len < extra_size)
          return (0);
        current_block += extra_size;
        remaining_len -= extra_size;
        if (remaining_len < 3)
          return (0);
        if (current_block[0] != 0x00 || current_block[1] != 0x01 ||
            current_block[2] != 0x14)
          return (0);
        current_block += 3;
        remaining_len -= 3;
      } else {
        return (0);
      }
      break;
    default:
      return (0);
    }
  }
  return (1);
}


x86 assembly (clang, -O0):
<check_firmware>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    13b2 <check_firmware+0x2b2>
cmpl   $0x8,-0x24(%rbp)
jge    1147 <check_firmware+0x47>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
mov    0x2(%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movzwl 0x6(%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%ecx
movzbl (%rax),%edx
and    $0xffffff80,%edx
mov    %ecx,%eax
mov    %edx,%ecx
lea    (%rax,%rcx,2),%eax
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
or     $0x80,%eax
sub    $0x88,%eax
je     1190 <check_firmware+0x90>
jmp    13a1 <check_firmware+0x2a1>
cmpl   $0x1f8,-0x30(%rbp)
ja     12ae <check_firmware+0x1ae>
cmpl   $0x6,-0x30(%rbp)
jbe    12ae <check_firmware+0x1ae>
cmpl   $0x0,-0x34(%rbp)
jne    11bb <check_firmware+0xbb>
cmpl   $0x0,-0x38(%rbp)
je     11c7 <check_firmware+0xc7>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
cmpl   $0x1f8,-0x30(%rbp)
jae    11db <check_firmware+0xdb>
movl   $0x1,-0x38(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    $0x6,%ecx
cmp    %ecx,%eax
je     11f8 <check_firmware+0xf8>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x30(%rbp),%eax
jae    1225 <check_firmware+0x125>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x24(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1256 <check_firmware+0x156>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x40,%eax
jne    1288 <check_firmware+0x188>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x1,%eax
jne    1288 <check_firmware+0x188>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x12,%eax
je     1294 <check_firmware+0x194>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x24(%rbp)
jmp    139c <check_firmware+0x29c>
cmpl   $0x4,-0x30(%rbp)
jne    138b <check_firmware+0x28b>
cmpl   $0x0,-0x34(%rbp)
je     12ce <check_firmware+0x1ce>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
movl   $0x1,-0x34(%rbp)
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x30(%rbp),%eax
jae    1302 <check_firmware+0x202>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x24(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1333 <check_firmware+0x233>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
jne    1365 <check_firmware+0x265>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x1,%eax
jne    1365 <check_firmware+0x265>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x14,%eax
je     1371 <check_firmware+0x271>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
mov    -0x20(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x24(%rbp)
jmp    1397 <check_firmware+0x297>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
jmp    139c <check_firmware+0x29c>
jmp    13ad <check_firmware+0x2ad>
movl   $0x0,-0x4(%rbp)
jmp    13b9 <check_firmware+0x2b9>
jmp    1127 <check_firmware+0x27>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_firmware>:
mov    $0x1,%eax
test   %esi,%esi
jle    1205 <check_firmware+0x105>
xor    %r8d,%r8d
xor    %r9d,%r9d
jmp    1128 <check_firmware+0x28>
cs nopw 0x0(%rax,%rax,1)
nop
test   %esi,%esi
je     1205 <check_firmware+0x105>
cmp    $0x8,%esi
jb     1202 <check_firmware+0x102>
movzbl (%rdi),%edx
mov    %edx,%ecx
or     $0x80,%cl
cmp    $0x88,%cl
jne    1202 <check_firmware+0x102>
movzbl 0x6(%rdi),%r10d
movzbl 0x7(%rdi),%ecx
movzbl 0x1(%rdi),%r11d
and    $0x80,%edx
lea    (%r11,%rdx,2),%r11
lea    -0x7(%r11),%edx
cmp    $0x1f1,%edx
ja     11d0 <check_firmware+0xd0>
or     %r8d,%r9d
jne    1202 <check_firmware+0x102>
shl    $0x8,%ecx
or     %r10d,%ecx
xor    %r8d,%r8d
cmp    $0x1f8,%r11d
setb   %r9b
add    $0x6,%ecx
cmp    %ecx,%r11d
jne    1202 <check_firmware+0x102>
add    $0xfffffffe,%esi
sub    %r11d,%esi
jb     1202 <check_firmware+0x102>
cmp    $0x3,%esi
jl     1202 <check_firmware+0x102>
add    $0x2,%rdi
add    %r11,%rdi
cmpb   $0x40,(%rdi)
jne    1202 <check_firmware+0x102>
cmpb   $0x1,0x1(%rdi)
jne    1202 <check_firmware+0x102>
cmpb   $0x12,0x2(%rdi)
jne    1202 <check_firmware+0x102>
mov    %r9b,%r8b
add    $0x3,%rdi
add    $0xfffffffd,%esi
xor    %r9d,%r9d
jmp    1120 <check_firmware+0x20>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
test   %r9d,%r9d
jne    1202 <check_firmware+0x102>
cmp    $0x4,%r11d
jne    1202 <check_firmware+0x102>
add    $0xfffffff7,%esi
cmp    $0xfffffffc,%esi
ja     1202 <check_firmware+0x102>
test   %r10b,%r10b
jne    1202 <check_firmware+0x102>
cmp    $0x1,%cl
jne    1202 <check_firmware+0x102>
cmpb   $0x14,0x8(%rdi)
jne    1202 <check_firmware+0x102>
add    $0x9,%rdi
mov    $0x1,%r9d
jmp    1120 <check_firmware+0x20>
xor    %eax,%eax
ret
ret

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

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