int XConvertUtf8ToUcs(const unsigned char *buf, int len, unsigned int *ucs) {
  if (buf[0] & 0x80) {
    if (buf[0] & 0x40) {
      if (buf[0] & 0x20) {
        if (buf[0] & 0x10) {
          if (buf[0] & 0x08) {
            if (buf[0] & 0x04) {
              if (buf[0] & 0x02) {
              } else {
              }
            } else if (len > 4 && (buf[1] & 0xC0) == 0x80 &&
                       (buf[2] & 0xC0) == 0x80 && (buf[3] & 0xC0) == 0x80 &&
                       (buf[4] & 0xC0) == 0x80) {
              *ucs = ((buf[0] & ~0xF8) << 24) + ((buf[1] & ~0x80) << 18) +
                     ((buf[2] & ~0x80) << 12) + ((buf[3] & ~0x80) << 6) +
                     (buf[4] & ~0x80);
              if (*ucs > 0x001FFFFF && *ucs < 0x01000000)
                return 5;
            }
          } else if (len > 3 && (buf[1] & 0xC0) == 0x80 &&
                     (buf[2] & 0xC0) == 0x80 && (buf[3] & 0xC0) == 0x80) {
            *ucs = ((buf[0] & ~0xF0) << 18) + ((buf[1] & ~0x80) << 12) +
                   ((buf[2] & ~0x80) << 6) + (buf[3] & ~0x80);
            if (*ucs > 0x0000FFFF)
              return 4;
          }
        } else if (len > 2 && (buf[1] & 0xC0) == 0x80 &&
                   (buf[2] & 0xC0) == 0x80) {
          *ucs = ((buf[0] & ~0xE0) << 12) + ((buf[1] & ~0x80) << 6) +
                 (buf[2] & ~0x80);
          if (*ucs > 0x000007FF)
            return 3;
        }
      } else if (len > 1 && (buf[1] & 0xC0) == 0x80) {
        *ucs = ((buf[0] & ~0xC0) << 6) + (buf[1] & ~0x80);
        if (*ucs > 0x0000007F)
          return 2;
      }
    }
  } else if (len > 0) {
    *ucs = buf[0];
    return 1;
  }
  *ucs = (unsigned int)'?';
  return -1;
}


x86 assembly (clang, -O0):
<XConvertUtf8ToUcs>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     147b <XConvertUtf8ToUcs+0x37b>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1476 <XConvertUtf8ToUcs+0x376>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1407 <XConvertUtf8ToUcs+0x307>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     136b <XConvertUtf8ToUcs+0x26b>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     12a5 <XConvertUtf8ToUcs+0x1a5>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11a5 <XConvertUtf8ToUcs+0xa5>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     119b <XConvertUtf8ToUcs+0x9b>
jmp    11a0 <XConvertUtf8ToUcs+0xa0>
jmp    11a0 <XConvertUtf8ToUcs+0xa0>
jmp    12a0 <XConvertUtf8ToUcs+0x1a0>
cmpl   $0x4,-0x14(%rbp)
jle    129b <XConvertUtf8ToUcs+0x19b>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    129b <XConvertUtf8ToUcs+0x19b>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    129b <XConvertUtf8ToUcs+0x19b>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    129b <XConvertUtf8ToUcs+0x19b>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    129b <XConvertUtf8ToUcs+0x19b>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff07,%ecx
shl    $0x18,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x12,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
shl    $0xc,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x1fffff,(%rax)
jbe    1296 <XConvertUtf8ToUcs+0x196>
mov    -0x20(%rbp),%rax
cmpl   $0x1000000,(%rax)
jae    1296 <XConvertUtf8ToUcs+0x196>
movl   $0x5,-0x4(%rbp)
jmp    14b4 <XConvertUtf8ToUcs+0x3b4>
jmp    129b <XConvertUtf8ToUcs+0x19b>
jmp    12a0 <XConvertUtf8ToUcs+0x1a0>
jmp    1366 <XConvertUtf8ToUcs+0x266>
cmpl   $0x3,-0x14(%rbp)
jle    1361 <XConvertUtf8ToUcs+0x261>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1361 <XConvertUtf8ToUcs+0x261>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1361 <XConvertUtf8ToUcs+0x261>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1361 <XConvertUtf8ToUcs+0x261>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff0f,%ecx
shl    $0x12,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0xc,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0xffff,(%rax)
jbe    135c <XConvertUtf8ToUcs+0x25c>
movl   $0x4,-0x4(%rbp)
jmp    14b4 <XConvertUtf8ToUcs+0x3b4>
jmp    1361 <XConvertUtf8ToUcs+0x261>
jmp    1366 <XConvertUtf8ToUcs+0x266>
jmp    1402 <XConvertUtf8ToUcs+0x302>
cmpl   $0x2,-0x14(%rbp)
jle    13fd <XConvertUtf8ToUcs+0x2fd>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13fd <XConvertUtf8ToUcs+0x2fd>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13fd <XConvertUtf8ToUcs+0x2fd>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff1f,%ecx
shl    $0xc,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x7ff,(%rax)
jbe    13f8 <XConvertUtf8ToUcs+0x2f8>
movl   $0x3,-0x4(%rbp)
jmp    14b4 <XConvertUtf8ToUcs+0x3b4>
jmp    13fd <XConvertUtf8ToUcs+0x2fd>
jmp    1402 <XConvertUtf8ToUcs+0x302>
jmp    1471 <XConvertUtf8ToUcs+0x371>
cmpl   $0x1,-0x14(%rbp)
jle    146c <XConvertUtf8ToUcs+0x36c>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    146c <XConvertUtf8ToUcs+0x36c>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff3f,%ecx
shl    $0x6,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x7f,(%rax)
jbe    1467 <XConvertUtf8ToUcs+0x367>
movl   $0x2,-0x4(%rbp)
jmp    14b4 <XConvertUtf8ToUcs+0x3b4>
jmp    146c <XConvertUtf8ToUcs+0x36c>
jmp    1471 <XConvertUtf8ToUcs+0x371>
jmp    1476 <XConvertUtf8ToUcs+0x376>
jmp    14a3 <XConvertUtf8ToUcs+0x3a3>
cmpl   $0x0,-0x14(%rbp)
jle    149e <XConvertUtf8ToUcs+0x39e>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    14b4 <XConvertUtf8ToUcs+0x3b4>
jmp    14a3 <XConvertUtf8ToUcs+0x3a3>
mov    -0x20(%rbp),%rax
movl   $0x3f,(%rax)
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<XConvertUtf8ToUcs>:
movzbl (%rdi),%ecx
test   $0x80,%cl
jne    111a <XConvertUtf8ToUcs+0x1a>
mov    $0x1,%eax
test   %esi,%esi
jg     12f8 <XConvertUtf8ToUcs+0x1f8>
jmp    12ee <XConvertUtf8ToUcs+0x1ee>
test   $0x40,%cl
je     12ee <XConvertUtf8ToUcs+0x1ee>
test   $0x20,%cl
jne    1165 <XConvertUtf8ToUcs+0x65>
cmp    $0x2,%esi
jl     12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x1(%rdi),%esi
mov    %esi,%eax
and    $0xffffffc0,%eax
cmp    $0x80,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
and    $0x3f,%ecx
shl    $0x6,%ecx
and    $0x7f,%esi
add    %ecx,%esi
mov    %esi,(%rdx)
mov    $0x2,%eax
cmp    $0x7f,%esi
jbe    12ee <XConvertUtf8ToUcs+0x1ee>
jmp    12fa <XConvertUtf8ToUcs+0x1fa>
test   $0x10,%cl
jne    11c8 <XConvertUtf8ToUcs+0xc8>
cmp    $0x3,%esi
jl     12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x1(%rdi),%eax
mov    %eax,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x2(%rdi),%esi
mov    %esi,%edi
and    $0xffffffc0,%edi
cmp    $0x80,%edi
jne    12ee <XConvertUtf8ToUcs+0x1ee>
and    $0x1f,%ecx
shl    $0xc,%ecx
and    $0x7f,%eax
shl    $0x6,%eax
add    %ecx,%eax
and    $0x7f,%esi
add    %eax,%esi
mov    %esi,(%rdx)
mov    $0x3,%eax
cmp    $0x7ff,%esi
jbe    12ee <XConvertUtf8ToUcs+0x1ee>
jmp    12fa <XConvertUtf8ToUcs+0x1fa>
test   $0x8,%cl
jne    1252 <XConvertUtf8ToUcs+0x152>
cmp    $0x4,%esi
jl     12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x1(%rdi),%eax
mov    %eax,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x2(%rdi),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x3(%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    12ee <XConvertUtf8ToUcs+0x1ee>
and    $0xf,%ecx
shl    $0x12,%ecx
and    $0x7f,%eax
shl    $0xc,%eax
add    %ecx,%eax
and    $0x7f,%r8d
shl    $0x6,%r8d
add    %eax,%r8d
and    $0x7f,%edi
add    %r8d,%edi
mov    %edi,(%rdx)
mov    $0x4,%eax
cmp    $0xffff,%edi
jbe    12ee <XConvertUtf8ToUcs+0x1ee>
jmp    12fa <XConvertUtf8ToUcs+0x1fa>
cmp    $0x5,%esi
jl     12ee <XConvertUtf8ToUcs+0x1ee>
mov    %ecx,%eax
and    $0x4,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x1(%rdi),%esi
mov    %esi,%eax
and    $0xffffffc0,%eax
cmp    $0x80,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x2(%rdi),%r9d
mov    %r9d,%eax
and    $0xffffffc0,%eax
cmp    $0x80,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x3(%rdi),%r8d
mov    %r8d,%eax
and    $0xffffffc0,%eax
cmp    $0x80,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
movzbl 0x4(%rdi),%edi
mov    %edi,%eax
and    $0xffffffc0,%eax
cmp    $0x80,%eax
jne    12ee <XConvertUtf8ToUcs+0x1ee>
and    $0x7,%ecx
shl    $0x18,%ecx
and    $0x7f,%esi
shl    $0x12,%esi
add    %ecx,%esi
and    $0x7f,%r9d
shl    $0xc,%r9d
add    %esi,%r9d
and    $0x7f,%r8d
shl    $0x6,%r8d
add    %r9d,%r8d
and    $0x7f,%edi
lea    (%r8,%rdi,1),%eax
mov    %eax,(%rdx)
lea    (%rdi,%r8,1),%ecx
add    $0xffe00000,%ecx
mov    $0x5,%eax
cmp    $0xe00000,%ecx
jb     12fa <XConvertUtf8ToUcs+0x1fa>
mov    $0xffffffff,%eax
mov    $0x3f,%ecx
mov    %ecx,(%rdx)
ret

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

LLVM IR (-O2):
define i32 @XConvertUtf8ToUcs(i8* nocapture %0, i32 %1, i32* nocapture writeonly %2) {
%4 = load i8, i8* %0
%5 = zext i8 %4 to i32
%6 = and i32 %5, 128
%7 = icmp eq i32 %6, 0
br i1 %7, label %134, label %8
8: ; preds = %3
%9 = and i32 %5, 64
%10 = icmp eq i32 %9, 0
br i1 %10, label %136, label %11
11: ; preds = %8
%12 = and i32 %5, 32
%13 = icmp eq i32 %12, 0
br i1 %13, label %120, label %14
14: ; preds = %11
%15 = and i32 %5, 16
%16 = icmp eq i32 %15, 0
br i1 %16, label %97, label %17
17: ; preds = %14
%18 = and i32 %5, 8
%19 = icmp eq i32 %18, 0
br i1 %19, label %65, label %20
20: ; preds = %17
%21 = and i32 %5, 4
%22 = icmp eq i32 %21, 0
%23 = icmp sgt i32 %1, 4
%24 = and i1 %23, %22
br i1 %24, label %25, label %136
25: ; preds = %20
%26 = getelementptr inbounds i8, i8* %0, i64 1
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = and i32 %28, 192
%30 = icmp eq i32 %29, 128
br i1 %30, label %31, label %136
31: ; preds = %25
%32 = getelementptr inbounds i8, i8* %0, i64 2
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = and i32 %34, 192
%36 = icmp eq i32 %35, 128
br i1 %36, label %37, label %136
37: ; preds = %31
%38 = getelementptr inbounds i8, i8* %0, i64 3
%39 = load i8, i8* %38
%40 = zext i8 %39 to i32
%41 = and i32 %40, 192
%42 = icmp eq i32 %41, 128
br i1 %42, label %43, label %136
43: ; preds = %37
%44 = getelementptr inbounds i8, i8* %0, i64 4
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = and i32 %46, 192
%48 = icmp eq i32 %47, 128
br i1 %48, label %49, label %136
49: ; preds = %43
%50 = shl nuw i32 %5, 24
%51 = and i32 %50, 117440512
%52 = shl nuw nsw i32 %28, 18
%53 = and i32 %52, 33292288
%54 = add nuw nsw i32 %53, %51
%55 = shl nuw nsw i32 %34, 12
%56 = and i32 %55, 520192
%57 = add nuw nsw i32 %54, %56
%58 = shl nuw nsw i32 %40, 6
%59 = and i32 %58, 8128
%60 = add nuw nsw i32 %57, %59
%61 = and i32 %46, 127
%62 = add nuw nsw i32 %60, %61
store i32 %62, i32* %2
%63 = add nsw i32 %62, -2097152
%64 = icmp ult i32 %63, 14680064
br i1 %64, label %140, label %136
65: ; preds = %17
%66 = icmp sgt i32 %1, 3
br i1 %66, label %67, label %136
67: ; preds = %65
%68 = getelementptr inbounds i8, i8* %0, i64 1
%69 = load i8, i8* %68
%70 = zext i8 %69 to i32
%71 = and i32 %70, 192
%72 = icmp eq i32 %71, 128
br i1 %72, label %73, label %136
73: ; preds = %67
%74 = getelementptr inbounds i8, i8* %0, i64 2
%75 = load i8, i8* %74
%76 = zext i8 %75 to i32
%77 = and i32 %76, 192
%78 = icmp eq i32 %77, 128
br i1 %78, label %79, label %136
79: ; preds = %73
%80 = getelementptr inbounds i8, i8* %0, i64 3
%81 = load i8, i8* %80
%82 = zext i8 %81 to i32
%83 = and i32 %82, 192
%84 = icmp eq i32 %83, 128
br i1 %84, label %85, label %136
85: ; preds = %79
%86 = shl nuw nsw i32 %5, 18
%87 = and i32 %86, 3932160
%88 = shl nuw nsw i32 %70, 12
%89 = and i32 %88, 520192
%90 = add nuw nsw i32 %89, %87
%91 = shl nuw nsw i32 %76, 6
%92 = and i32 %91, 8128
%93 = add nuw nsw i32 %90, %92
%94 = and i32 %82, 127
%95 = add nuw nsw i32 %93, %94
store i32 %95, i32* %2
%96 = icmp ugt i32 %95, 65535
br i1 %96, label %140, label %136
97: ; preds = %14
%98 = icmp sgt i32 %1, 2
br i1 %98, label %99, label %136
99: ; preds = %97
%100 = getelementptr inbounds i8, i8* %0, i64 1
%101 = load i8, i8* %100
%102 = zext i8 %101 to i32
%103 = and i32 %102, 192
%104 = icmp eq i32 %103, 128
br i1 %104, label %105, label %136
105: ; preds = %99
%106 = getelementptr inbounds i8, i8* %0, i64 2
%107 = load i8, i8* %106
%108 = zext i8 %107 to i32
%109 = and i32 %108, 192
%110 = icmp eq i32 %109, 128
br i1 %110, label %111, label %136
111: ; preds = %105
%112 = shl nuw nsw i32 %5, 12
%113 = and i32 %112, 126976
%114 = shl nuw nsw i32 %102, 6
%115 = and i32 %114, 8128
%116 = add nuw nsw i32 %115, %113
%117 = and i32 %108, 127
%118 = add nuw nsw i32 %116, %117
store i32 %118, i32* %2
%119 = icmp ugt i32 %118, 2047
br i1 %119, label %140, label %136
120: ; preds = %11
%121 = icmp sgt i32 %1, 1
br i1 %121, label %122, label %136
122: ; preds = %120
%123 = getelementptr inbounds i8, i8* %0, i64 1
%124 = load i8, i8* %123
%125 = zext i8 %124 to i32
%126 = and i32 %125, 192
%127 = icmp eq i32 %126, 128
br i1 %127, label %128, label %136
128: ; preds = %122
%129 = shl nuw nsw i32 %5, 6
%130 = and i32 %129, 4032
%131 = and i32 %125, 127
%132 = add nuw nsw i32 %131, %130
store i32 %132, i32* %2
%133 = icmp ugt i32 %132, 127
br i1 %133, label %140, label %136
134: ; preds = %3
%135 = icmp sgt i32 %1, 0
br i1 %135, label %137, label %136
136: ; preds = %134, %8, %120, %122, %128, %65, %67, %73, %79, %85, %20, %49, %43, %37, %31, %25, %111, %105, %99, %97
br label %137
137: ; preds = %134, %136
%138 = phi i32 [ 63, %136 ], [ %5, %134 ]
%139 = phi i32 [ -1, %136 ], [ 1, %134 ]
store i32 %138, i32* %2
br label %140
140: ; preds = %137, %128, %111, %85, %49
%141 = phi i32 [ 5, %49 ], [ 4, %85 ], [ 3, %111 ], [ 2, %128 ], [ %139, %137 ]
ret i32 %141
}