#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
bool is_utf8(const char *string) {
  if (!string)
    return 0;
  const unsigned char *bytes = (const unsigned char *)string;
  while (*bytes) {
    if ((bytes[0] == 0x09 || bytes[0] == 0x0A || bytes[0] == 0x0D ||
         (0x20 <= bytes[0] && bytes[0] <= 0x7E))) {
      bytes += 1;
      continue;
    }
    if (((0xC2 <= bytes[0] && bytes[0] <= 0xDF) &&
         (0x80 <= bytes[1] && bytes[1] <= 0xBF))) {
      bytes += 2;
      continue;
    }
    if ((bytes[0] == 0xE0 && (0xA0 <= bytes[1] && bytes[1] <= 0xBF) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF)) ||
        (((0xE1 <= bytes[0] && bytes[0] <= 0xEC) || bytes[0] == 0xEE ||
          bytes[0] == 0xEF) &&
         (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF)) ||
        (bytes[0] == 0xED && (0x80 <= bytes[1] && bytes[1] <= 0x9F) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF))) {
      bytes += 3;
      continue;
    }
    if ((bytes[0] == 0xF0 && (0x90 <= bytes[1] && bytes[1] <= 0xBF) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
         (0x80 <= bytes[3] && bytes[3] <= 0xBF)) ||
        ((0xF1 <= bytes[0] && bytes[0] <= 0xF3) &&
         (0x80 <= bytes[1] && bytes[1] <= 0xBF) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
         (0x80 <= bytes[3] && bytes[3] <= 0xBF)) ||
        (bytes[0] == 0xF4 && (0x80 <= bytes[1] && bytes[1] <= 0x8F) &&
         (0x80 <= bytes[2] && bytes[2] <= 0xBF) &&
         (0x80 <= bytes[3] && bytes[3] <= 0xBF))) {
      bytes += 4;
      continue;
    }
    return 0;
  }
  return 1;
}


x86 assembly (clang, -O0):
<is_utf8>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    111f <is_utf8+0x1f>
movl   $0x0,-0x4(%rbp)
jmp    153d <is_utf8+0x43d>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1536 <is_utf8+0x436>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x9,%eax
je     1188 <is_utf8+0x88>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xa,%eax
je     1188 <is_utf8+0x88>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xd,%eax
je     1188 <is_utf8+0x88>
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x20,%eax
cmp    %ecx,%eax
jg     1199 <is_utf8+0x99>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7e,%eax
jg     1199 <is_utf8+0x99>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1127 <is_utf8+0x27>
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
mov    $0xc2,%eax
cmp    %ecx,%eax
jg     11f8 <is_utf8+0xf8>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xdf,%eax
jg     11f8 <is_utf8+0xf8>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     11f8 <is_utf8+0xf8>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     11f8 <is_utf8+0xf8>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    1127 <is_utf8+0x27>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xe0,%eax
jne    125a <is_utf8+0x15a>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0xa0,%eax
cmp    %ecx,%eax
jg     125a <is_utf8+0x15a>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     125a <is_utf8+0x15a>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     125a <is_utf8+0x15a>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jle    1356 <is_utf8+0x256>
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
mov    $0xe1,%eax
cmp    %ecx,%eax
jg     1280 <is_utf8+0x180>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xec,%eax
jle    12a4 <is_utf8+0x1a4>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xee,%eax
je     12a4 <is_utf8+0x1a4>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xef,%eax
jne    12f4 <is_utf8+0x1f4>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     12f4 <is_utf8+0x1f4>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     12f4 <is_utf8+0x1f4>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     12f4 <is_utf8+0x1f4>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jle    1356 <is_utf8+0x256>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xed,%eax
jne    1367 <is_utf8+0x267>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     1367 <is_utf8+0x267>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x9f,%eax
jg     1367 <is_utf8+0x267>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     1367 <is_utf8+0x267>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     1367 <is_utf8+0x267>
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    1127 <is_utf8+0x27>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf0,%eax
jne    13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x90,%eax
cmp    %ecx,%eax
jg     13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     13f1 <is_utf8+0x2f1>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jle    1519 <is_utf8+0x419>
mov    -0x18(%rbp),%rax
movzbl (%rax),%ecx
mov    $0xf1,%eax
cmp    %ecx,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf3,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     148f <is_utf8+0x38f>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jle    1519 <is_utf8+0x419>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf4,%eax
jne    152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x8f,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     152a <is_utf8+0x42a>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1127 <is_utf8+0x27>
movl   $0x0,-0x4(%rbp)
jmp    153d <is_utf8+0x43d>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_utf8>:
xor    %eax,%eax
test   %rdi,%rdi
jne    1123 <is_utf8+0x23>
ret
mov    $0x2,%edx
cmpb   $0xc0,0x1(%rdi)
jge    1107 <is_utf8+0x7>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    %rdx,%rdi
movzbl (%rdi),%ecx
mov    $0x1,%edx
lea    -0x9(%rcx),%esi
cmp    $0x2,%sil
jb     1120 <is_utf8+0x20>
cmp    $0xd,%cl
je     1120 <is_utf8+0x20>
test   %cl,%cl
je     1205 <is_utf8+0x105>
lea    -0x20(%rcx),%esi
cmp    $0x5e,%sil
jbe    1120 <is_utf8+0x20>
lea    0x3e(%rcx),%edx
cmp    $0x1d,%dl
jbe    1108 <is_utf8+0x8>
cmp    $0xe0,%cl
jne    1165 <is_utf8+0x65>
movzbl 0x1(%rdi),%ecx
and    $0xe0,%cl
cmp    $0xa0,%cl
je     119c <is_utf8+0x9c>
jmp    1107 <is_utf8+0x7>
lea    0x1f(%rcx),%edx
cmp    $0xc,%dl
jb     1177 <is_utf8+0x77>
mov    %ecx,%edx
and    $0xfe,%dl
cmp    $0xee,%dl
jne    1188 <is_utf8+0x88>
cmpb   $0xbf,0x1(%rdi)
jg     1188 <is_utf8+0x88>
mov    $0x3,%edx
cmpb   $0xc0,0x2(%rdi)
jl     1120 <is_utf8+0x20>
cmp    $0xf0,%cl
je     11b0 <is_utf8+0xb0>
cmp    $0xed,%cl
jne    11c1 <is_utf8+0xc1>
cmpb   $0x9f,0x1(%rdi)
jg     1107 <is_utf8+0x7>
mov    $0x3,%edx
cmpb   $0xc0,0x2(%rdi)
jl     1120 <is_utf8+0x20>
jmp    1107 <is_utf8+0x7>
movzbl 0x1(%rdi),%ecx
add    $0x70,%cl
cmp    $0x2f,%cl
jbe    11e7 <is_utf8+0xe7>
jmp    1107 <is_utf8+0x7>
lea    0xf(%rcx),%edx
cmp    $0x2,%dl
ja     11d4 <is_utf8+0xd4>
cmpb   $0xbf,0x1(%rdi)
jle    11e7 <is_utf8+0xe7>
jmp    1107 <is_utf8+0x7>
cmp    $0xf4,%cl
jne    1107 <is_utf8+0x7>
cmpb   $0x8f,0x1(%rdi)
jg     1107 <is_utf8+0x7>
cmpb   $0xbf,0x2(%rdi)
jg     1107 <is_utf8+0x7>
mov    $0x4,%edx
cmpb   $0xc0,0x3(%rdi)
jl     1120 <is_utf8+0x20>
jmp    1107 <is_utf8+0x7>
mov    $0x1,%eax
ret

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

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