#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 */
typedef int int64_t;

/* Variables and functions */
int toml_utf8_to_ucs(const char *orig, int len, int64_t *ret) {
  const unsigned char *buf = (const unsigned char *)orig;
  unsigned i = *buf++;
  int64_t v;
  if (0 == (i >> 7)) {
    if (len < 1)
      return -1;
    v = i;
    return *ret = v, 1;
  }
  if (0x6 == (i >> 5)) {
    if (len < 2)
      return -1;
    v = i & 0x1f;
    for (int j = 0; j < 1; j++) {
      i = *buf++;
      if (0x2 != (i >> 6))
        return -1;
      v = (v << 6) | (i & 0x3f);
    }
    return *ret = v, (const char *)buf - orig;
  }
  if (0xE == (i >> 4)) {
    if (len < 3)
      return -1;
    v = i & 0x0F;
    for (int j = 0; j < 2; j++) {
      i = *buf++;
      if (0x2 != (i >> 6))
        return -1;
      v = (v << 6) | (i & 0x3f);
    }
    return *ret = v, (const char *)buf - orig;
  }
  if (0x1E == (i >> 3)) {
    if (len < 4)
      return -1;
    v = i & 0x07;
    for (int j = 0; j < 3; j++) {
      i = *buf++;
      if (0x2 != (i >> 6))
        return -1;
      v = (v << 6) | (i & 0x3f);
    }
    return *ret = v, (const char *)buf - orig;
  }
  if (0x3E == (i >> 2)) {
    if (len < 5)
      return -1;
    v = i & 0x03;
    for (int j = 0; j < 4; j++) {
      i = *buf++;
      if (0x2 != (i >> 6))
        return -1;
      v = (v << 6) | (i & 0x3f);
    }
    return *ret = v, (const char *)buf - orig;
  }
  if (0x7e == (i >> 1)) {
    if (len < 6)
      return -1;
    v = i & 0x01;
    for (int j = 0; j < 5; j++) {
      i = *buf++;
      if (0x2 != (i >> 6))
        return -1;
      v = (v << 6) | (i & 0x3f);
    }
    return *ret = v, (const char *)buf - orig;
  }
  return -1;
}


x86 assembly (clang, -O0):
<toml_utf8_to_ucs>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x7,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    116d <toml_utf8_to_ucs+0x6d>
cmpl   $0x1,-0x14(%rbp)
jge    1152 <toml_utf8_to_ucs+0x52>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%ecx
shr    $0x5,%ecx
mov    $0x6,%eax
cmp    %ecx,%eax
jne    121f <toml_utf8_to_ucs+0x11f>
cmpl   $0x2,-0x14(%rbp)
jge    1196 <toml_utf8_to_ucs+0x96>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
and    $0x1f,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
cmpl   $0x1,-0x34(%rbp)
jge    1203 <toml_utf8_to_ucs+0x103>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x6,%ecx
mov    $0x2,%eax
cmp    %ecx,%eax
je     11e4 <toml_utf8_to_ucs+0xe4>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x30(%rbp),%eax
shl    $0x6,%eax
mov    -0x2c(%rbp),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11a6 <toml_utf8_to_ucs+0xa6>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%ecx
shr    $0x4,%ecx
mov    $0xe,%eax
cmp    %ecx,%eax
jne    12d1 <toml_utf8_to_ucs+0x1d1>
cmpl   $0x3,-0x14(%rbp)
jge    1248 <toml_utf8_to_ucs+0x148>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
and    $0xf,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x38(%rbp)
cmpl   $0x2,-0x38(%rbp)
jge    12b5 <toml_utf8_to_ucs+0x1b5>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x6,%ecx
mov    $0x2,%eax
cmp    %ecx,%eax
je     1296 <toml_utf8_to_ucs+0x196>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x30(%rbp),%eax
shl    $0x6,%eax
mov    -0x2c(%rbp),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1258 <toml_utf8_to_ucs+0x158>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%ecx
shr    $0x3,%ecx
mov    $0x1e,%eax
cmp    %ecx,%eax
jne    1383 <toml_utf8_to_ucs+0x283>
cmpl   $0x4,-0x14(%rbp)
jge    12fa <toml_utf8_to_ucs+0x1fa>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
and    $0x7,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x3,-0x3c(%rbp)
jge    1367 <toml_utf8_to_ucs+0x267>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x6,%ecx
mov    $0x2,%eax
cmp    %ecx,%eax
je     1348 <toml_utf8_to_ucs+0x248>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x30(%rbp),%eax
shl    $0x6,%eax
mov    -0x2c(%rbp),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    130a <toml_utf8_to_ucs+0x20a>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%ecx
shr    $0x2,%ecx
mov    $0x3e,%eax
cmp    %ecx,%eax
jne    1435 <toml_utf8_to_ucs+0x335>
cmpl   $0x5,-0x14(%rbp)
jge    13ac <toml_utf8_to_ucs+0x2ac>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
and    $0x3,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x40(%rbp)
cmpl   $0x4,-0x40(%rbp)
jge    1419 <toml_utf8_to_ucs+0x319>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x6,%ecx
mov    $0x2,%eax
cmp    %ecx,%eax
je     13fa <toml_utf8_to_ucs+0x2fa>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x30(%rbp),%eax
shl    $0x6,%eax
mov    -0x2c(%rbp),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    13bc <toml_utf8_to_ucs+0x2bc>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%ecx
shr    $0x1,%ecx
mov    $0x7e,%eax
cmp    %ecx,%eax
jne    14e7 <toml_utf8_to_ucs+0x3e7>
cmpl   $0x6,-0x14(%rbp)
jge    145e <toml_utf8_to_ucs+0x35e>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x2c(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x44(%rbp)
cmpl   $0x5,-0x44(%rbp)
jge    14cb <toml_utf8_to_ucs+0x3cb>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
shr    $0x6,%ecx
mov    $0x2,%eax
cmp    %ecx,%eax
je     14ac <toml_utf8_to_ucs+0x3ac>
movl   $0xffffffff,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
mov    -0x30(%rbp),%eax
shl    $0x6,%eax
mov    -0x2c(%rbp),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    146e <toml_utf8_to_ucs+0x36e>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
jmp    14ee <toml_utf8_to_ucs+0x3ee>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<toml_utf8_to_ucs>:
movzbl (%rdi),%ecx
test   %cl,%cl
js     1113 <toml_utf8_to_ucs+0x13>
mov    $0x1,%eax
test   %esi,%esi
jle    114c <toml_utf8_to_ucs+0x4c>
mov    %ecx,(%rdx)
ret
mov    %ecx,%eax
and    $0xffffffe0,%eax
cmp    $0xc0,%eax
jne    1152 <toml_utf8_to_ucs+0x52>
mov    $0xffffffff,%eax
cmp    $0x2,%esi
jl     1112 <toml_utf8_to_ucs+0x12>
movzbl 0x1(%rdi),%esi
mov    %esi,%edi
and    $0xffffffc0,%edi
cmp    $0x80,%edi
jne    1112 <toml_utf8_to_ucs+0x12>
and    $0x1f,%ecx
shl    $0x6,%ecx
and    $0x3f,%esi
or     %esi,%ecx
mov    $0x2,%eax
jmp    1110 <toml_utf8_to_ucs+0x10>
mov    $0xffffffff,%eax
ret
mov    %ecx,%eax
and    $0xfffffff0,%eax
cmp    $0xe0,%eax
jne    11ab <toml_utf8_to_ucs+0xab>
mov    $0xffffffff,%eax
cmp    $0x3,%esi
jl     1112 <toml_utf8_to_ucs+0x12>
movzbl 0x1(%rdi),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x2(%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
and    $0x3f,%r8d
and    $0xf,%ecx
shl    $0x6,%ecx
or     %r8d,%ecx
shl    $0x6,%ecx
and    $0x3f,%edi
or     %edi,%ecx
mov    $0x3,%eax
jmp    1110 <toml_utf8_to_ucs+0x10>
mov    %ecx,%eax
and    $0xfffffff8,%eax
cmp    $0xf0,%eax
jne    1233 <toml_utf8_to_ucs+0x133>
mov    $0xffffffff,%eax
cmp    $0x4,%esi
jl     1112 <toml_utf8_to_ucs+0x12>
movzbl 0x1(%rdi),%r9d
mov    %r9d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x2(%rdi),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x3(%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
and    $0x3f,%r9d
and    $0x7,%ecx
shl    $0x6,%ecx
or     %r9d,%ecx
shl    $0xc,%ecx
and    $0x3f,%r8d
shl    $0x6,%r8d
or     %ecx,%r8d
and    $0x3f,%edi
or     %r8d,%edi
mov    $0x4,%eax
jmp    13ad <toml_utf8_to_ucs+0x2ad>
mov    %ecx,%eax
and    $0xfffffffc,%eax
cmp    $0xf8,%eax
jne    12e1 <toml_utf8_to_ucs+0x1e1>
mov    $0xffffffff,%eax
cmp    $0x5,%esi
jl     1112 <toml_utf8_to_ucs+0x12>
movzbl 0x1(%rdi),%r10d
mov    %r10d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x2(%rdi),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x3(%rdi),%r9d
mov    %r9d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x4(%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
and    $0x3f,%r9d
and    $0x3f,%r10d
shl    $0x6,%ecx
movzbl %cl,%eax
or     %r10d,%eax
shl    $0xc,%eax
and    $0x3f,%r8d
shl    $0x6,%r8d
or     %eax,%r8d
or     %r9d,%r8d
shl    $0x6,%r8d
and    $0x3f,%edi
or     %r8d,%edi
mov    $0x5,%eax
jmp    13ad <toml_utf8_to_ucs+0x2ad>
mov    $0xffffffff,%eax
cmp    $0x6,%esi
jl     1112 <toml_utf8_to_ucs+0x12>
mov    %ecx,%esi
and    $0xfffffffe,%esi
cmp    $0xfc,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x1(%rdi),%r11d
mov    %r11d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x2(%rdi),%r9d
mov    %r9d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x3(%rdi),%r10d
mov    %r10d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x4(%rdi),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
movzbl 0x5(%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1112 <toml_utf8_to_ucs+0x12>
and    $0x3f,%r10d
and    $0x3f,%r11d
shl    $0x6,%ecx
and    $0x40,%ecx
or     %r11d,%ecx
shl    $0xc,%ecx
and    $0x3f,%r9d
shl    $0x6,%r9d
or     %ecx,%r9d
or     %r10d,%r9d
shl    $0xc,%r9d
and    $0x3f,%r8d
shl    $0x6,%r8d
or     %r9d,%r8d
and    $0x3f,%edi
or     %r8d,%edi
mov    $0x6,%eax
mov    %edi,%ecx
jmp    1110 <toml_utf8_to_ucs+0x10>

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

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