char get_next_utf8_char_len(const char *buf, int max_left_bytes) {
  char n = 0;
  unsigned char b0 = (unsigned char)buf[0];
  if (b0 < 128)
    n = 1;
  else if (b0 < 192)
    n = 0;
  else if (2 <= max_left_bytes && b0 < 224 && (unsigned char)buf[1] <= 191 &&
           (unsigned char)buf[1] >= 128)
    n = 2;
  else if (3 <= max_left_bytes && b0 < 240 && (unsigned char)buf[1] <= 191 &&
           (unsigned char)buf[1] >= 128 && (unsigned char)buf[2] <= 191 &&
           (unsigned char)buf[2] >= 128)
    n = 3;
  else if (4 <= max_left_bytes && b0 < 248 && (unsigned char)buf[1] <= 191 &&
           (unsigned char)buf[1] >= 128 && (unsigned char)buf[2] <= 191 &&
           (unsigned char)buf[2] >= 128 && (unsigned char)buf[3] <= 191 &&
           (unsigned char)buf[3] >= 128)
    n = 4;
  else if (5 <= max_left_bytes && b0 < 252 && (unsigned char)buf[1] <= 191 &&
           (unsigned char)buf[1] >= 128 && (unsigned char)buf[2] <= 191 &&
           (unsigned char)buf[2] >= 128 && (unsigned char)buf[3] <= 191 &&
           (unsigned char)buf[3] >= 128 && (unsigned char)buf[4] <= 191 &&
           (unsigned char)buf[4] >= 128)
    n = 5;
  else if (6 <= max_left_bytes && b0 < 254 && (unsigned char)buf[1] <= 191 &&
           (unsigned char)buf[1] >= 128 && (unsigned char)buf[2] <= 191 &&
           (unsigned char)buf[2] >= 128 && (unsigned char)buf[3] <= 191 &&
           (unsigned char)buf[3] >= 128 && (unsigned char)buf[4] <= 191 &&
           (unsigned char)buf[4] >= 128 && (unsigned char)buf[5] <= 191 &&
           (unsigned char)buf[5] >= 128)
    n = 6;
  return n;
}


x86 assembly (clang, -O0):
<get_next_utf8_char_len>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movb   $0x0,-0xd(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0xe(%rbp)
movzbl -0xe(%rbp),%eax
cmp    $0x80,%eax
jge    1130 <get_next_utf8_char_len+0x30>
movb   $0x1,-0xd(%rbp)
jmp    1459 <get_next_utf8_char_len+0x359>
movzbl -0xe(%rbp),%eax
cmp    $0xc0,%eax
jge    1148 <get_next_utf8_char_len+0x48>
movb   $0x0,-0xd(%rbp)
jmp    1454 <get_next_utf8_char_len+0x354>
mov    $0x2,%eax
cmp    -0xc(%rbp),%eax
jg     1194 <get_next_utf8_char_len+0x94>
movzbl -0xe(%rbp),%eax
cmp    $0xe0,%eax
jge    1194 <get_next_utf8_char_len+0x94>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     1194 <get_next_utf8_char_len+0x94>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     1194 <get_next_utf8_char_len+0x94>
movb   $0x2,-0xd(%rbp)
jmp    144f <get_next_utf8_char_len+0x34f>
mov    $0x3,%eax
cmp    -0xc(%rbp),%eax
jg     1206 <get_next_utf8_char_len+0x106>
movzbl -0xe(%rbp),%eax
cmp    $0xf0,%eax
jge    1206 <get_next_utf8_char_len+0x106>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     1206 <get_next_utf8_char_len+0x106>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     1206 <get_next_utf8_char_len+0x106>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     1206 <get_next_utf8_char_len+0x106>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     1206 <get_next_utf8_char_len+0x106>
movb   $0x3,-0xd(%rbp)
jmp    144a <get_next_utf8_char_len+0x34a>
mov    $0x4,%eax
cmp    -0xc(%rbp),%eax
jg     129e <get_next_utf8_char_len+0x19e>
movzbl -0xe(%rbp),%eax
cmp    $0xf8,%eax
jge    129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     129e <get_next_utf8_char_len+0x19e>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jl     129e <get_next_utf8_char_len+0x19e>
movb   $0x4,-0xd(%rbp)
jmp    1445 <get_next_utf8_char_len+0x345>
mov    $0x5,%eax
cmp    -0xc(%rbp),%eax
jg     135c <get_next_utf8_char_len+0x25c>
movzbl -0xe(%rbp),%eax
cmp    $0xfc,%eax
jge    135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jl     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0xbf,%eax
jg     135c <get_next_utf8_char_len+0x25c>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x80,%eax
jl     135c <get_next_utf8_char_len+0x25c>
movb   $0x5,-0xd(%rbp)
jmp    1440 <get_next_utf8_char_len+0x340>
mov    $0x6,%eax
cmp    -0xc(%rbp),%eax
jg     143b <get_next_utf8_char_len+0x33b>
movzbl -0xe(%rbp),%eax
cmp    $0xfe,%eax
jge    143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jl     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0xbf,%eax
jg     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x80,%eax
jl     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0xbf,%eax
jg     143b <get_next_utf8_char_len+0x33b>
mov    -0x8(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x80,%eax
jl     143b <get_next_utf8_char_len+0x33b>
movb   $0x6,-0xd(%rbp)
jmp    1440 <get_next_utf8_char_len+0x340>
jmp    1445 <get_next_utf8_char_len+0x345>
jmp    144a <get_next_utf8_char_len+0x34a>
jmp    144f <get_next_utf8_char_len+0x34f>
jmp    1454 <get_next_utf8_char_len+0x354>
jmp    1459 <get_next_utf8_char_len+0x359>
movsbl -0xd(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_next_utf8_char_len>:
mov    (%rdi),%cl
mov    $0x1,%al
test   %cl,%cl
js     1109 <get_next_utf8_char_len+0x9>
ret
cmp    $0xc0,%cl
jae    1111 <get_next_utf8_char_len+0x11>
xor    %eax,%eax
ret
cmp    $0x2,%esi
jl     1123 <get_next_utf8_char_len+0x23>
cmp    $0xdf,%cl
ja     1123 <get_next_utf8_char_len+0x23>
mov    $0x2,%al
cmpb   $0xc0,0x1(%rdi)
jl     1108 <get_next_utf8_char_len+0x8>
cmp    $0x3,%esi
jl     113b <get_next_utf8_char_len+0x3b>
cmp    $0xef,%cl
ja     113b <get_next_utf8_char_len+0x3b>
cmpb   $0xbf,0x1(%rdi)
jg     113b <get_next_utf8_char_len+0x3b>
mov    $0x3,%al
cmpb   $0xc0,0x2(%rdi)
jl     1108 <get_next_utf8_char_len+0x8>
cmp    $0x4,%esi
jl     1159 <get_next_utf8_char_len+0x59>
cmp    $0xf7,%cl
ja     1159 <get_next_utf8_char_len+0x59>
cmpb   $0xbf,0x1(%rdi)
jg     1159 <get_next_utf8_char_len+0x59>
cmpb   $0xbf,0x2(%rdi)
jg     1159 <get_next_utf8_char_len+0x59>
mov    $0x4,%al
cmpb   $0xc0,0x3(%rdi)
jl     1108 <get_next_utf8_char_len+0x8>
cmp    $0x5,%esi
jl     117d <get_next_utf8_char_len+0x7d>
cmp    $0xfb,%cl
ja     117d <get_next_utf8_char_len+0x7d>
cmpb   $0xbf,0x1(%rdi)
jg     117d <get_next_utf8_char_len+0x7d>
cmpb   $0xbf,0x2(%rdi)
jg     117d <get_next_utf8_char_len+0x7d>
cmpb   $0xbf,0x3(%rdi)
jg     117d <get_next_utf8_char_len+0x7d>
mov    $0x5,%al
cmpb   $0xc0,0x4(%rdi)
jl     1108 <get_next_utf8_char_len+0x8>
xor    %eax,%eax
cmp    $0x6,%esi
jl     1108 <get_next_utf8_char_len+0x8>
cmp    $0xfd,%cl
ja     1108 <get_next_utf8_char_len+0x8>
cmpb   $0xbf,0x1(%rdi)
jg     110e <get_next_utf8_char_len+0xe>
cmpb   $0xbf,0x2(%rdi)
jg     110e <get_next_utf8_char_len+0xe>
cmpb   $0xbf,0x3(%rdi)
jg     110e <get_next_utf8_char_len+0xe>
xor    %eax,%eax
cmpb   $0xbf,0x4(%rdi)
jg     1108 <get_next_utf8_char_len+0x8>
cmpb   $0xc0,0x5(%rdi)
mov    $0x6,%ecx
cmovl  %ecx,%eax
ret

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

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