int u8_rune_length(const char *p) {
  if (*p == '\x00')
    return 0;
  if (*p > '\x00' && *p <= '\x7f')
    return 1;
  if (*p >= '\xc2' && *p <= '\xdf' && *(p + 1) >= '\x80' && *(p + 1) <= '\xbf')
    return 2;
  if (*p == '\xe0' && *(p + 1) >= '\xa0' && *(p + 1) <= '\xbf' &&
      *(p + 2) >= '\x80' && *(p + 2) <= '\xbf')
    return 3;
  if (*p >= '\xe1' && *p <= '\xec' && *(p + 1) >= '\x80' &&
      *(p + 1) <= '\xbf' && *(p + 2) >= '\x80' && *(p + 2) <= '\xbf')
    return 3;
  if (*p == '\xed' && *(p + 1) >= '\x80' && *(p + 1) <= '\x9f' &&
      *(p + 2) >= '\x80' && *(p + 2) <= '\xbf')
    return 3;
  if (*p == '\xf0' && *(p + 1) >= '\x90' && *(p + 1) <= '\xbf' &&
      *(p + 2) >= '\x80' && *(p + 2) <= '\xbf' && *(p + 3) >= '\x80' &&
      *(p + 3) <= '\xbf')
    return 4;
  if (*p >= '\xf1' && *p <= '\xf3' && *(p + 1) >= '\x80' &&
      *(p + 1) <= '\xbf' && *(p + 2) >= '\x80' && *(p + 2) <= '\xbf' &&
      *(p + 3) >= '\x80' && *(p + 3) <= '\xbf')
    return 4;
  if (*p == '\xf4' && *(p + 1) >= '\x80' && *(p + 1) <= '\x8f' &&
      *(p + 2) >= '\x80' && *(p + 2) <= '\xbf' && *(p + 3) >= '\x80' &&
      *(p + 3) <= '\xbf')
    return 4;
  return -1;
}


x86 assembly (clang, -O0):
<u8_rune_length>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1124 <u8_rune_length+0x24>
movl   $0x0,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jle    1150 <u8_rune_length+0x50>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7f,%eax
jg     1150 <u8_rune_length+0x50>
movl   $0x1,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffc2,%eax
jl     119e <u8_rune_length+0x9e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffdf,%eax
jg     119e <u8_rune_length+0x9e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff80,%eax
jl     119e <u8_rune_length+0x9e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffbf,%eax
jg     119e <u8_rune_length+0x9e>
movl   $0x2,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffe0,%eax
jne    11fe <u8_rune_length+0xfe>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffa0,%eax
jl     11fe <u8_rune_length+0xfe>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffbf,%eax
jg     11fe <u8_rune_length+0xfe>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     11fe <u8_rune_length+0xfe>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     11fe <u8_rune_length+0xfe>
movl   $0x3,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffe1,%eax
jl     126e <u8_rune_length+0x16e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffec,%eax
jg     126e <u8_rune_length+0x16e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff80,%eax
jl     126e <u8_rune_length+0x16e>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffbf,%eax
jg     126e <u8_rune_length+0x16e>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     126e <u8_rune_length+0x16e>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     126e <u8_rune_length+0x16e>
movl   $0x3,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffed,%eax
jne    12ce <u8_rune_length+0x1ce>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff80,%eax
jl     12ce <u8_rune_length+0x1ce>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff9f,%eax
jg     12ce <u8_rune_length+0x1ce>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     12ce <u8_rune_length+0x1ce>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     12ce <u8_rune_length+0x1ce>
movl   $0x3,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xfffffff0,%eax
jne    1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff90,%eax
jl     1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffbf,%eax
jg     1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffff80,%eax
jl     1350 <u8_rune_length+0x250>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffffbf,%eax
jg     1350 <u8_rune_length+0x250>
movl   $0x4,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xfffffff1,%eax
jl     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xfffffff3,%eax
jg     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff80,%eax
jl     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffffbf,%eax
jg     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffff80,%eax
jl     13e2 <u8_rune_length+0x2e2>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffffbf,%eax
jg     13e2 <u8_rune_length+0x2e2>
movl   $0x4,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xfffffff4,%eax
jne    1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff80,%eax
jl     1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0xffffff8f,%eax
jg     1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffff80,%eax
jl     1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0xffffffbf,%eax
jg     1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffff80,%eax
jl     1464 <u8_rune_length+0x364>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0xffffffbf,%eax
jg     1464 <u8_rune_length+0x364>
movl   $0x4,-0x4(%rbp)
jmp    146b <u8_rune_length+0x36b>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<u8_rune_length>:
mov    (%rdi),%cl
test   %cl,%cl
je     110e <u8_rune_length+0xe>
mov    $0x1,%eax
jle    1111 <u8_rune_length+0x11>
ret
xor    %eax,%eax
ret
lea    0x3e(%rcx),%eax
cmp    $0x1d,%al
ja     1125 <u8_rune_length+0x25>
mov    $0x2,%eax
cmpb   $0xc0,0x1(%rdi)
jl     110d <u8_rune_length+0xd>
jmp    115f <u8_rune_length+0x5f>
cmp    $0xe0,%cl
jne    1135 <u8_rune_length+0x35>
mov    0x1(%rdi),%al
and    $0xe0,%al
cmp    $0xa0,%al
je     1154 <u8_rune_length+0x54>
jmp    115f <u8_rune_length+0x5f>
lea    0x1f(%rcx),%eax
cmp    $0xb,%al
ja     1144 <u8_rune_length+0x44>
cmpb   $0xbf,0x1(%rdi)
jle    1154 <u8_rune_length+0x54>
jmp    115f <u8_rune_length+0x5f>
cmp    $0xf0,%cl
je     1165 <u8_rune_length+0x65>
cmp    $0xed,%cl
jne    1170 <u8_rune_length+0x70>
cmpb   $0x9f,0x1(%rdi)
jg     115f <u8_rune_length+0x5f>
mov    $0x3,%eax
cmpb   $0xc0,0x2(%rdi)
jl     110d <u8_rune_length+0xd>
mov    $0xffffffff,%eax
ret
mov    0x1(%rdi),%al
add    $0x70,%al
cmp    $0x2f,%al
ja     115f <u8_rune_length+0x5f>
jmp    118a <u8_rune_length+0x8a>
lea    0xf(%rcx),%eax
cmp    $0x2,%al
ja     117f <u8_rune_length+0x7f>
cmpb   $0xbf,0x1(%rdi)
jg     115f <u8_rune_length+0x5f>
jmp    118a <u8_rune_length+0x8a>
cmp    $0xf4,%cl
jne    115f <u8_rune_length+0x5f>
cmpb   $0x8f,0x1(%rdi)
jg     115f <u8_rune_length+0x5f>
cmpb   $0xbf,0x2(%rdi)
jg     115f <u8_rune_length+0x5f>
mov    $0x4,%eax
cmpb   $0xc0,0x3(%rdi)
jl     110d <u8_rune_length+0xd>
jmp    115f <u8_rune_length+0x5f>

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

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