int verify_utf8(const char *src, int sz, int null_term) {
  unsigned char *source = (unsigned char *)src;
  int size = sz;
  int num_chars = 0;
  while (size) {
    if (null_term && (*source) == 0)
      return num_chars;
    if (((*source) & ((unsigned char)0x80)) == 0) {
      source++;
      --size;
    } else if (((*source) & ((unsigned char)0xE0)) == 0xC0) {
      if (size < 2)
        return -1;
      if (((source[1] & ((unsigned char)0xC0)) != 0x80) || ((*source) < 0xC2)) {
        return -1;
      }
      source += 2;
      size -= 2;
    } else if (((*source) & ((unsigned char)0xF0)) == 0xE0) {
      if (size < 3)
        return -1;
      if (((source[1] & ((unsigned char)0xC0)) != 0x80) ||
          ((source[2] & ((unsigned char)0xC0)) != 0x80) ||
          (((*source) == 0xE0) && (source[1] < 0xA0))) {
        return -1;
      }
      if ((((*source) & ((unsigned char)0xF)) == 0xD) &&
          ((source[1] & 0x20) != 0)) {
        return -1;
      }
      source += 3;
      size -= 3;
    } else if (((*source) & ((unsigned char)0xF8)) == 0xF0) {
      if (size < 4)
        return -1;
      if (((source[1] & ((unsigned char)0xC0)) != 0x80) ||
          ((source[2] & ((unsigned char)0xC0)) != 0x80) ||
          ((source[3] & ((unsigned char)0xC0)) != 0x80) ||
          (((*source) == 0xF0) && (source[1] < 0x90))) {
        return -1;
      }
      if ((((*source) & ((unsigned char)0x7)) > 0x4U) ||
          ((((*source) & ((unsigned char)0x7)) == 0x4U) &&
           ((source[1] & ((unsigned char)0x3F)) > 0xFU))) {
        return -1;
      }
      source += 4;
      size -= 4;
    } else {
      return -1;
    }
    ++num_chars;
  }
  return num_chars;
}


x86 assembly (clang, -O0):
<verify_utf8>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x24(%rbp)
je     1408 <verify_utf8+0x308>
cmpl   $0x0,-0x18(%rbp)
je     1152 <verify_utf8+0x52>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
jne    1152 <verify_utf8+0x52>
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1181 <verify_utf8+0x81>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    13fa <verify_utf8+0x2fa>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    11fe <verify_utf8+0xfe>
cmpl   $0x2,-0x24(%rbp)
jge    11ae <verify_utf8+0xae>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    11d8 <verify_utf8+0xd8>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xc2,%eax
jge    11e4 <verify_utf8+0xe4>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    13f5 <verify_utf8+0x2f5>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    12d9 <verify_utf8+0x1d9>
cmpl   $0x3,-0x24(%rbp)
jge    122b <verify_utf8+0x12b>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1280 <verify_utf8+0x180>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1280 <verify_utf8+0x180>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xe0,%eax
jne    128c <verify_utf8+0x18c>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xa0,%eax
jge    128c <verify_utf8+0x18c>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0xf,%eax
cmp    $0xd,%eax
jne    12bf <verify_utf8+0x1bf>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     12bf <verify_utf8+0x1bf>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x24(%rbp)
jmp    13f0 <verify_utf8+0x2f0>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    13df <verify_utf8+0x2df>
cmpl   $0x4,-0x24(%rbp)
jge    1306 <verify_utf8+0x206>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1373 <verify_utf8+0x273>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1373 <verify_utf8+0x273>
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1373 <verify_utf8+0x273>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf0,%eax
jne    137f <verify_utf8+0x27f>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x90,%eax
jge    137f <verify_utf8+0x27f>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x7,%eax
cmp    $0x4,%eax
ja     13b9 <verify_utf8+0x2b9>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x7,%eax
cmp    $0x4,%eax
jne    13c5 <verify_utf8+0x2c5>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
cmp    $0xf,%eax
jbe    13c5 <verify_utf8+0x2c5>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    13eb <verify_utf8+0x2eb>
movl   $0xffffffff,-0x4(%rbp)
jmp    140e <verify_utf8+0x30e>
jmp    13f0 <verify_utf8+0x2f0>
jmp    13f5 <verify_utf8+0x2f5>
jmp    13fa <verify_utf8+0x2fa>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1123 <verify_utf8+0x23>
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<verify_utf8>:
push   %rbx
test   %esi,%esi
je     1275 <verify_utf8+0x175>
xor    %ebx,%ebx
jmp    112d <verify_utf8+0x2d>
nopl   (%rax)
mov    $0xffffffff,%r9d
mov    $0x1,%r10d
add    %r10,%rdi
add    $0x1,%ebx
mov    %ebx,%eax
add    %r9d,%esi
je     1273 <verify_utf8+0x173>
movzbl (%rdi),%r8d
test   %edx,%edx
je     113e <verify_utf8+0x3e>
test   %r8b,%r8b
je     1279 <verify_utf8+0x179>
test   $0x80,%r8b
je     1110 <verify_utf8+0x10>
movzbl %r8b,%ecx
mov    %ecx,%eax
and    $0xffffffe0,%eax
cmp    $0xc0,%eax
jne    1190 <verify_utf8+0x90>
mov    $0xffffffff,%eax
cmp    $0x2,%esi
jl     1273 <verify_utf8+0x173>
movzbl 0x1(%rdi),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
cmp    $0xc2,%r8b
jb     1273 <verify_utf8+0x173>
mov    $0xfffffffe,%r9d
mov    $0x2,%r10d
jmp    111c <verify_utf8+0x1c>
nopw   0x0(%rax,%rax,1)
mov    %ecx,%eax
and    $0xfffffff0,%eax
cmp    $0xe0,%eax
jne    1204 <verify_utf8+0x104>
mov    $0xffffffff,%eax
cmp    $0x3,%esi
jl     1273 <verify_utf8+0x173>
movzbl 0x1(%rdi),%r11d
mov    %r11d,%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
movzbl 0x2(%rdi),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
cmp    $0xe0,%r8b
jne    11de <verify_utf8+0xde>
cmp    $0xa0,%r11b
jb     1273 <verify_utf8+0x173>
and    $0xf,%r8b
mov    $0xfffffffd,%r9d
mov    $0x3,%r10d
cmp    $0xd,%r8b
jne    111c <verify_utf8+0x1c>
and    $0x20,%r11b
je     111c <verify_utf8+0x1c>
jmp    1273 <verify_utf8+0x173>
and    $0xfffffff8,%ecx
mov    $0xffffffff,%eax
cmp    $0xf0,%ecx
jne    1273 <verify_utf8+0x173>
cmp    $0x4,%esi
jl     1273 <verify_utf8+0x173>
movzbl 0x1(%rdi),%r11d
mov    %r11d,%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
movzbl 0x2(%rdi),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
movzbl 0x3(%rdi),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1273 <verify_utf8+0x173>
cmp    $0xf0,%r8b
jne    124d <verify_utf8+0x14d>
cmp    $0x90,%r11b
jb     1273 <verify_utf8+0x173>
and    $0x7,%r8b
cmp    $0x4,%r8b
ja     1273 <verify_utf8+0x173>
mov    $0xfffffffc,%r9d
mov    $0x4,%r10d
jne    111c <verify_utf8+0x1c>
and    $0x30,%r11b
je     111c <verify_utf8+0x1c>
pop    %rbx
ret
xor    %eax,%eax
pop    %rbx
ret
mov    %ebx,%eax
pop    %rbx
ret

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

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