void *utf8valid(const void *str) {
  const char *s = (const char *)str;
  while ('\0' != *s) {
    if (0xf0 == (0xf8 & *s)) {
      if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2])) ||
          (0x80 != (0xc0 & s[3]))) {
        return (void *)s;
      }
      if (0x80 == (0xc0 & s[4])) {
        return (void *)s;
      }
      if ((0 == (0x07 & s[0])) && (0 == (0x30 & s[1]))) {
        return (void *)s;
      }
      s += 4;
    } else if (0xe0 == (0xf0 & *s)) {
      if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2]))) {
        return (void *)s;
      }
      if (0x80 == (0xc0 & s[3])) {
        return (void *)s;
      }
      if ((0 == (0x0f & s[0])) && (0 == (0x20 & s[1]))) {
        return (void *)s;
      }
      s += 3;
    } else if (0xc0 == (0xe0 & *s)) {
      if (0x80 != (0xc0 & s[1])) {
        return (void *)s;
      }
      if (0x80 == (0xc0 & s[2])) {
        return (void *)s;
      }
      if (0 == (0x1e & s[0])) {
        return (void *)s;
      }
      s += 2;
    } else if (0x00 == (0x80 & *s)) {
      s += 1;
    } else {
      return (void *)s;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<utf8valid>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    %ecx,%eax
je     13b9 <utf8valid+0x2b9>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf8,%ecx
mov    $0xf0,%eax
cmp    %ecx,%eax
jne    1208 <utf8valid+0x108>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    118c <utf8valid+0x8c>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    118c <utf8valid+0x8c>
mov    -0x18(%rbp),%rax
movsbl 0x3(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
je     1199 <utf8valid+0x99>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl 0x4(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    11c1 <utf8valid+0xc1>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0x7,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    11f7 <utf8valid+0xf7>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
and    $0x30,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    11f7 <utf8valid+0xf7>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    13b4 <utf8valid+0x2b4>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf0,%ecx
mov    $0xe0,%eax
cmp    %ecx,%eax
jne    12d4 <utf8valid+0x1d4>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    1258 <utf8valid+0x158>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
je     1265 <utf8valid+0x165>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl 0x3(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    128d <utf8valid+0x18d>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0xf,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    12c3 <utf8valid+0x1c3>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
and    $0x20,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    12c3 <utf8valid+0x1c3>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    13af <utf8valid+0x2af>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0xe0,%ecx
mov    $0xc0,%eax
cmp    %ecx,%eax
jne    1370 <utf8valid+0x270>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
je     1316 <utf8valid+0x216>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    133e <utf8valid+0x23e>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0x1e,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    135f <utf8valid+0x25f>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    13aa <utf8valid+0x2aa>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
and    $0x80,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    1398 <utf8valid+0x298>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    13a5 <utf8valid+0x2a5>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13c1 <utf8valid+0x2c1>
jmp    13aa <utf8valid+0x2aa>
jmp    13af <utf8valid+0x2af>
jmp    13b4 <utf8valid+0x2b4>
jmp    1110 <utf8valid+0x10>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8valid>:
mov    (%rdi),%dl
test   %dl,%dl
je     1229 <utf8valid+0x129>
mov    %rdi,%rax
jmp    1128 <utf8valid+0x28>
test   $0x80,%dl
jne    122b <utf8valid+0x12b>
movzbl 0x1(%rax),%edx
add    $0x1,%rax
test   %dl,%dl
je     1229 <utf8valid+0x129>
movzbl %dl,%edi
mov    %edi,%esi
and    $0xfffffff8,%esi
cmp    $0xf0,%esi
jne    11a0 <utf8valid+0xa0>
movzbl 0x1(%rax),%esi
mov    %esi,%ecx
and    $0xffffffc0,%ecx
cmp    $0x80,%ecx
jne    122b <utf8valid+0x12b>
movzbl 0x2(%rax),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    122b <utf8valid+0x12b>
movzbl 0x3(%rax),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    122b <utf8valid+0x12b>
movzbl 0x4(%rax),%edx
mov    %edx,%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
je     122b <utf8valid+0x12b>
and    $0x7,%edi
and    $0x30,%esi
or     %edi,%esi
je     122b <utf8valid+0x12b>
add    $0x4,%rax
jmp    1120 <utf8valid+0x20>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %edi,%ecx
and    $0xfffffff0,%ecx
cmp    $0xe0,%ecx
jne    11f0 <utf8valid+0xf0>
movzbl 0x1(%rax),%esi
mov    %esi,%ecx
and    $0xffffffc0,%ecx
cmp    $0x80,%ecx
jne    122b <utf8valid+0x12b>
movzbl 0x2(%rax),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    122b <utf8valid+0x12b>
movzbl 0x3(%rax),%edx
mov    %edx,%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
je     122b <utf8valid+0x12b>
and    $0xf,%edi
and    $0x20,%esi
or     %edi,%esi
je     122b <utf8valid+0x12b>
add    $0x3,%rax
jmp    1120 <utf8valid+0x20>
nopl   0x0(%rax,%rax,1)
mov    %edi,%ecx
and    $0xffffffe0,%ecx
cmp    $0xc0,%ecx
jne    110f <utf8valid+0xf>
movzbl 0x1(%rax),%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
jne    122b <utf8valid+0x12b>
movzbl 0x2(%rax),%edx
mov    %edx,%ecx
and    $0xc0,%cl
cmp    $0x80,%cl
je     122b <utf8valid+0x12b>
and    $0x1e,%edi
je     122b <utf8valid+0x12b>
add    $0x2,%rax
jmp    1120 <utf8valid+0x20>
xor    %eax,%eax
ret

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

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