int utf8_cnt(const unsigned char *s, int width, int *p_rem) {
  int cnt = 0;
  if (!s)
    return 0;
  while (*s && width) {
    if (*s <= 0x7f) {
      s++;
      width--;
      cnt++;
    } else if (*s <= 0xbf) {
      s++;
      width--;
      cnt++;
    } else if (*s <= 0xc1) {
      s++;
      width--;
      cnt++;
    } else if (*s <= 0xdf) {
      if (s[1] >= 0x80 && s[1] <= 0xbf) {
        s += 2;
        width--;
        cnt += 2;
      } else {
        s++;
        width--;
        cnt++;
      }
    } else if (*s <= 0xef) {
      if (s[1] >= 0x80 && s[1] <= 0xbf && s[2] >= 0x80 && s[2] <= 0xbf) {
        s += 3;
        width--;
        cnt += 3;
      } else {
        s++;
        width--;
        cnt++;
      }
    } else if (*s <= 0xf7) {
      if (s[1] >= 0x80 && s[1] <= 0xbf && s[2] >= 0x80 && s[2] <= 0xbf &&
          s[3] >= 0x80 && s[3] <= 0xbf) {
        s += 4;
        width--;
        cnt += 4;
      } else {
        s++;
        width--;
        cnt++;
      }
    } else {
      s++;
      width--;
      cnt++;
    }
  }
  if (p_rem)
    *p_rem = width;
  return cnt;
}


x86 assembly (clang, -O0):
<utf8_cnt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    112d <utf8_cnt+0x2d>
movl   $0x0,-0x4(%rbp)
jmp    1440 <utf8_cnt+0x340>
jmp    1132 <utf8_cnt+0x32>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x25(%rbp)
je     1151 <utf8_cnt+0x51>
cmpl   $0x0,-0x14(%rbp)
setne  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    1161 <utf8_cnt+0x61>
jmp    1426 <utf8_cnt+0x326>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7f,%eax
jg     1194 <utf8_cnt+0x94>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1421 <utf8_cnt+0x321>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xbf,%eax
jg     11c9 <utf8_cnt+0xc9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    141c <utf8_cnt+0x31c>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xc1,%eax
jg     11fe <utf8_cnt+0xfe>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1417 <utf8_cnt+0x317>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xdf,%eax
jg     127c <utf8_cnt+0x17c>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     1259 <utf8_cnt+0x159>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     1259 <utf8_cnt+0x159>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    1277 <utf8_cnt+0x177>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1412 <utf8_cnt+0x312>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xef,%eax
jg     1320 <utf8_cnt+0x220>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     12fd <utf8_cnt+0x1fd>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     12fd <utf8_cnt+0x1fd>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     12fd <utf8_cnt+0x1fd>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     12fd <utf8_cnt+0x1fd>
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x24(%rbp)
jmp    131b <utf8_cnt+0x21b>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    140d <utf8_cnt+0x30d>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf7,%eax
jg     13ea <utf8_cnt+0x2ea>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jl     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     13c7 <utf8_cnt+0x2c7>
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    13e5 <utf8_cnt+0x2e5>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1408 <utf8_cnt+0x308>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    140d <utf8_cnt+0x30d>
jmp    1412 <utf8_cnt+0x312>
jmp    1417 <utf8_cnt+0x317>
jmp    141c <utf8_cnt+0x31c>
jmp    1421 <utf8_cnt+0x321>
jmp    1132 <utf8_cnt+0x32>
cmpq   $0x0,-0x20(%rbp)
je     143a <utf8_cnt+0x33a>
mov    -0x14(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_cnt>:
test   %rdi,%rdi
je     11f5 <utf8_cnt+0xf5>
mov    (%rdi),%cl
xor    %eax,%eax
test   %cl,%cl
je     11f8 <utf8_cnt+0xf8>
test   %esi,%esi
je     1204 <utf8_cnt+0x104>
xor    %eax,%eax
nop
test   %cl,%cl
jns    1130 <utf8_cnt+0x30>
cmp    $0xbf,%cl
jbe    1130 <utf8_cnt+0x30>
cmp    $0xc1,%cl
ja     1159 <utf8_cnt+0x59>
xchg   %ax,%ax
add    $0x1,%rdi
mov    $0x1,%r8d
add    %r8d,%eax
lea    -0x1(%rsi),%r8d
movzbl (%rdi),%ecx
test   %cl,%cl
je     11fb <utf8_cnt+0xfb>
cmp    $0x1,%esi
mov    %r8d,%esi
jne    1120 <utf8_cnt+0x20>
jmp    11fb <utf8_cnt+0xfb>
cmp    $0xdf,%cl
ja     1170 <utf8_cnt+0x70>
xor    %r8d,%r8d
cmpb   $0xc0,0x1(%rdi)
setl   %cl
jl     1196 <utf8_cnt+0x96>
add    $0x1,%rdi
jmp    119a <utf8_cnt+0x9a>
lea    0x1(%rdi),%r9
mov    $0x1,%r8d
cmp    $0xef,%cl
ja     11a3 <utf8_cnt+0xa3>
cmpb   $0xbf,0x1(%rdi)
jg     11c5 <utf8_cnt+0xc5>
xor    %ecx,%ecx
cmpb   $0xc0,0x2(%rdi)
setl   %r8b
jl     11cd <utf8_cnt+0xcd>
mov    %r9,%rdi
jmp    11d1 <utf8_cnt+0xd1>
add    $0x2,%rdi
mov    %cl,%r8b
add    $0x1,%r8d
jmp    113a <utf8_cnt+0x3a>
cmp    $0xf7,%cl
ja     11c5 <utf8_cnt+0xc5>
cmpb   $0xbf,(%r9)
jg     11c5 <utf8_cnt+0xc5>
cmpb   $0xbf,0x2(%rdi)
jg     11c5 <utf8_cnt+0xc5>
xor    %ecx,%ecx
cmpb   $0xc0,0x3(%rdi)
setl   %r8b
jl     11e1 <utf8_cnt+0xe1>
mov    %r9,%rdi
jmp    11e5 <utf8_cnt+0xe5>
mov    %r9,%rdi
jmp    113a <utf8_cnt+0x3a>
add    $0x3,%rdi
mov    %r8b,%cl
lea    (%rcx,%rcx,1),%r8d
add    $0x1,%r8d
jmp    113a <utf8_cnt+0x3a>
add    $0x4,%rdi
mov    %r8b,%cl
lea    (%rcx,%rcx,2),%r8d
add    $0x1,%r8d
jmp    113a <utf8_cnt+0x3a>
xor    %eax,%eax
ret
mov    %esi,%r8d
test   %rdx,%rdx
je     1203 <utf8_cnt+0x103>
mov    %r8d,(%rdx)
ret
mov    %esi,%r8d
test   %rdx,%rdx
jne    1200 <utf8_cnt+0x100>
jmp    1203 <utf8_cnt+0x103>

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

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